GIT 分支管理,解决合并冲突
一、理论篇
首先我们要知道的是, head
指向 分支(比如 master
),分支指向当前最新的提交 commit
head -> master -> commit
每次提交版本,Git
都把它们串成一条时间线,这条时间线就是一个分支。
截止到目前,只有一条时间线,在 Git
里,这个分支叫主分支,即 master
分支。HEAD
指向的就是当前分支。
最开始:master
分支是一条线Git
用 master
指向最新的提交,再用 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后,再回来继续开发微信支付。
实现:
在做”微信支付”时,我们创建一个
commit
,此时,master
分支内容不会变,因为分支不同。当遇到紧急
bug
时,创建一个AliBug
分支。 修复bug
后,一定要把当前分支commit
,切换到master
分支,然后把AliBug
分支合并到master
分支上.再次从容切换到
commit
,切换到master
分支,然后把分支合并到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).