Git 分支管理
几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。 有人把 Git 的分支模型称为**必杀技特性**,而正是因为它,将 **Git** 从版本控制系统家族里区分出来。
创建分支命令:
git branch (branchname)切换分支命令:
git checkout (branchname)当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。
合并分支命令:
git merge 你可以多次合并到统一分支, 也可以选择在合并之后直接删除被并入的分支。
开始前我们先创建一个测试目录:
$ mkdir gitdemo
$ cd gitdemo/
$ git init
Initialized empty Git repository...
$ touch README
$ git add README
$ git commit -m '第一次版本提交'
[master (root-commit) 3b58100] 第一次版本提交
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 READMEGit 分支管理
列出分支
列出分支基本命令:
没有参数时,git branch 会列出你在本地的分支。
此例的意思就是,我们有一个叫做 master 的分支,并且该分支是当前分支。
当你执行 git init 的时候,缺省情况下 Git 就会为你创建 master 分支。
如果我们要手动创建一个分支。执行 git branch (branchname) 即可。
现在我们可以看到,有了一个新分支 testing。
当你以此方式在上次提交更新之后创建了新分支,如果后来又有更新提交, 然后又切换到了 testing 分支,Git 将还原你的工作目录到你创建分支时候的样子。
接下来我们将演示如何切换分支,我们用 git checkout (branch) 切换到我们要修改的分支。
当我们切换到 testing 分支的时候,我们添加的新文件 test.txt 被移除了。切换回 master 分支的时候,它们有重新出现了。
我们也可以使用 git checkout -b (branchname) 命令来创建新分支并立即切换到该分支下,从而在该分支中操作。
如你所见,我们创建了一个分支,在该分支的上移除了一些文件 test.txt,并添加了 codercto.php 文件,然后切换回我们的主分支,删除的 test.txt 文件又回来了,且新增加的 codercto.php 不存在主分支中。
使用分支将工作切分开来,从而让我们能够在不同开发环境中做事,并来回切换。
删除分支
删除分支命令:
例如我们要删除 testing 分支:
分支合并
一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支。 你可以使用以下命令将任何分支合并到当前分支中去:
以上实例中我们将 newtest 分支合并到主分支去,test.txt 文件被删除。
合并完后就可以删除分支:
删除后, 就只剩下 master 分支了:
合并冲突
合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改。
首先,我们创建一个叫做 change_site 的分支,切换过去,我们将 codercto.php 内容改为:
创建 change_site 分支:
将修改的内容提交到 change_site 分支中。 现在,假如切换回 master 分支我们可以看内容恢复到我们修改前的(空文件,没有代码),我们再次修改 codercto.php 文件。
现在这些改变已经记录到我的 "master" 分支了。接下来我们将 "change_site" 分支合并过来。
我们将前一个分支合并到 master 分支,一个合并冲突就出现了,接下来我们需要手动去修改它。
在 Git 中,我们可以用 git add 要告诉 Git 文件冲突已经解决
现在我们成功解决了合并中的冲突,并提交了结果。
Git 查看提交历史
在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用 git log 命令查看。
针对我们前一章节的操作,使用 git log 命令列出历史提交记录如下:
我们可以用 --oneline 选项来查看历史记录的简洁的版本。
这告诉我们的是,此项目的开发历史。
我们还可以用 --graph 选项,查看历史中什么时候出现了分支、合并。以下为相同的命令,开启了拓扑图选项:
现在我们可以更清楚明了地看到何时工作分叉、又何时归并。
你也可以用 --reverse 参数来逆向显示所有日志。
如果只想查找指定用户的提交日志可以使用命令:git log --author , 例如,比方说我们要找 Git 源码中 Linus 提交的部分:
如果你要指定日期,可以执行几个选项:--since 和 --before,但是你也可以用 --until 和 --after。
例如,如果我要看 Git 项目中三周前且在四月十八日之后的所有提交,我可以执行这个(我还用了 --no-merges 选项以隐藏合并提交):
更多 git log 命令可查看:http://git-scm.com/docs/git-log
Git 标签
如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。
比如说,我们想为我们的 codercto 项目发布一个"1.0"版本。 我们可以用 git tag -a v1.0 命令给最新一次提交打上(HEAD)"v1.0"的标签。
-a 选项意为"创建一个带注解的标签"。 不用 -a 选项也可以执行的,但它不会记录这标签是啥时候打的,谁打的,也不会让你添加个标签的注解。 我推荐一直创建带注解的标签。
当你执行 git tag -a 命令时,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。
现在,注意当我们执行 git log --decorate 时,我们可以看到我们的标签了:
如果我们忘了给某个提交打标签,又将它发布了,我们可以给它追加标签。
例如,假设我们发布了提交 85fc7e7(上面实例最后一行),但是那时候忘了给它打标签。 我们现在也可以:
如果我们要查看所有标签可以使用以下命令:
指定标签信息命令:
PGP签名标签命令:
Last updated