Merge,Rebase,Cherry-Pick 一文解惑 (3)

d7878230bb14df5dedcdc8b18d5b37ad

再次产生的冲突的原因是,之前解决冲突时,选择了 master 的内容,也就意味着在 rebase_branch 提交的 commit add feature for origin.txt in rebase 被放弃了,而当前的 commit fixed before commit in rebase_branch 是基于丢弃的那个 commit 。

了解到产生冲突的原因,任意选择内容,保存就可以了,这里我们选择了 rebase_merge 分支上的内容。

git add . git rebase --continue

171b81b932c10ee82d8ba6e4ef829062

3. 选择将 master 和 rebase_branch 的内容合并后的结果

这里我们选择将 master 和 rebase_branch 的分支都保留下来:

2b2f63bc81bcc4c1bdcc4b0ec8ce29c2

保存当前的修改:

git add origin.txt git rebase --continue

可以看到,第二次冲突产生,原因是 rebase_branch 分支中过去的 commit 出现变更,和 rebase_branch 原有 commit 的记录不一致。

808b518eceb734cc83b4dfcb29ca1ce2

06f1b67a3971176cabd572d426624304

同样的,我们也会遇到三种情况:

A 以第一次解决冲突后的内容为准:

git add . # 这就意味着 rebase_branch 最新节点的添加的内容被舍弃,所以没有任何改变,可以直接跳过 git rebase --skip

B 以 rebase_branch 分支上的结果为准

C 保留 rebase_branch 和 之前修改后的内容:

B C 处理方法相同:

git add . # 保存我们的更改就可以了 git rebase --continue

注意有时 git rebase --continute 操作无法生效时,原因在于 rebase 会逐一应用当前分支的 commit 到目标分支(一般是 master)。像例子中演示的那样,第一次解决冲突后的内容,和第二次解决冲突后的内容一样,这时用 git rebase --skip 跳过就好了。

git cheery-pick

cherrypick_branch 分支上模拟 master 的提交操作。

d961e1d8873091c6d660a5fdd2b4c22a

使用 cherry-pick 进行合并操作

git cherry-pick eb1a8fb

出现了冲突,可以看到和 rebase 操作的合并操作刚好相反,这里是以 cherrypick_branch 的最新 commit 为准,去合并 master 的 commit.

a8e4d63b7cda803d5f9158a9132f2513

选择 master 内容,进行合并:

git add origin.txt git commit -m "fixed add feature conflict with master"

f2aff6ba9fc56c082b48bca9a2aebc03

合并 master 分支上提交的第二个 commit:

git cherry-pick 23e106b

再次出现了冲突:

74af2929f44927712747f64be5bf161a

修改后,提交就可以了:

git add origin.txt git commit -m "fixed add feature conflict with master"

76d2896770bfe43e8c008a57bcec6bfe

注意有时 git commit 操作无法生效,提示你是否提交的一个空的 commit. 原因在于修改后的冲突内容和当前分支的原有内容一样。但这样有些矛盾,取过来别人的 commit,最后却不用。解决办法是,取消 cherry-pick 这个 commit 或者提交一个空的 commit 信息。

总结

git merge 是基于两个分支上的最新内容到有冲突的内容之间的所有 commit 进行合并,之后会形成一个新的 commit 记录,将两个分支重新关联起来。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpddfg.html