一、理论篇

首先我们要知道的是, head 指向 分支(比如 master),分支指向当前最新的提交 commit

head -> master -> commit

每次提交版本,Git 都把它们串成一条时间线,这条时间线就是一个分支。
截止到目前,只有一条时间线,在 Git 里,这个分支叫主分支,即 master 分支。
HEAD 指向的就是当前分支。


最开始:master 分支是一条线
Gitmaster 指向最新的提交,再用 HEAD 指向 master,就能确定当前分支,以及当前分支的提交点:


提交:指针就会向前移动一步
每次提交,master 分支都会向前移动一步,这样,随着你不断提交,master 分支的线也越来越长:


创建 dev 分支
例如现在创建一个 dev 分支,Git 新建了一个指针叫 dev,指向 master 相同的提交,再把 HEAD 指向 dev,就表示当前分支在 dev 上:


提交 dev 分支
你看,Git 创建一个分支很快,因为除了增加一个 dev 指针,改改 HEAD 的指向,工作区的文件都没有任何变化!
不过,从现在开始,对工作区的修改和提交就是针对 dev 分支了,比如新提交一次后,dev 指针往前移动一步,而 master 指针不变:


合并分支
假如我们在 dev 上的工作完成了,就可以把 dev 合并到 master 上。Git 怎么合并呢?
最简单的方法,就是直接把 master 指向 dev 的当前提交,就完成了合并:


删除分支
所以 Git 合并分支也很快!就改改指针,工作区内容也不变!
合并完分支后,甚至可以删除 dev 分支。
删除 dev 分支就是把 dev 指针给删掉,删掉后,我们就剩下了一条 master 分支:


二、实践篇

例子:

题目:

我们正在开发微信支付功能,但是支付宝支付出现bug需要修复。现在我们需要暂时停止微信开发,先去修复支付宝支付bug后,再回来继续开发微信支付。

实现:

在做”微信支付”时,我们创建一个 wechat 分支。 把 wechat 分支 commit,此时,master 分支内容不会变,因为分支不同。

当遇到紧急 bug 时,创建一个 AliBug 分支。 修复 bug 后,一定要把当前分支 commit,切换到 master 分支,然后把 AliBug 分支合并到 master 分支上.

再次从容切换到 wechat 分支上,接着开发”微信支付”功能,开发完毕后, 一定要把当前分支也 commit,切换到 master 分支,然后把 wechat 分支合并到master 分支上.

分支相关命令
$ git branch             # 查看分支, *号代表当前分支
$ git branch wechat      # 新建wechat分支
$ git checkout wechat    # 切换到wechat分支
$ git merge wechat       # 要先切换到master分支后,在执行这个命令,把wechat分支合并到master
$ git branch -d wechat   # 删除分支
$ git checkout -b wechat # 创建wechat分支,并立即切换到wechat分支
$ git checkout -b wechat origin/wechat # 创建wechat分支,并且拉取origin主机下的wechat分支
$ git checkout .         # 所有修改的文件,恢复成未修改时的样子.

注意:在切换到其它分支之前,记得先 add 本分支,并且 commit 本分支下的文件,否则切换到其它分支,不能隐藏当前分支新建或者修改的内容

远程先开好分支然后拉到本地
//test-branch分支到本地
git checkout -b test-branch origin/test-branch
本地先开好分支然后推送到远程
//创建并切换到分支test-branch
$  git checkout -b test-branch

//推送本地的test-branch(冒号前面的)分支到远程origin的test-branch(冒号后面的)分支(没有会自动创建)
$  git push origin test-branch:test-branch
远程分支版本回退的方法
git reflog
git reset --hard abfafd
git push -f # 强制推送到远程

三、解决合并分支冲突

如果 master 分支有新的提交,而且 dev 分支也有提交代码,可能就会导致冲突

这种情况下,Git 无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:

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

果然冲突了!Git 告诉我们,readme.txt 文件存在冲突,必须手动解决冲突后再提交。
git status也可以告诉我们冲突的文件:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

我们可以直接查看 readme.txt 的内容:

test11111...
<<<<<<< HEAD
test22222....
=======
create new branch dev..
>>>>>>> dev

Git<<<<<<<,=======,>>>>>>> 标记出不同分支的内容

修改后重新提交:

$ git add readme.txt
$ git commit -m "fixed conflicts"
[master 0a3df7g] fixed conflicts

用带参数的 git log 也可以看到分支的合并情况:

$ git log --graph --pretty=oneline --abbrev-commit
*   0f3d64a fixed conflicts
|\
| * b4309b0 create new branch dev first modify
* | 0b56936 goback master first modify
|/
* 45ae9a9 create new branch....
* 90bc1f7 test name
* c1bdf43 test commit
* 1acafa7 first modify
* 09c1bba first git

最后,删除 dev 分支:

$ git branch -d dev
Deleted branch dev (was b3408b0).