我当地工作树中的过去3次提交如下:
latest: my current changes latest-1: my previous commit, that I pushed to gerrit and subsequently aborted latest-2: an earlier commit by someone else
现在当我收到如下错误时:
git push origin HEAD:refs/for/dev
! [remote rejected] HEAD -> refs/for/dev (change https://git/1326970 closed)
1326970
是我放弃的latest-1
提交的变更集。如何从本地工作树中删除它?
当我执行git remote update && git rebase
git说First, rewinding head to replay your work on top of it...
时,它会应用两次提交LATEST-1
和LATEST
。我是否需要在此之前重新设置然后进行更改?
答案 0 :(得分:0)
通常,要删除提交,请使用git reset
。在这种情况下,如果您希望保留latest
提交但删除latest-1
,则会更复杂一点,因为您不能将分支设置为X提交。
请记住,Git的数据结构每次提交都指向其父提交,因此latest
包含对latest-1
的引用。我们需要做的是合成一个新的latest
提交,不再包含您在latest-1
中更改的内容,并将latest-2
存储为其父级。
这听起来很复杂但幸运的是Git有一个powertool来做历史记录,称为交互式rebase ,就像这样:
git rebase -i latest-2
(“对latest-2
之后的所有内容做了可怕的事情”)。git rebase
的联机帮助页,交互模式部分中进行了说明。latest
,在您的情况下),可能会发生冲突(如果latest
中的更改取决于“latest-1
中的更改)。 Git会在文件中添加冲突标记并告诉您如何继续。在合并提交时要小心这样做。默认情况下,交互式rebase会严重破坏它们。您可以告诉它不要使用-p
选项执行此操作,但您可以获得完全不同的代码路径,并且可能存在细微的其他差异。
或者,对于这种特殊情况,这里有一个更快的选项:重置然后手动重新应用单个提交。
git reset --hard latest-2 # warning, destroys uncommitted changes
git cherry-pick latest # ID of latest (which is now gone but can still be referenced)