git rebase奇怪的冲突,有意想不到的内容

时间:2012-06-09 09:56:58

标签: git conflict rebase

我有两个分支:主人,快乐。 有一个名为'hello'的文件,我输入命令'git rebase joy',并且存在冲突,冲突内容很奇怪。

以下是详细步骤

  • 1

git checkout master

cat hello

show ==>

 Hello world
  • 2

git checkout joy

cat hello

show ==>

Hello world
one line
two line
  • 3

git checkout master

git rebase joy ==>

First, rewinding head to replay your work on top of it...
Applying: cherry-pick
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging hello
CONFLICT (content): Merge conflict in hello
Failed to merge in the changes.
Patch failed at 0001 cherry-pick

cat hello ==>

Hello world
<<<<<<< HEAD
one line
two line
=======
add one line
add 2nd line
>>>>>>> cherry- pick
然而,我希望找到的不是冲突,内容是

Hello world
one line
two line
  • 5

我的版本树在学习

后相当复杂
* <b04ea3b> 2012-06-09 [yaoyangyong]  (HEAD, joy) test rebase
* <5b595d6> 2012-06-09 [yaoyangyong]  joy clear hello
| * <eeba7d9> 2012-06-09 [yaoyangyong]  (master) clean hello
| *   <1dbc3b8> 2012-06-09 [yaoyangyong]  merge confilct
| |\  
| |/  
|/|   
| * <3cb9d88> 2012-06-09 [yaoyangyong]  modify master 1st line
* | <b1724ad> 2012-06-09 [yaoyangyong]  test merge
| *   <89a692f> 2012-06-09 [yaoyangyong]  merge from joy
| |\  
| |/  
|/|   
* | <dc96da9> 2012-06-09 [yaoyangyong]  modify second line
| *   <816f575> 2012-06-08 [yaoyangyong]  joy
| |\  
| |/  
|/|   
* | <93b5982> 2012-06-08 [yaoyangyong]  3line
| * <4400260> 2012-06-08 [yaoyangyong]  cherry-pick
* | <233d6f2> 2012-06-08 [yaoyangyong]  2nd line comment
* | <60d6edc> 2012-06-08 [yaoyangyong]  modify hello,add one line
|/  
:
* <b04ea3b> 2012-06-09 [yaoyangyong]  (HEAD, joy) test rebase
* <5b595d6> 2012-06-09 [yaoyangyong]  joy clear hello
| * <eeba7d9> 2012-06-09 [yaoyangyong]  (master) clean hello
| *   <1dbc3b8> 2012-06-09 [yaoyangyong]  merge confilct
| |\  
| |/  
|/|   
| * <3cb9d88> 2012-06-09 [yaoyangyong]  modify master 1st line
* | <b1724ad> 2012-06-09 [yaoyangyong]  test merge
| *   <89a692f> 2012-06-09 [yaoyangyong]  merge from joy
| |\  
| |/  
|/|   
* | <dc96da9> 2012-06-09 [yaoyangyong]  modify second line
| *   <816f575> 2012-06-08 [yaoyangyong]  joy
| |\  
| |/  
|/|   
* | <93b5982> 2012-06-08 [yaoyangyong]  3line
| * <4400260> 2012-06-08 [yaoyangyong]  cherry-pick
* | <233d6f2> 2012-06-08 [yaoyangyong]  2nd line comment
* | <60d6edc> 2012-06-08 [yaoyangyong]  modify hello,add one line
|/  
* <aeae413> 2012-06-08 [yaoyangyong]  add hello file
  • 6

作为一个比较,我重新创建一个干净的文件夹,其版本树非常简单,如下所示,然后我做了rebase,它是成功的。

* <0d63388> 2012-06-09 [yaoyangyong]  (joy) add two lines
* <1f9d2f4> 2012-06-09 [yaoyangyong]  (HEAD, master) add hello file

1 个答案:

答案 0 :(得分:1)

这对我来说有点奇怪。通常你不想改变主人。 rebase通常在私有分支上完成,因此在合并时它会执行快进合并。使用rebase -i进行重新定位还可以在将它们合并到公共分支(master)之前压缩并修复提交。

我会在这里看看,了解变基是什么和做什么:http://git-scm.com/book/en/Git-Branching-Rebasing

使用你的例子我会期待这样的事情:

1

git checkout master
cat hello

显示==&gt;

Hello World

2

git checkout joy
cat hello

显示==&gt;

Hello World
one line
two line

3

此时有两个提交,第一个提交存在于master和joy中,第二个提交仅存在于joy中。现在我们可以合并,但我们想确保快乐的提交将干净地应用(避免合并提交)。要做到这一点,我们将为主人带来欢乐。

仍然在欢乐分支上运作

git rebase master

或者你可以使用交互式模式,让你压缩,修复,重新排序等等

git rebase -i master

4

既然我们的欢乐分支正在寻找我们想要它并在主人身上重新定位,我们可以切换到主人并且只是进行合并以获得漂亮的历史。

git checkout master
git merge joy

5。重要

执行rebase时,这些提交的SHA-1标识符将会更改。任何基于这些提交工作的人都会因为他们的提交的父母不再存在而最终处理很多肮脏的事情。这就是你永远不会改变公共分支的原因。