1

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

我偶然发现了一些问题。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显示在不同的分支上,因为它们都在 master 上?如果我跑,git branch --contains aca7987我会得到master. 我怀疑这可能是因为我在分支 X 上进行了更改,而不是先签出 master 而没有提交这些更改,然后将分支 X 合并到 master 分支,删除分支 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 aca7987r aca7987,关闭编辑器,弹出新的编辑器窗口,更改Initial commitCompleted并关闭编辑器。然后我得到:

[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".

为什么会这样?谢谢你。

4

2 回答 2

1

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

* 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 上进行了更改,而不是在没有提交的情况下签出 master

如果有的话,它是相反的方式,但没关系。

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

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

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

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

于 2013-10-03T05:10:41.147 回答
0

如果您修改了未提交的内容,Git 不会让您切换分支。因此,我看不出您如何检查分支 X、进行更改、返回到 master、合并 X,然后才提交更改。我知道这是可能的唯一方法是,如果您编辑了一个未跟踪的文件,然后稍后添加了它的全部内容。

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

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

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

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

  1. 使用与合并时完全相同的方式解决原始冲突。这将保证您不会与后续提交发生任何冲突。
  2. 使用 'git rebase -i -p' - 这将保留合并提交,如果您需要做的只是重新编写提交,那么那里应该没有冲突。
于 2013-10-02T22:57:51.927 回答