4

我的 git 存储库中有以下更改历史记录:

---X---Y---Z---A---B---C

我从代码 Z 的基础开始工作,并进行了三个更改 A、B 和 C。这些更改中的每一个都已作为单独的评论上传到 Gerrit 上,并且每个都取决于之前的更改。

经过审查,我想删除更改 A,以便我的更改历史记录是:

---X---Y---Z---B---C

什么是正确的流程git rebase -igit commit让它发挥作用?

我假设如下:

  1. 用于git rebase -i HEAD~3显示最后三个提交。这显示了文件内容:

    pick 1234567 Commit A message
    pick 1a2b3c4 Commit B message
    pick abcdefg Commit C message

  2. 然后我可以删除第一行并保存文件以删除第一个提交。

  3. 这就是我卡住的地方......如果我尝试,git commit --amend我只能修改 C 的提交。因此我不知道如何将我的 rebase 更改推送到 Gerrit 以供审查使用repo upload .git push

我使用的是 Gerrit 2.2,所以评论页面上没有变基按钮。

4

2 回答 2

5

以下步骤现在对我有用:

  1. 使用 git rebase -i HEAD~3 显示最后三个提交。这显示了文件内容:

    pick 1234567 Commit A message
    pick 1a2b3c4 Commit B message
    pick abcdefg Commit C message

  2. 然后我可以删除第一行并保存文件以删除第一个提交。

  3. Agit log现在显示了我的 B 和 C 在 Z 的基础之后的变化,以及它们的新 SHA-1 值

  4. 然后我可以将每个更改单独推送到他们各自的评论中:

    git push ssh://myserver:29418/project SHA1_of_B:ref/changes/123
    git push ssh://myserver:29418/project SHA1_of_C:ref/changes/789

其中123789分别是变更 B 和 C 的审查编号。我的 B 和 C 更改每个都有新的补丁,这些补丁被正确地重新定位。

原来我的问题只是理解我必须git push单独进行两个更改。

于 2012-08-14T14:56:59.540 回答
1

在步骤 2) 之后,您就完成了变基。在选择哪个提交后选择。您可能会遇到合并冲突。修复它们git mergetool并执行git rebase --continue

编辑:因为变基确实改变了历史。我不知道格瑞特对此有何反应。您可以尝试添加 force 标志git push -f,但请记住,由于历史更改,这很危险!

于 2012-08-14T14:38:33.640 回答