更改推送后具有两个父级的提交的提交者名称

时间:2018-08-22 03:05:55

标签: git github

我正在尝试使用以下方式更改提交者名称:

https://stackoverflow.com/a/3042512/6097074

我已提交到分支A,并从'B'处拉出,拉后出现冲突要解决,但我错误地从另一个用户那里提交了。

现在我正在尝试rebase,但是它没有显示编辑器中的PICK更改为EDIT的commit(冲突解决后合并提交)。

下面是我要更改黄色突出显示中的提交的gitk图片。

conflict

1 个答案:

答案 0 :(得分:1)

(注意:如果您可以访问Git 2.18,则可以尝试使用新的高级基础。请参见VonC's answer here。我不知道它是否适用于此特定情况。)

重新定基删除合并,因为重新定基通常是为了消除 合并的需要。

有一种git rebase可以被重新创建合并(它再次运行git merge),但这不是针对您的情况的正确方法。对于您而言,正确的方法是让再次运行git merge-或根本不执行此操作。

请记住,git pull仅表示先运行git fetch,然后再运行git merge 。 (或者,如果您告诉它运行git rebase作为其第二个Git命令,请运行git fetch,然后运行git rebase 。)如果您是Git的初学者,我个人建议避免 git pull。而是运行两个单独的命令。结果会更有意义。

您可以使用git reset将当前分支名称移回到尚未发生git merge的位置。这也将带来相当不幸但至关重要的副作用,即抛弃所有后续提交,并且如果您使用git reset --hard则抹去未提交的工作。这是一个标志,可以帮助您意识到自己正在做的事情非常激烈。在开始之前,您将需要设置一个名称(分支或标记名称)以记住所有原始提交,以便在git reset --hard(从当前分支删除所有这些提交)之后,您仍然可以原始提交(现在仅在您刚刚设置的新分支或标记名称上)。

已删除合并,现在您可以再次运行git merge重新执行合并。这次,您可以根据需要使用其他提交者名称。请注意,您获得的不同提交具有不同的哈希ID。

这次已经正确执行了合并,现在您可以复制所有后续提交。您可以使用git cherry-pick及其提交哈希ID一次进行一次提交。每个复制的提交都会获得一个新的提交者名称和时间戳。 (请注意,git cherry-pick默认情况下会重用原始的 author author时间戳,但您将成为新的提交者。)这些新的提交是新的,与原始ID不同的哈希ID。这是必须的!它们位于新的和不同的合并提交的顶部,因此它们是不同的提交,并且需要不同的ID。

要更快地复制所有这些提交,可以使用git rebase!实际上,这就是git rebase的作用:它会复制提交,以便在启动重新设置基准时,无论站在哪里,新的提交都会出现。 (这是为什么,它消除了合并的必要。)但是出于教育目的,使用git cherry-pick对您来说更有意义。这清楚地说明了 git rebase是如何实现其结果的。

现在,您已将所有原始提交复制到具有不同哈希ID的新改进提交中,您可以git push在其他位置进行新提交。但是,任何已经拥有原始提交的人现在都被迫从旧的(错误的)提交切换到新的(更正的)提交。这就是为什么以及何时这种“重写历史”很糟糕的原因:当它为其他人带来更多工作时,这些人现在都因使他们完成所有工作而烦恼。如果您从未推动过这些承诺,那么没有人拥有它们,因此也没有其他人会感到烦恼。或者,如果您已事先与其他所有人安排,则不允许让其他人烦恼。

因此,在这两种情况下-从未分发过原始信息,或者您使用git push --force进行了“历史记录重写”,但各方都已同意处理此类推送-这种重写是可以的。在其他情况下,您仍然仍然可以这样做,但是您可能不得不希望得到宽恕。