无法重定分支主节点的基数

  • 本文关键字:节点 分支 git 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 上进行了更改,而不是签出主节点而不先提交这些更改,然后将分支 X 合并到主分支中,删除分支 X,然后提交更改。

我想将所有提交的提交消息更改为"已完成"。所以我跑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".

为什么会这样?谢谢。

为什么 ACA7987 和 7ABA66B 显示在不同的分支上,因为它们都在主服务器上

* 5bf074d path progress | * 7aba66b Completed <</strong> br/> * | 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 的可爱方式说您(或在这种情况下是变基(没有为您的上次结账提供任何分支名称。 这实际上是一件相当普通的事情。

但是变基通常不会尝试保留合并结构,请使用-p重试?

如果你

修改了未提交的内容,Git 不会让你切换分支。因此,我不明白您如何签出分支 X,进行更改,返回主节点,合并 X,然后才提交更改。我知道这是可能的唯一方法是,如果您编辑了一个未跟踪的文件,并在以后添加了其全部内容。

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

这与你发生冲突的原因相同。查看变基提交 - git 在变基期间省略合并提交 (5bf074d(:

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

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

  1. 在变基时解决原始冲突,方法与合并时解决冲突的方式完全相同。这将保证您不会与后续提交发生任何冲突。
  2. 使用'git rebase -i -p' - 这将保留合并提交,如果你需要做的就是改写提交,那里应该没有冲突。

最新更新