分支简介

使用 git branch 命令创建分支:$ git branch testing

Git 如何知道你当前在哪个分支上工作的呢?

它保存着一个名为 HEAD 的特别指针。它和Subversion、CVS 里的 HEAD 概念大不相同。在 Git 中,它是一个指向你正在工作中的本地分支的指针(将 HEAD 想象为当前分支的别名)。

运行 git branch 命令,建立了一个新的分支,如果要切换到新分支,执行:

$ git checkout testing

这样 HEAD 就指向了 testing 分支。

HEAD 在你转换分支(checkout)时指向新的分支。每次提交后 HEAD,随着分支一起向前移动。

非常有趣,现在 testing 分支向前移动了一格,而 master 分支仍然指向原先 git checkout 时所在的 commit 对象。现在我们回到 master 分支看看:

分支的新建与合并

我把要新建的分支取名为 hotfix。要新建并切换到该分支,运行 git checkout 并加上 -b 参数:

$ git checkout -b hotfix

这相当于执行下面这两条命令:

$ git branch hotfix
$ git checkout hotfix

合并分支:

$ git merge hotfix

删除分支:

$ git branch -d hotfix

遇到冲突时的分支合并

如果在不同的分支中都修改了同一个文件,Git 就无法干净地把两者合到一起。

比如,合并iss53分支:

$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

以用 git status 查阅,未解决的文件会显示unmerged(未合并):

$ git status
On branch master
You have unmerged paths.
 (fix conflicts and run "git commit")
Unmerged paths:
 (use "git add <file>..." to mark resolution)
 both modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")

这个时候打开index.html文件:

<<<<<<< HEAD
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
 please contact us at support@github.com
</div>
>>>>>>> iss53

======= 隔开的上半部分,是 HEAD(即 master 分支,在运行 merge 命令时所切换到的分支)中的内容,下半部分是在 iss53 分支中的内容。解决冲突的办法无非是二者选其一或者由你亲自整合到一起。比如你可以通过把这段内容替换为下面这样来解决:

<div id="footer">
please contact us at email.support@github.com
</div>

运行 git add 将把它们标记为已解决状态(就是保存到暂存区域)。

当你在使用分支及合并的时候,一切都是在你自己的 Git 仓库中进行的 — 完全不涉及与服务器的交互。

远程分支

远程分支(remote branch)是对远程仓库中的分支的索引。

我们用 (远程仓库名)/(分支名) 这样的形式表示远程分支。比如origin/master 分支。

Git 克隆会自动为你将此远程仓库命名为 origin,并下载其中所有的数据,建立一个指向它的 master 分支的指针,在本地命名为 origin/master。接着,Git建立一个本地 master 分支。

在本地 master 分支做了些改动,同时,其他人推送了他们的更新,那么服务器上的 master 分支就会向前推进,而与此同时,你在本地的提交历史正朝向不同方向发展。不过只要你不和服务器通讯,你的 origin/master 指针仍然保持原位不会移动。

如图:其他人调交:

git删除远程分支(git合并分支到主干冲突解决方法)(1)

你自己提交:

git删除远程分支(git合并分支到主干冲突解决方法)(2)

可以运行 git fetch origin 同步远程服务器上的数据到本地。会把 origin/master 的指针移到它最新的位置上:

git删除远程分支(git合并分支到主干冲突解决方法)(3)

fetch 操作下载代码后,你仍然无法在本地编辑该远程仓库中的分支。本地的代码并没有变,有的只是一个你无法移动的 origin/master 指针。

如果要把该远程分支的内容合并到当前分支,可以运行 git merge命令。

git pull 相当于fetch+merge命令。

从远程分支 checkout 出来的本地分支,称为 跟踪分支 (tracking branch)。在跟踪分支里输入 git push,Git 会自行推断应该向哪个服务器的哪个分支推送数据。同样, git pull 会获取所有远程索引,并把它们的数据都合并到本地分支中来。

推送本地分支

git push (远程仓库名) (分支名)。如:

$ git push origin serverfix 
或者:
$ git push origin serverfix:serverfix

删除远程分支

1、可以用非常无厘头的语法来删除它:git push [远程名] :[分支名]。如果想在服务器上删除 serverfix 分支,运行下面的命令:

$ git push origin :serverfix