神刀安全网

实用源代码管理「SVN & Git」持续更新


Write in the first【写在最前】


开发过程中离不开源代码的管理,
目地:为了解决在软件开发过程中,由源代码引发的各种蛋疼、繁琐的问题。

目前开发使用较广的 版本控制系统「Git & SVN」,后续会单开一篇总结正在使用的【强大的 Git 客户端:SourceTree】。

本篇文章主要从使用者角度【Git & SVN 详解使用】学习总结。
时间有限,知识并未全覆盖,有遗漏或者错误,忘指正。

实用源代码管理「SVN & Git」持续更新

@–>Git

目录:

  1. 源代码管理认知
  2. 源代码管理 SVN 详解使用
  3. SVN 基础知识概念
    2.SVN 客户端实用命令
    3.SVN 客户端实用示例
    4.「SVN–>branch & tag」分支和标签
    5.SVN ST 显示的文件状态
  4. 源代码管理 Git 详解使用
    1.Git基础知识概念
    2.Git 几个核心概念
    3.Git 工作原理 / 流程
    4.Git 客户端实用命令
    5.「Git–>branch & tag & remote」分支、标签和远程
    6.Git 客户端实用示例
  5. SVN & Git 两者比较

源代码管理认知


下面简单几点总结,来给初学者快速对源代码管理有个认知;

为什么会出现源代码管理工具 ?
  • 为了解决在软件开发过程中,由源代码引发的各种蛋疼、繁琐的问题。
源代码会引发哪些问题 ?
  • 无法后悔:做错了一个操作后,某些情况下无法返回,没有后悔药可以吃。

  • 版本备份:费空间、费时间。

  • 版本混乱:因版本备份过多造成混乱,难于找回正确的想要的版本。

  • 代码冲突:多人操作同一个文件(团队开发中的常见问题)。

  • 权限控制:无法对源代码进行精确的权限控制。

  • 追究责任:出现了严重的 BUG,无法定位到负责人,容易耍赖。

源代码管理工具的作用是 ?
  • 能追踪一个项目从诞生一直到定案的过程。
  • 记录一个项目的所有内容变化。
  • 方便地查阅特定版本的修订情况。
温馨提示:
  • 如果是团队开发,使用源代码管理工具是强制性的!

  • 如果是单人开发,也强烈建议现在就开始使用源代码管理工具。

源代码管理 SVN 详解使用


基础知识概念

  • SVN是集中式控制系统,需要一个中央服务器。

  • Repository 代码仓库,保存代码的仓库。

  • Server 服务器,保存所有版本的代码仓库。

  • Client 客户端,只保存当前用户的代码仓库。

  • 用户名&密码 访问代码仓库需要使用自己的 “用户名和密码”,从而可以区分出不同的人对代码做的修改。

SVN 客户端实用命令

  • svn checkout「简写svn co」:将服务器上最新的代码仓库下载到本地(只需要做一次)。

  • svn update「简写svn up」:从服务器上将其他人所做的修改下载到本地 (每天上班必须要做的事情)。

  • svn commit「简写svn ci」:将改动的文件提交到服务器(每天下班之前至少做一次)。


  • svn add:向本地的版本控制库中添加新文件。

  • svn delete、svn remove「简写svn del、svn rm」:从本地的版本控制库中删除文件。

  • svn move:移动文件或者目录或文件更名

  • svn mkdir:创建纳入版本控制下的新目录

  • svn revert:撤销之前的一切修改

  • svn merge:将两个版本之间的差异合并到当前文件


  • svn info:查看文件的详细信息。

  • svn diff:查看不同版本的区别。

  • svn log:查看日志信息。

  • svn list:列出版本库下的文件和目录列表。

  • svn status「简写svn st」:查看文件状态。

  • svn help:获取帮助信息(比如 svn help ci)。

  • svn lock:加锁。

  • svn unlock:解锁。

SVN 客户端实用示例

检出

  • 去到公司的第一天,将项目检出(下载)至本地。
    svn checkout URL[PATH]
    svn co URL[PATH]

注意

  • 这里的中括号[ ]代表可选(可以省略)。

  • URL:代码仓库的远程地址。

  • [PATH]:将代码下载到本地的哪个路径(如果省略本地的路径,就下载到命令行当前所在的路径)。


提交

  • 将改动过的旧文件提交至服务器。
    svn commit-m "注释"[PATH]
    svn ci-m "注释"[PATH]

注意

  • 一定要养成写注释的良好习惯。

  • “注释”:”修改了User.m文件”。

  • [PATH]:代表是 提交哪个文件到服务器(如果省略路径,就将命令行所在路径中所有改动过的文件提交到服务器)。


添加

  • 提交一个新建的文件到服务器,需要2个步骤。

  • 添加新建的文件到本地的版本控制库中:svn add

  • 提交刚才的添加操作到服务器:svn commit

  • 将文件添加到本地的版本控制库。
    svn add PATH

  • PATH:代表是 添加哪个文件到版本控制库中。


删除

  • 删除服务器上的某个旧文件,需要做2个步骤。

  • 将文件从本地的版本控制库中移除:svn delete、svn remove

  • 提交刚才的删除操作到服务器:svn commit

  • 将文件从本地的版本控制库中移除。
    svn delete PATH

  • PATH:代表是 将哪个文件从版本控制库中移除。


更新

  • 将服务器上其他同事提交的,最新代码更新到本地。
    svn update [PATH]

  • PATH:代表是 更新哪个文件的内容(如果省略路径,就更新命令行所在路径的所有内容)。


回滚

  • 改动没有被提交。
    这种情况下,使用svn revert就能取消之前的修改。当为单个文件时,直接svn revert 文件就行了;当为目录时,需要加上参数-r (Recursive,递归),否则只会将改文件这个目录的改动。

  • 改动已经被提交。
    这种情况下,用svn merge命令来进行回滚。先运行svn up保证拿到最新的版本,然后svn log查看并找到要回滚的版本号,如果想要更详细的了解情况,可以使用svn diff -r HEAD:2500 [文件](回滚到版本号2500),此处的 [ ] 可以是文件、目录或整个项目。

「SVN–>branch & tag」分支和标签


SVN 官方推荐在一个版本库的根目录下先建立trunkbranchestags这三个文件夹,其中 trunk 是开发主干,存放日常开发的内容;branches 存放各分支的内容,比如为不同客户定制的不同版本;tags 存放某个版本状态的标签。
branhcestags本质没有区别,都是通过svn copy方式建立的,差异在于通常branches中的内容是需要继续修改或开发的,tags中的内容是存放不再修改的,这一般通过权限设置来解决,tags通常只给管理员开放写权限。

1.新建分支 svn copy master_repository_url branch_repository_url -m "your comments"  2.新建空白分支 svn mkdir branch_repository_url  3.删除分支 svn rm branch_repository_url -m "your comments"  4.新建tag svn copy master_repository_url tag_repository_url -m "your comments"  5.删除tag svn rm tag_repository_url -m "your comments"  6.查看branches svn ls ^/branches --verbose

分支与主干的合并:

# 分支合到主干 cd trunk svn merge -r <revision where branch was cut>:<revision of trunk> svn://branch/path  # 分支当前版本为4847,想把4825到4847间的改动merge到主干 # cd trunk svn merge -r 4825:4847 svn://branch/path svn ci -m "merge branch changes r4835:4847 into trunk"  # 主干合到分支 cd branch # 在r23创建了一个分支,trunk版本号更新到了25,想把23-25之间的改动merge到分支 svn merge -r 23:25 svn://trunk/path svn ci -m "merge trunk changes r23:25 into my branch"  # cd trunk # 查看当前Branch中已经有那些改动已经被合并到Trunk中 svn mergeinfo svn://branch/path  # cd trunk # 查看Branch中那些改动还未合并 svn merginfo svn://branch/path --show-revs eligible

merge分支B到分支A

step1: Checkout URL A        # cd branch A step2: merge URL B to your working copy of A        svn merge -r 10:HEAD http://branch-b . step3: Commit A

冲突提示

(p) postpone          暂时推后处理,我可能要和那个和我冲突的家伙商量一番 (df) diff-full        把所有的修改列出来,比比看 (e) edit              直接编辑冲突的文件 (mc) mine-conflict    如果你很有自信可以只用你的修改,把别人的修改干掉 (tc) theirs-conflict  底气不足,还是用别人修改的吧 (s) show all options  显示其他可用的命令

SVN ST 显示的文件状态


  • ' ' 没有修改。

  • A 被添加到本地代码仓库。

  • C 冲突。

  • D 被删除。

  • I 被忽略。

  • M 被修改。

  • R 被替换。

  • X 外部定义创建的版本目录。

  • ? 文件没有被添加到本地版本库内。

  • ! 文件丢失或者不完整(不是通过svn命令删除的文件)。

  • ~ 受控文件被其他文件阻隔。

  • U 服务器收到文件更新了

  • G 本地文件以及服务器文件都已更新,而且成功的合并了

实用源代码管理「SVN &amp; Git」持续更新

SVN–>脑图


源代码管理 Git 详解使用


基础知识概念

  • git是一款开源的分布式版本控制工具。

  • 在世界上所有的分布式版本控制工具中,git是最快、最简单、最流行的。

  • 作者是Linux之父:Linus Benedict Torvalds。

  • 当初开发git仅仅是为了辅助Linux内核的开发(管理源代码)。

Git 几个核心概念

  • 工作区(Working Directory):仓库文件夹里除.git目录以外的内容。

  • 版本库(Repository):.git目录,用于存储记录版本信息。

  • 暂存区(stage

  • 分支(master):git自动创建的第一个分支。

  • HEAD指针:用于指向当前分支。

Git 工作原理 / 流程


实用源代码管理「SVN &amp; Git」持续更新

 Git工作原理

  • git add:将工作区文件修改添加到暂存区。

  • git commit:将暂存区的所有内容提交到当前分支(提交区)。

  • git push:将提交区内容 推送到服务器上。

  • git pull:从服务器上更新文件。

实用源代码管理「SVN &amp; Git」持续更新

 Git工作流程

Git 客户端实用命令

  • 1.git clone:从服务器上克隆(下载)最新的代码到本地。

  • 2.git init:初始化本地仓库(在当前目录新建代码库),也可以 git init Desktop/GitCode(在指定位置创建代码库) ,如果使用了git clone不用使用此命令。

  • 3.git config:配置用户名和邮箱。

    git config --global user.name "GO_ln" git config --global user.email "xxx @xx.com"
  • 4.add:将工作区的文件提交到暂存区。

    // 添加指定文件 git add GitTest/GitTest/ViewController.m // 添加本地库所有文件 git add .
  • 5.git commit:提交信息。

1.git commit -m 将暂存区的内容提交到提交区 // 提交所有 git commit -m "日志" // 提交某一个文件 git commit GitTest/GitTest/ViewController.m -m"修改VC"  2.把工作区中的内容提交到暂存区并从暂存区中提交到提交区 git commit -am “提交信息”
  • 6.git status:查看当前 git 的状态。

  • 7.git push:将提交区内容 推送到服务器上。

  • 8.checkout:撤销某次提交的某个文件。

    git checkout 8989920311bacb3f4e3ced7f82ab75ca47c318c7 GitTest/GitTest/ViewController.m
  • 9.revert:撤销某一次提交。

    git revert 8989920311bacb3f4e3ced7f82ab75ca47c318c7
  • 10.checkout HEAD:放弃本地某一文件的修改。

    git checkout HEAD GitTest/GitTest/ViewController.m
  • 11.git reset:回退到某个版本并保存未追踪的改动。(通过log来查询)

    git reset 8989920311bacb3f4e3ced7f82ab75ca47c318c7
  • 12.git reset --hard HEAD:放弃本地全部修改。

  • 13.git reset --keep:回退到某个版本并保存未提交的改动。

    git reset --keep 8989920311bacb3f4e3ced7f82ab75ca47c318c7
  • 14.log:查看提交日志。

  • 15.git show:查看每次提交的具体内容。

  • 16.diff:查看追踪文件的差异。

    // 查看追踪文件的差异 git diff // 查看某一文件的差异 git diff GitTest/GitTest/ViewController.m
  • 17.rm:删除文件。

    git rm GitTest/GitTest/ViewController.m
  • 18.mv:修改某一个文件的名字。

    // 注意,路径要对应,否则会自动移动 git mv GitTest/GitTest/ViewController.m GitTest/GitTest/View.m
  • 19.blame:查看文件被谁修改。

    git blame GitTest/GitTest/ViewController.m

「Git–>branch & tag & remote」分支、标签和远程


  • branch:分支。

    // 查看本地分支 git branch // 查看远程分支 git branch -r // 查看远程和本地分支 git branch -a // 创建本地分支,但是不切换 git branch branch1 // 新建一个分支并切换 git checkout -b branch2 // 新建一个分支,指向指定commit git branch branch3 8989920311bacb3f4e3ced7f82ab75ca47c318c7 // 新建一个分支,与指定的远程分支建立追踪关系 git branch --track branch4 origin/master // 切换到指定分支,并更新工作区 git checkout branch4 // 切换到上一个分支 git checkout - // 建立追踪关系,在现有分支与指定的远程分支之间 git branch --set-upstream branch3 origin/master // 合并指定分支到当前分支 git merge branch2 // 选择一个commit,合并进当前分支 git cherry-pick 8989920311bacb3f4e3ced7f82ab75ca47c318c7 // 删除分支 git branch -d branch1 // 删除远程分支 git push origin --delete branch1 git branch -dr branch1 // 将当前分支push到指定远程分支 git push origin HEAD:branch1
  • tag:标签。

    // 列出所有tag git tag // 新建一个tag在当前commit git tag 1 // 新建一个tag在指定commit git tag 2 8989920311bacb3f4e3ced7f82ab75ca47c318c7 // 删除本地tag git tag -d 1 // 查看tag信息 git show 2 // 提交所有tag git push --tags // 删除远程tag git push origin --delete tag 2 // 新建一个分支,指向某个tag git checkout -b [branch] [tag]
  • remote:远程。

    // 查看远程库的地址列表 git remote -v // 查看这个远程库的信息 git remote show origin // 从远程库更新所有的信息到本地,但是不合并 git fetch origin // 从远程库更新所有的信息到本地,但是不合并并清理已删除的远程分支 git fetch -p origin // 从远程库更新数据并立即合并数据 git pull origin branch1 // 将本地数据同步到远程库中 git push origin  branch1

Git 客户端实用示例


1、示例:将本地代码提交到 GitHub 上。
前期准备:

实用源代码管理「SVN &amp; Git」持续更新

GitHub 创建仓库

实用源代码管理「SVN &amp; Git」持续更新

GitHub 创建仓库信息填写

实用源代码管理「SVN &amp; Git」持续更新

GitHub 仓库的URL

  • cd Desktop/git(桌面文件夹)

  • git clone https://github.com/CustomPBWaters/liunDemo.git(仓库的URL)

  • cd liunDemo(github上建的文件夹) 把要上传的Demo放到建的桌面 git 文件夹里。

  • ls -a 会提示下步操作。

  • git commit -am CoreDataDemo,这里的CoreDataDemo是我本地的Demo。

    git add CoreDataDemo   把工作区的内容提交到暂存区 git commit -m CoreDataDemo  把暂存区中的内容提交到提交区
  • git status 查看提交状态。

  • 这时第一次提交,会让输入GitHub用户名密码。

  • git push 将文件推送到服务器上。

  • 注意:要传得Demo项目中,有的含隐藏文件.git,需要删除 rm -rf .git,再上传就可以了。

2、示例:解决冲突(手动解决)。
打开冲突文件,删除<<<<<<< HEAD ======= >>>>>>> branch1这三行
再修改成想要的,添加,提交即可。

实用源代码管理「SVN &amp; Git」持续更新

解决冲突(手动解决)

实用源代码管理「SVN &amp; Git」持续更新

Git–>脑图.png

SVN & Git 两者比较


SVN & Git特点
结构(最主要的区别)
SVN是集中式管理,Git是分布式管理
速度
在很多情况下,git的速度远远比SVN快
难度
SVN功能简单,指令简单,入门容易。Git功能完善,指令复杂,入门简单掌握难
其他
SVN使用分支比较笨拙,git可以轻松拥有无限个分支
SVN必须联网才能正常工作,git支持本地版本控制工作
旧版本的SVN会在每一个目录置放一个.svn,git只会在根目录拥有一个.git

补充
集中式版本控制

实用源代码管理「SVN &amp; Git」持续更新

集中式版本控制.png

实用源代码管理「SVN &amp; Git」持续更新

分布式版本控制.png

  • 在分布式下开发者可以本地提交。

  • 每个开发者机器上都有一个服务器的数据库。

  • 从稳定可靠的角度来看,分布式肯定是更好的选择。

总结


  • 这两个版本控制一直持续到现在,两者都有其优点和缺点。

  • 个人认为两者没有绝对的优势,能够取代另一方。

  • 但是从功能上来讲,Git 拥有SVN大致所有的功能,还拥有更多可靠,便捷,个性化的指令方便操作。

  • 就剩最后一句话了,没错,想要复杂的功能,就要承受学习的代价。

Write in the last【写在最后】


明天的你,

一定会感谢今天拼命努力的自己!


实用源代码管理「SVN &amp; Git」持续更新

可敢拿我 ~ 做桌面,提神^_^.

期待


  • 如果在阅读过程中遇到 error,希望你能 Issues 我,谢谢。

  • 如果你想为【本文相关】分享点什么,也希望你能 Issues 我,我非常想为这篇文章增加更多实用的内容,谢谢。

  • 「博客原文」,对本文我会【不定时、持续更新、一些 学习心得与文章、实用才是硬道理】^_^.

Subsequent【后续】


【我也是对所花费时间的一个总结】
学习总结–>
一劳永逸–>

我只是个【有思想的代码搬运工】加上【自己的学习总结】写出来的文章。

如果「你喜欢 或 有帮助」,可否点个 Star

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 实用源代码管理「SVN & Git」持续更新

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址