Git分支原理

新建dev分支:

在dev分支上提交:

切回到master并合并dev:

团队工作流程:

(图片来自廖雪峰Git教程)

新建分支:

查看当前分支:
$ git branch

新建、切换分支:
$ git branch dev
$ git checkout dev

或者简化命令,直接新建并切换分支:

$ git checkout -b dev

以后的提交就是在dev上的,master不受影响。

合并分支:

切回master,此时代码恢复到master时状态:

$ git checkout master

将dev合并到当前分支master上:

$ git merge dev

普通模式合并

合并分支时,加上--no-ff参数就可以用普通模式合并:

$ git merge --no-ff dev

在merge时会生成一个新的commit。而默认的fast forward合并就看不出来曾经做过合并。

解决冲突

如果两个分支都提交了对同一文件的更改,合并二者将产生冲突:

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

git status查看状态如下:

1
2
3
4
5
6
7
8
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)

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

both modified: newFile.txt

冲突文件已经记录了冲突,可直接编辑:

1
2
3
4
5
6
$ vim newFile.txt 

1 <<<<<<< HEAD
2 master add
3 =======
4 dev add

修改后,即可提交成功。

这说明$ git merge命令即使遇到冲突也会发生作用,继续合并且标记了冲突,产生了新的修改。

删除分支

$ git branch -d dev

如dev含有未合并的更改,则可用-D强制删除:

git branch -D dev

暂存现场

情景:为解决master分支的一个bug,需临时从dev分支切过去。

这时如果在dev上修改了文件,但未提交,切换分支时会提示:

1
2
3
4
5
$ git co master
error: Your local changes to the following files would be overwritten by checkout:
newFile.txt
Please commit your changes or stash them before you switch branches.
Aborting

“要么提交,要么暂存,否则这些更改就会消失。”

如果还不想提交,那就先stash起来:

$ git stash

然后切换到其它分支改改改。

完事后再切回到dev,查看stash列表:

1
2
$ git stash list
stash@{0}: WIP on dev: 471716b dev`

恢复现场:

一是用git stash apply恢复,但是恢复后,还需要用git stash drop来删除stash内容;

另一种方式是用git stash pop,恢复的同时把stash内容也删了:

$ git stash pop

这样dev上未提交的更改又出现了。