Git 无法重新设置分支主节点的基础

Git 无法重新设置分支主节点的基础,git,rebase,Git,Rebase,我刚刚完成了一个项目,想对它的历史进行一些修改,使它看起来更整洁。我已经推动了这个项目,但还没有人参与或参与,所以没有人会因为重写历史而受到影响 我偶然发现了一些问题。在重新基址期间,我收到一条消息,表示无法应用commit7aba66b 免责声明:我知道一个SO主题不能包含多个问题,但我真的认为,在这里,将我的问题放在一个SO主题中是有意义的,因为它们是如此密切相关,因此,将所有背景信息发布几次是不必要的。更重要的是,我认为所有这些都有一个共同的根源,一个单一的答案将解决所有列出的问题。如果我

我刚刚完成了一个项目,想对它的历史进行一些修改,使它看起来更整洁。我已经推动了这个项目,但还没有人参与或参与,所以没有人会因为重写历史而受到影响

我偶然发现了一些问题。在重新基址期间,我收到一条消息,表示无法应用commit
7aba66b

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

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

因此,我觉得奇怪的第一件事是,为什么
aca7987
7aba66b
显示在单独的分支上,因为它们都在master上?如果我运行
git分支——包含aca7987
我将获得
master
。我怀疑这可能是因为我在分支X上进行了更改,而不是先签出主分支而不提交这些更改,然后将分支X合并到主分支,删除分支X,然后提交更改

我想将所有提交的提交消息更改为“已完成”。所以我运行了
gitrebase-i9359dd1
。我明白了:

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
我将
选择aca7987
更改为
r aca7987
,关闭编辑器,弹出新编辑器窗口,将
初始提交
更改为
完成
并关闭编辑器。然后我得到:

[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".
[分离头da22506]提交
作者:阿列克斯波波夫
1个文件已更改,4个插入(+)
创建模式100644 README.md
错误:无法应用7aba66b。。。完整的
解决此问题后,运行“git-rebase--continue”。
如果您希望跳过此修补程序,请运行“git-rebase--skip”。
要签出原始分支并停止重定基址,请运行“git-rebase--abort”。

为什么会这样?谢谢。

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

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

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

pick ed3ef53 Completed
pick 6b3d03d Completed
pick 7aba66b Completed
pick 3998fcd Completed
您可以执行以下任一操作:

  • 在重新定基时解决原始冲突,方法与合并时解决冲突的方法完全相同。这将保证您不会与后续提交发生任何冲突
  • 使用“git-rebase-i-p”-这将保留合并提交,如果您所需要做的只是重新编写提交,那么应该不会有冲突

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

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

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

    pick ed3ef53 Completed
    pick 6b3d03d Completed
    pick 7aba66b Completed
    pick 3998fcd Completed
    
    您可以执行以下任一操作:

  • 在重新定基时解决原始冲突,方法与合并时解决冲突的方法完全相同。这将保证您不会与后续提交发生任何冲突
  • 使用“git-rebase-i-p”-这将保留合并提交,如果您所需要做的只是重新编写提交,那么应该不会有冲突
  • 为什么ACA7987和7aba66b显示在单独的分支上,因为它们都显示在master上

    *5bf074d路径进度

    \

    |*
    7aba66b
    已完成

    *| 6b3d03d已完成

    *c321a19合并github.com的分支“master”:AlexVPopov/rubykoans

    \

    |*
    aca7987
    初始提交

    *9359dd1初始提交

    现在,7ab和aca都是master历史的一部分,但是通过遵循master的第一个父链接,您将永远不会遇到它们中的任何一个:这两个提交都是在另一个分支上生成的

    这可能是因为我在分支X上进行了更改,而不是在不提交的情况下签出主节点

    如果有什么不同的话,那就是相反的,但没关系

    这很重要。分支名称没有,至少与历史记录相比没有。除了不忘记您仍在使用的任何一个之外,git根本不在乎它们。他们是纯粹的本地生物,任何人都可以从你的回购协议中看到,如果他们在乎的话。你的回购协议是你的,对吗