如何从拉取请求中删除提交记录

237

我提交了一个"pull request",但之后我又在本地项目中进行了一些"commits",导致我的"pull request"变得混乱。我尝试删除它,但并没有成功。

我在StackOverflow上找到了一些类似的问题,但是我无法应用里面的方法。这是我在GitHub上的第一个"pull request",所以我对所有这些工作方式感到有点奇怪。

需要保留的是突出显示的"commit",并删除其他所有内容。由于我做了一些合并操作,它变成了历史记录中的第四个"commit"。

enter image description here

这是我的git日志 enter image description here

请问有人可以解释一下发生了什么以及如何解决这个问题吗?


2
你需要进行变基,并且只选择“从Github添加”的提交(即注释掉其他每个提交的行)。 - scrowler
1
将哪个分支变基到哪个分支上,您能否添加更多的解释。 - humazed
"what branch" = 你正在工作的分支, "onto what branch" = 你要创建拉取请求的分支 - scrowler
我在我的回答中解释了@Robbie Averill的提示。奇怪的是,直到现在还没有人写过解释这个的答案。 - Ferit
请问是否可以通过GitHub网站上的界面,从一个Pull Request中删除已修改的文件? - gman
7个回答

324
人们不喜欢看到错误的提交和撤销提交来撤销错误提交的更改。这会污染提交历史。
以下是一种简单的方法,可以删除错误的提交,而不是使用撤销提交来撤销更改。
0. `git checkout my-pull-request-branch` 1. `git rebase -i HEAD~n` // 这里的 `n` 是你想在交互式 rebase 中包含的最后几个提交的数量。 2. 对于你想丢弃的提交,将 `pick` 替换为 `drop`。 3. 保存并退出。 4. `git push --force-with-lease`(更安全的强制推送,由 @George 指出)。

15
这对我非常有效。我有一堆提交记录不应该出现在拉取请求中。我进行了交互式变基,删除了这些提交记录并重新推送了它们。 - FullStackEngineer
13
要进行代码提交,我必须执行以下命令:git push origin HEAD:myBranch --force。总的来说,这很好用也很有帮助。 - ScottyBlades
5
当您想要在GitHub上修复一个开放的PR时,强制推送是非常有用的,您只需要能够执行强制推送即可。 - Vladimir Hidalgo
15
你的意思是,“用‘drop’代替‘pick’来丢弃你想要废弃的提交。” - gosuto
6
@jorijnsmit,他们的意思是在运行git rebase -i HEAD~<n>之后,在文件顶部将会有<n>行提交记录,每行都包含文本pick <commit id>。这些提交默认为pick,因此如果您想要删除某个提交,只需将文本pick更改为drop即可。 - Slim
显示剩余10条评论

195

你有几种方法可以做到这一点。

这篇帖子 - 阅读关于还原的部分将详细解释我们想要做什么以及如何做到它。

以下是最简单的解决方案:

# Checkout the desired branch
git checkout <branch>

# Undo the desired commit
git revert <commit>

# Update the remote with the undo of the code
# The force is a tricky flag since it will force the push but
# your administrator can block it, so if it's not an option you
# can delete the old branch and push it again
git push origin <branch> --force

revert 命令将创建一个新提交,其中包含原始提交的撤销


6
如果我们从别人那里fork一个项目,并想在pull request中删除一些注释,这还能起作用吗? - Dr.jacky
要撤销拉取请求中的所有提交,您只需要合并拉取请求提交ID。#从拉取请求中撤消所需的提交git revert <Merge pull request commit id> -m 1 - Techie
你是对的 @Deeppak,只是澄清一下,-m 代表合并的父节点,所以你可能需要使用 -m n 而不是 1。 - CodeWizard
对我来说非常完美,简单而无痛。 - Artexias
@Dr.jacky 如果你正在处理一个分叉项目,只需在执行 git revert <commit> 命令后使用 git push --force。这将撤销 Pull Request 上的提交。 - undefined
push --force 可能被 Git 管理员禁用 - undefined

14

如果你要删除一个提交并且不想保留它的更改,@ferit提供了一个好的解决方案。

如果你想将该提交添加到当前分支中,但它不应该成为当前pr的一部分,可以采取以下步骤:

  1. 使用 git rebase -i HEAD~n
  2. 将要删除的提交交换到底部(最近)位置
  3. 保存并退出
  4. 使用 git reset HEAD^ --soft 撤销提交并将更改重新放回暂存区。
  5. 使用 git push --force 更新远程分支,但不包括你已删除的提交。

现在你已经从远程仓库中删除了该提交,但在本地仍然保留更改。


在使用 git push --force 命令时一定要非常小心。它会完全(且不可逆地)用本地计算机的内容覆盖远程仓库上的所有内容。 - Velociround

4

以下是帮助我解决问题的方法:

  1. 创建一个新分支用于覆盖已有分支,我们称之为现有分支 branch_old 和新分支为 branch_new

  2. branch_new 重置到稳定状态,即当您没有任何问题提交时所处的状态。 例如,要将其放在本地主分支的级别上,请执行以下操作:

    git reset —hard master git push —force origin

  3. 使用 cherry-pick 命令将提交从 branch_old 合并到 branch_new 上。

  4. git push

4

请在您的分支下运行以下命令:

git reset --soft origin/master
git commit -m "Detail of Your last commit that you want to see"
git push -f

1

请按照以下步骤操作:

假设您的分支名称是my_branch,并且有额外的提交。

  1. git checkout -b my_branch_with_extra_commits(将此分支保存为不同的名称)
  2. gitk(打开git控制台)
  3. 查找要保留的提交。将该提交的SHA复制到记事本中。
  4. git checkout my_branch
  5. gitk(这将打开git控制台)
  6. 右键单击要还原到的提交(更改之前的状态),然后单击“重置分支到这里”
  7. 执行git pull --rebase origin branch_name_to_merge_to
  8. git cherry-pick <在第3步中复制的SHA>

现在查看本地分支提交历史记录,确保一切正常。


0
如果不小心推送了不必要的文件并想从PR中删除它们,则:
 1. git reset <commit ID wherever you want to jump> 
 
 2. git restore <file name you want to remove> or git add <all the file
    names you want to add to commit>

 3. git commit -m “new commit message”

 4. git push -f //necessary to push forcefully (if anything is there to pull)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接