我正在尝试使用以下方式更改提交者名称:
https://stackoverflow.com/a/3042512/6097074。
我已提交到分支A
,并从'B'处拉出,拉后出现冲突要解决,但我错误地从另一个用户那里提交了。
现在我正在尝试rebase
,但是它没有显示编辑器中的PICK
更改为EDIT
的commit(冲突解决后合并提交)。
下面是我要更改黄色突出显示中的提交的gitk
图片。
答案 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
进行了“历史记录重写”,但各方都已同意处理此类推送-这种重写是可以的。在其他情况下,您仍然仍然可以这样做,但是您可能不得不希望得到宽恕。