【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
git允许两个开发人员在任何时候合并修改,这一切并不需要一个中央仓库。一个合并会结合两个或者多个历史提交分支。尽管git支持同时合并三个、四个或者多个分支,但大多数情况下,一次合并只结合两个分支。
git中的合并,必须发生在一个版本库中,就是所要进行的合并必须在一个版本库中。
当一个分支的修改和另一个分支的修改不发生冲突的时候,git会计算合并结果,并创建一个新的提交来代表统一的状态。当分支冲突时,git并不解决冲突,冲突通常出现在对同一个文件的同一行进行修改的时候。git会把这种有争议的修改在索引中标记为未合并(unmerged),留给开发人员处理。
9.1 - 合并的例子
为了把other_branch
合并到branch
中,应该检出branch
,并把other_branch
分支合并到branch中。如下所示:
$ git checkout branch
$ git merge other_branch
9.1.1 - 没有冲突的合并
下面的例子,创建一个只有一个文件的版本库,然后创建两个分支,再把这两个分支合并在一起。
$ git init
Initialized empty Git repository in /Users/iEpac/Documents/git/merge_test/.git/
$ git config user.email 'iepac4srv@163.com'
$ git config user.name 'jEpac'
$ cat > file
Line 1 stuff
Line 2 stuff
Line 3 stuff
$ git add file
$ git commit -m "init 3 line file"
[master (root-commit) f391dda] init 3 line file
1 file changed, 3 insertions(+)
create mode 100644 file
在master分支上创建另一个提交:
$ cat > other_file
here is stuff on another file
$ git add other_file
$ git commit -m "another file"
[master 5cb5fea] another file
1 file changed, 1 insertion(+)
create mode 100644 other_file
到现在为止,版本库中已经有了两个提交的master分支,每次提交都创建了一个新文件。然后,切换到另个分支,修改第一个文件:
$ git checkout -b alternate master^
Switched to a new branch 'alternate'
$ git branch
* alternate
master
$ git show-branch
* [alternate] init 3 line file
! [master] another file
--
+ [master] another file
*+ [alternate] init 3 line file
alternate
分支是从master^分支派生来的。接下来,对文件做一些修改以便有内容来合并。
$ cat >> file
init 4 alternate stuff
$ git add file
$ git commit -m 'add alternate`s line 4'
[alternate 3985336] add alternate`s line 4
1 file changed, 1 insertion(+)
现在已经有了两个分支,master和alternate,每个分支都有不同的开发工作:
- master分支提交了file和other_file
- alternate分支对other_file做了修改
注意:git merge
是区分上下文的。
当前分支始终是目标分支
- 其他分支始终是合并到当前分支
所以,alternate
分支应该合并到mater
分支中。所以,在合并前必须要切到master分支
上。
$ git checkout master
Switched to branch 'master'
$ git show-branch
! [alternate] add alternate`s line 4
* [master] another file
--
+ [alternate] add alternate`s line 4
* [master] another file
+* [alternate^] init 3 line file
$ git status
On branch master
nothing to commit, working directory clean
$ git merge alternate
Merge made by the 'recursive' strategy.
file | 1 +
1 file changed, 1 insertion(+)
$ git ls-files
file
other_file
$ git show-branch
! [alternate] add alternate`s line 4
* [master] Merge branch 'alternate'
--
- [master] Merge branch 'alternate'
+* [alternate] add alternate`s line 4
可以使用提交图看一下:
$ git log --graph --pretty=oneline --abbrev-commit
* 37b02aa Merge branch 'alternate'
|\
| * 3985336 add alternate`s line 4
* | 5cb5fea another file
|/
* f391dda init 3 line file
- 两个分支在
f391dda
提交处分开 - 每个分支显示一个提交,
5cb5fea
和3985336
- 两个分支在
37b02aa
处合并
9.1.2 - 有冲突的合并
$ git merge alternate
自动合并 file
冲突(内容):合并冲突于 file
自动合并失败,修正冲突然后提交修正的结果
当合并出现冲突的时候, 首先要使用git diff查看文件的冲突程度
# git diff file
diff --cc file
index 39b21ea,a892d57..0000000
--- a/file
+++ b/file
@@@ -2,5 -2,5 +2,10 @@@ line 1 stuf
line 2 stuff
line 3 stuff
line 4 alternate stuff
++<<<<<<< HEAD
+line 5 stuff
+line 6 stuff
++=======
+ line 5 alternate stuff
+ line 6 alternate stuff
++>>>>>>> alternate
- <<<<和=====之间的:改变的内容
- ====和>>>>>之间的:替代的内容
这时候需要手动解决冲突, 然后git add git commit。重新提交修改过的版本。
9.2 - 处理合并冲突
有冲突的修改不能自动合并
9.2.1 - 定位冲突的文件
git会对有问题的文件进行追踪,并在索引中把他们标记为冲突的(conflicted)或者未合并(unmerged)的。使用如下命令来查看工作目录中仍然未合并的一组文件
git status
git ls-files -u
9.2.2 - 检查冲突
移除冲突标记,然后执行git add和git commit. 下面是git提供的解决冲突。
对冲突使用git diff
有冲突的文件合并后, 工作目录中的这个文件内容被修改为冲突后的合并内容,并有冲突标识.
对冲突使用git log命令
git log --merge --left-right -p
不要对有冲突标记的文件执行git add命令, 这会清除索引中的冲突并允许提交, 但是文件是错误的
9.3 - 合并策略
来源:oschina
链接:https://my.oschina.net/u/1763336/blog/751175