git rebase删除提交

时间:2012-08-14 14:33:14

标签: git repository gerrit

我的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

  4. 我正在使用Gerrit 2.2,因此评论页面上没有rebase按钮。

2 个答案:

答案 0 :(得分:2)

以下步骤对我有用:

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

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

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

  3. git 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

  5. 其中123789分别是更改B和C的审核编号。我的B和C更改都有新的补丁,这些补丁已正确重新定位。

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

答案 1 :(得分:0)

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

编辑:因为变基确实改变了历史。我不知道格里特会如何对此做出反应。您可以尝试添加强制标记,例如git push -f,但请记住,由于历史的变化,这很危险!