因为先前的变更集被放弃了,所以无法推销

时间:2015-12-29 23:54:43

标签: git gerrit

我当地工作树中的过去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-1LATEST。我是否需要在此之前重新设置然后进行更改?

1 个答案:

答案 0 :(得分:0)

通常,要删除提交,请使用git reset。在这种情况下,如果您希望保留latest提交但删除latest-1,则会更复杂一点,因为您不能将分支设置为X提交。

请记住,Git的数据结构每次提交都指向其父提交,因此latest包含对latest-1的引用。我们需要做的是合成一个新的latest提交,不再包含您在latest-1中更改的内容,并将latest-2存储为其父级。

这听起来很复杂但幸运的是Git有一个powertool来做历史记录,称为交互式rebase ,就像这样:

  1. 你运行git rebase -i latest-2(“对latest-2之后的所有内容做了可怕的事情”)。
  2. Git启动一个列出您的提交的编辑器。删除行以删除提交,此外还有许多其他事项可以执行,在git rebase的联机帮助页,交互模式部分中进行了说明。
  3. 完成后,保存并退出,Git将根据您订购的内容重新生成提交。 (如果您改变主意,请在保存之前清除编辑器内容,否则将中止。)
    • 在每次重新生成提交期间(latest,在您的情况下),可能会发生冲突(如果latest中的更改取决于“latest-1中的更改)。 Git会在文件中添加冲突标记并告诉您如何继续。
  4. 在合并提交时要小心这样做。默认情况下,交互式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)