分支简介
使用 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 fetch origin 同步远程服务器上的数据到本地。会把 origin/master 的指针移到它最新的位置上:
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