GIT:为什么我在使用rebase时需要解决两次合并冲突?

时间:2015-02-09 17:08:18

标签: git git-branch

我非常喜欢git pull --rebase选项,但是当它与合并冲突结合使用时,我最终会解决两次冲突。我曾尝试使用git pull --rebase=preserve,这也应该考虑合并。

请尝试查看以下示例:

# do a new clone "a"
$ mkdir origin && cd origin && git init --bare --shared && cd ..
$ git clone ./origin a && cd a

# Add, commit, push
a (master) $ echo "foo" > foo && git add foo && git commit -m "foo"
a (master) $ git push origin master

# Create branch "b"
a (master) $ git branch b

# change foo and push
a (master) $ echo "// eof " >> foo && git ci -am "eof - master"
a (master) $ git push origin master

# checkout branch "b", change and push
a (master) $ git checkout b
a (b) $ echo "// EOF " >> foo && git ci -am "EOF b" && git push origin b

# back to master
a (b) $ git checkout master

# merge
a (master) $ git merge b # conflict as expected
a (master) $ git diff
diff --cc foo
index e10b853,1d3cc50..0000000
--- a/foo
+++ b/foo
@@@ -1,2 -1,2 +1,6 @@@
  foo
++<<<<<<< HEAD
 +// eof
++=======
+ // EOF
++>>>>>>> b

# Now, resolve the conflict
a (master|MERGING) $ echo "foo" > foo && echo "// eof" >> foo && git add foo
a (master|MERGING) $ git commit

# In the mean while somewhere else. ############################################
a (master) $ cd ..  && git clone ./origin other && cd other/
other (master) $ echo "bar" > bar && git add bar && git ci -am "bar" && git push # OK

# Back to us ###################################################################
other (master) $ cd ../a
a (master) $ git push # will fail...

# I now do a rebase preserve as I want to rebase my merge commit to the top of master
a (master) $ git pull --rebase=preserve # This command does not do a very good job...
a (master|REBASE-i 1/1) $ git diff
diff --cc foo
index e10b853,1d3cc50..0000000
--- a/foo
+++ b/foo
@@@ -1,2 -1,2 +1,6 @@@
  foo
++<<<<<<< HEAD
 +// eof
++=======
+ // EOF
++>>>>>>> 3cd5d3ac5b870c613233f0a9f1a81df5691ccc7c

如果我用git pull --rebase=preserve替换git pull --no-rebase,那么它按预期工作(我只需要解决冲突一次),但是我必须在我的日志中查看所有这些合并提交。

我怎样才能制作git&#34; rebase&#34;合并和冲突解决方案,使其适合新的远程HEAD?

2 个答案:

答案 0 :(得分:5)

我发现Git&#34; rerere&#34;功能解决了我的问题。

记录在:git rerere --helphttp://git-scm.com/docs/git-rerere

将此添加到我的.gitconfig

[rerere]
    enabled = true

解决了我的问题。

答案 1 :(得分:0)

Rebase基本上只需在HEADbase之间进行提交,然后在base上按顺序应用它们。这意味着如果你们之间有一些合并,他们就会丢失,你必须再次解决冲突。插图:

假设您有以下树:

A--B---M
 \    / 
  `-C'

M合并了有冲突的变更BC,它是您的HEAD。现在,如果你运行git rebase A,那么git将尝试创建以下树:

A-B-C

但是当尝试将C应用到B时,会遇到冲突。忽略合并M后,它必须要求您,用户解决它。

此时,你可以查看已经合并的M修订版git checkout M -- file/with/conflict中有问题的文件:--no-merges ,但我不知道有任何方法可以自动执行此操作(例如,rebase选项)。

说实话,我真的不明白人们不喜欢合并,我个人认为它们很有用,但如果你想要,你可以在日志{{1}}中省略它们