从 Git 中的分支删除提交

我想知道如何删除提交。

通过delete ,我的意思是好像我没有进行该提交,并且以后进行推送时,所做的更改将不会推送到远程分支。

我读了 git help,我认为我应该使用的命令是git reset --hard HEAD 。它是否正确?

答案

小心: git reset --hard 将删除您的工作目录更改 。在运行此命令之前,请确保存储要保留的所有本地更改

假设您正坐在该提交上,那么此命令将使其失效...

git reset --hard HEAD~1

HEAD~1表示在 head 之前提交。

或者,您可以查看git log的输出,找到要备份到的提交的提交 ID,然后执行以下操作:

git reset --hard <sha1-commit-id>

如果您已经推过它,则将需要用力推动才能摆脱它...

git push origin HEAD --force

但是 ,如果其他人可能已经撤消了,那么您最好开始新的分支。因为当他们拉动它时,它只会将其合并到他们的工作中,并且您会再次将其推回去。

如果已经推送了,最好使用git revert创建一个 “镜像” 提交,以撤消更改。但是,两个提交都将在日志中。


仅供参考 - 如果您想摆脱正在进行的工作,则git reset --hard HEAD非常git reset --hard HEAD 。它会将您重置为最新提交,并清除工作树和索引中的所有更改。


最后,如果您需要查找 “删除” 的提交,除非您已垃圾回收存储库,否则它通常存在于git reflog

如果尚未将提交推送到任何地方,则可以使用git rebase -i删除该提交。首先,找出该提交的距离(大约)。然后做:

git rebase -i HEAD~N

所述~N装置变基最后N提交( N必须是一个数,例如HEAD~10 )。然后,您可以编辑 Git 呈现给您的文件以删除有问题的提交。保存该文件后,Git 将重写以下所有提交,就好像您删除的提交不存在一样。

《 Git 书》中有一个很好的章节,介绍了如何根据图片和示例进行基础调整。

但是请务必小心,因为如果您更改了推到其他位置的内容,则除非您打算进行强制推入,否则将需要另一种方法。

另一种可能性是我个人最喜欢的命令之一:

git rebase -i <commit>~1

这将以交互模式-i在您要修改的提交之前的点开始重新设置。此后,编辑器将开始列出所有提交。删除包含要删除的提交的行,然后保存文件。 Rebase 将完成其余工作,仅删除该提交,并将所有其他提交重播到日志中。

我要附加这个答案,因为我不明白为什么任何刚尝试提交工作的人都因为使用 Git 的某些错误而想删除所有工作!

如果您想保留工作并只是 “撤消” 该提交命令(您在推送回购之前就被捕获):

git reset --soft HEAD~1

除非要破坏自上次提交以来正在进行的工作,否则不要使用 --hard标志。

删除整个提交

git rebase -p --onto SHA^ SHA

显然,将 “SHA” 替换为您要删除的引用。该命令中的 “^” 为文字。

http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep

如果您未发布更改,则要删除最新提交,可以执行

$ git reset --hard HEAD^

(请注意,这还将删除所有未提交的更改;请谨慎使用)。

如果您已经发布了要删除的提交,请使用git revert

$ git revert HEAD

假设我们要从仓库中删除提交 2 和提交 4。

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

注意:由于您正在使用--hard-f 您需要对该存储库具有管理员权限

  • git checkout b3d92c5检出最后一个可用的提交。
  • git checkout -b repair创建一个新分支进行处理。
  • git cherry-pick 77b9b82运行提交 3。
  • git cherry-pick 2c6a45b运行提交 1。
  • git checkout master结帐大师。
  • git reset --hard b3d92c5重置为上一次可用的提交。
  • git merge repair我们的新分支合并到 master。
  • git push -f origin master推送到远程仓库。
git reset --hard commitId

git push <origin> <branch> --force

PS:CommitId 指您要还原为的那个

强制更改历史记录

假设您不仅要删除最后一个提交,还想删除最后 n 个提交的特定提交,请执行以下操作:

git rebase -i HEAD~<number of commits to go back> ,所以如果您想查看最后五个提交,则git rebase -i HEAD~5

然后在文本编辑器中,将单词pick drop到要删除的每个提交旁边。保存并退出编辑器。瞧!

加性更改历史

尝试git revert <commit hash>Revert将创建一个新的提交,该提交将撤消指定的提交。

如果要修复最新的提交,可以执行以下操作来撤消提交,并取消暂存其中的文件:

git reset HEAD~1

这将使您的存储库恢复到暂存文件的 git add 命令之前的状态。您所做的更改将在您的工作目录中。 HEAD〜1 是指分支当前尖端下方的提交。

如果要取消提交 N 次提交,但将代码更改保留在工作目录中:

git reset HEAD~N

如果您想摆脱最近的提交,并且不想保留代码更改,则可以执行 “硬” 重置。

git reset --hard HEAD~1

同样,如果您要放弃最后的 N 次提交,并且不想保留代码更改,请执行以下操作:

git reset --hard HEAD~N