不能rebase分支高手

时间:2013-09-24 10:13:14

标签: git rebase

我刚刚完成了一个项目,并希望对其历史进行一些更改,以使其看起来更整洁。我已经推动了这个项目,但是还没有人把它分开或者工作,所以没有人会受到重写历史的影响。

我偶然发现了一些问题。在rebase期间,我收到一条消息,提交7aba66b无法应用。

免责声明:我知道一个SO主题不能包含多个问题,但我真的认为在这里将问题放在一个SO主题中是有道理的,因为它们是如此密切相关以至于具有所有背景多次发布的信息将是不必要的SO泛滥。更重要的是,我认为所有这些都有一个共同的根源,一个答案将解决所有列出的问题。如果我错了,我会把这个问题分成几个。

首先,这是我的提交历史(忽略糟糕的提交消息):

* 8870309 (HEAD, origin/master, master) Completed
* 7d70396 Completed
* aa3bd79 Completed
* 96c21f6 Completed
* ba9b4dd Completed
* eafcb19 Completed
* e0a7e91 Completed
* 455688a Completed
* 9e925bf Completed
* 7c800cf Completed
* 3d3c2e8 Completed
* 2420e22 Completed
* c7a8fa5 Completed
* a750f9b Completed
* 32eef0b Completed
* f6f5852 Completed
* 3998fcd Completed
*   5bf074d path progress
|\  
| * 7aba66b Completed
* | 6b3d03d Completed
|/  
* ed3ef53 Completed
* d9c97ec Completed
* 8684c7f Completed
* f05904a Completed
* a1fdf7c Completed
*   c321a19 Merge branch 'master' of github.com:AlexVPopov/rubykoans
|\  
| * aca7987 Initial commit
* 9359dd1 Initial commit

所以,我觉得奇怪的第一件事就是这个 - 为什么aca79877aba66b显示在不同的分支上,因为它们都在主人身上?如果我运行git branch --contains aca7987,我会master。我怀疑这个可能是因为我在分支X上做了更改,而不是先检查出master而不先提交这些更改然后将分支X合并到主分支中,删除分支X然后提交更改。 / p>

我想将所有提交的提交消息更改为“已完成”。所以我运行git rebase -i 9359dd1。我明白了:

pick aca7987 Initial commit
pick a1fdf7c Completed
pick f05904a Completed
pick 8684c7f Completed
pick d9c97ec Completed
pick ed3ef53 Completed
pick 6b3d03d Completed
pick 7aba66b Completed
pick 3998fcd Completed
pick f6f5852 Completed
pick 32eef0b Completed
pick a750f9b Completed
pick c7a8fa5 Completed
pick 2420e22 Completed
pick 3d3c2e8 Completed
pick 7c800cf Completed
pick 9e925bf Completed
pick 455688a Completed
pick e0a7e91 Completed
pick eafcb19 Completed
pick ba9b4dd Completed
pick 96c21f6 Completed
pick aa3bd79 Completed
pick 7d70396 Completed
pick 8870309 Completed

我将pick aca7987更改为r aca7987,关闭编辑器,弹出新的编辑器窗口,将Initial commit更改为Completed并关闭编辑器。然后我得到:

[detached HEAD da22506] Commit
 Author: AlexVPopov <xxxx@xxx.xxx>
 1 file changed, 4 insertions(+)
 create mode 100644 README.md
error: could not apply 7aba66b... Completed

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

为什么会这样?谢谢。

2 个答案:

答案 0 :(得分:1)

  

为什么aca7987和7aba66b显示在不同的分支上,因为它们都在主

上      

* 5bf074d path progress
  \
  | * 7aba66b Completed
  * | 6b3d03d Completed

...

  

* c321a19 Merge branch 'master' of github.com:AlexVPopov/rubykoans
     |\
     | * aca7987 Initial commit
     * 9359dd1 Initial commit

7ab和aca现在都是master的历史记录的一部分,但是你永远不会通过跟随master的第一个父链接遇到它们中的任何一个:这些提交都是在另一个分支上诞生的。

  

这可能是因为我在分支X上进行了更改,而不是在不提交

的情况下检出主人

如果有什么事情反过来,但无论如何。

提交历史很重要。分支名称不会,至少不与历史相比。除了不忘记你还在使用的任何一个,git根本不关心它们。他们是纯粹的本地生物,任何能从你的回购中获取的人都可以看到,如果他们关心的话。你的回购是你的,他们是他们的。在某些常见情况下,您可能git checkout -t trunk origin/v2.0-release因为该名称更好地描述了其在您的存储库中的角色。这是一个非常普遍和有用的东西,为它们的意思命名分支。

  

然后我得到[detached HEAD da22506 ... error: could not apply 7aba66b ...]。为什么会这样?

顺便说一句,detached HEAD是git可爱的方式说你(或者在这种情况下,rebase)没有为你的上一次结账提供任何分支名称。这实际上是一件相当普通的事情。

但是rebase通常不会尝试保留合并结构,try it again with -p

答案 1 :(得分:0)

如果您修改了未提交的内容,Git将不允许您切换分支。 因此,我看不出你是如何检查分支X,进行更改,返回主服务器,合并X然后才提交更改的。我知道这是可能的唯一方法是你编辑了一个未跟踪的文件,并在以后添加了它的全部内容。

我最好猜测你的两个问题的原因是你合并了分支X(提交7aba66b),它与master(commit 6b3d03d)冲突。然后,您解决了合并提交中的冲突(5bf074d路径进度)。如果您使用常规合并(而不是--no-ff)并且没有冲突,那么git应该快速转发master来包含X,并且您将看到master的线性历史记录。

这就是你遇到冲突的原因。查看rebase提交 - git在rebase期间省略了merge commit(5bf074d):

pick ed3ef53 Completed
pick 6b3d03d Completed
pick 7aba66b Completed
pick 3998fcd Completed

您可以执行以下任一操作:

  1. 使用与合并时解决原始冲突完全相同的方式解决原始冲突。这将保证您不会与后续提交有任何冲突。
  2. 使用'git rebase -i -p' - 这将保留合并提交,如果您需要做的只是重新提交提交,那么就不会有冲突。