如何从分支中删除提交?

如何从我的分支历史中删除提交?我应该使用git reset --hard HEAD吗?

3977644 次浏览

小心: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来创建一个将撤消更改的“镜像”提交。但是,两个提交都将在日志中。


仅供参考--如果您想摆脱WORK IN PROGRESS,git reset --hard HEAD很好。它会将您重置回最近的提交,并擦除工作树和索引中的所有更改。


最后,如果您需要找到您“删除”的提交,它通常存在于git reflog中,除非您对存储库进行了垃圾收集。

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

git rebase -i <commit>~1

这将在交互式模式-i下开始rebase,就在您要删除的提交之前。编辑器将开始列出从那时起的所有提交。删除包含要删除的提交的行并保存文件。Rebase将完成其余的工作,仅删除该提交,并将所有其他提交重播回日志中。

如果您还没有将提交推送到任何地方,您可以使用#0来删除该提交。首先,找出该提交的距离(大约)。然后执行:

git rebase -i HEAD~N

~N表示重新设置最后的N提交(N必须是数字,例如HEAD~10)。然后,您可以编辑Git呈现给您的文件以删除违规提交。保存该文件后,Git将重写所有以下提交,就好像您删除的提交不存在一样。

Git Book有一个很好的关于重新定位的一节,包含图片和示例。

但是要小心,因为如果您更改了推送到其他地方的内容,则需要另一种方法,除非您计划进行强制推送。

如果你没有发布更改,删除最新提交,你可以这样做

$ git reset --hard HEAD^

(请注意,这也将删除所有未提交的更改;小心使用)。

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

$ git revert HEAD

上面的所有命令都恢复了提交之前工作树和索引的状态,但并没有恢复存储库的状态。如果你看一下,“已删除”的提交实际上并没有被删除,它根本不是当前分支尖端的那个。

我认为没有办法删除瓷命令的提交。唯一的方法是将其从日志中删除并重新启动,然后执行git prune --expire -now

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

如果您想保留您的工作并只需“撤消”该提交命令(您在推送到repo之前捕获):

git reset --soft HEAD~1

不要用--硬的标志,除非你想销毁自上次提交以来的半成品。

这里有另一种方法来做到这一点:

签出你想要恢复的分支,然后将你的本地工作副本重置回你想要成为远程服务器上最新的提交(之后的一切都将再见)。为此,我在SourceTree中右键单击并选择了“将BRANCHNAME重置为此提交”。我想命令行是:

git reset --hard COMMIT_ID

由于您刚刚从远程签出了您的分支,因此您不必担心丢失任何本地更改。但如果您这样做了,这将丢失它们。

然后导航到存储库的本地目录并运行以下命令:

git -c diff.mnemonicprefix=false -c core.quotepath=false \push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

这将删除本地存储库中当前提交之后的所有提交,但仅限于该分支。

如果您只是搞砸了上次提交(错误的消息,忘记添加一些更改)并希望在将其推送到公共存储库之前修复它,为什么不使用:

git commit --amend -m "New message here"

如果您有新分阶段的更改,它们将与最后一次提交(您试图摆脱的)相结合,并将替换该提交。

当然,如果你在推送之后修改了提交,你就是在重写历史,所以如果你这样做,一定要理解其中的含义。

如果您希望使用前一个提交的消息,您还可以传递“--no-dit”选项而不是“-m”。

文档:http://git-scm.com/docs/git-commit.html

如果您想修复最新的提交,您可以撤消提交,并取消其中的文件,方法是:

git reset HEAD~1

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

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

git reset HEAD~N

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

git reset --hard HEAD~1

同样,如果您想丢弃最后N次提交,并且不想保留代码更改:

git reset --hard HEAD~N

要删除本地分支,请使用

git reset --hard HEAD~1

要在远程分支中删除,请使用

git push origin HEAD --force
git reset --hard commitId
git push <origin> <branch> --force

PS:提交指的是你想恢复到的那个

假设您没有推送到远程存储库,您可以重新克隆存储库。这是我几次选择的方法。

如果你想保留历史,显示提交和恢复,你应该使用:

git revert GIT_COMMIT_HASH

输入解释您为什么要恢复的消息,然后:

git push

当您发出git log时,您将看到“错误”提交和恢复日志消息。

git重置

git推送原点HEAD--force

如果一个或多个提交被标记,请首先删除标记。否则标记的提交不会被删除。

删除整个提交

git rebase -p --onto SHA^ SHA

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

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

git rebase -i HEAD~2

这里的“2”是您想要重新调整的提交数量。

'git rebase -i HEAD`

如果你想重设所有的提交。

然后,您将能够选择其中一个选项。

p, pick = use commit

r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like "squash", but discard this commit's log message
x, exec = run command (the rest of the line) using shell
d, drop = remove commit

这些行可以重新排序;它们从上到下执行。如果您在此处删除一行,该提交将丢失。但是,如果您删除所有内容,则重新构建将被中止。注意空提交会被注释掉

您可以使用选项“d”或删除包含您的提交的行来简单地删除该提交。

错误:

git rebase -i --root'ed我的分支,无知地认为我可以重写与master不同的第一次提交(github for windows默认视图是与master的比较,隐藏它的全部)。

当900多个提交加载到Sublime时,我留着硅谷的胡子。没有任何变化地退出,我给电池充电,然后继续刮胡子,因为所有900多个个人提交都漫不经心地重新调整了基础——将他们的提交时间重置到现在。

决心击败Git并保留原始时间,我删除了这个本地存储库并从远程重新克隆。

现在它重新添加了一个最近不需要的提交给我希望删除的master,所以就这样进行了。

用尽选项:

我不希望git revert-它会创建一个额外的提交,让Git占上风。

git reset --hard HEAD什么也没做,在检查了reflog之后,最后也是唯一的HEAD是克隆-Git获胜。

为了获得最新的SHA,我检查了远程存储库上的github.com-次要win。

在认为git reset --hard <SHA>起作用后,我将另一个分支更新为master和1……2…… poof!提交回来了-Git获胜。

回到master,是时候尝试git rebase -i <SHA>了,然后删除该行……无济于事,很遗憾地说。“如果您在此处删除一条线,该提交将丢失”。啊……掩盖了2.8.3发行说明中的新功能troll the n00b

解决方案:

git rebase -i <SHA>然后d, drop = remove commit

为了验证,我签出到另一个分支,瞧——没有隐藏提交从主服务器获取/拉取。

https://twitter.com/holman/status/706006896273063936

祝你愉快。

将您的代码备份到temp文件夹。以下命令将重置与服务器相同。

git reset --hard HEADgit clean -fgit pull

如果您想保留更改并删除最近的提交

git reset --soft HEAD^git pull

如果您已经推送,请首先在HEAD($GIT_COMMIT_HASH_HERE)中找到您想要的提交,然后运行以下操作:

git reset --hard $GIT_COMMIT_HASH_HEREgit push origin HEAD --force

然后每个存储库被克隆的地方,运行:

git reset --hard origin/master

使用git恢复https://git-scm.com/docs/git-revert。它将恢复所有代码,然后你可以进行下一次提交。然后head将指向最后一次提交。恢复的提交永远不会删除,但它不会影响你的最后一次提交。

当我提交和推送时,我通常会做什么(如果有人推送了他的提交,这就解决了问题):

git reset --hard HEAD~1
git push -f origin

希望这有助于

强行改变历史

假设您不仅要删除最后一次提交,而且要删除最后n次提交的特定提交,请使用:

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

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

添加更改历史

尝试git revert <commit hash>恢复将创建一个新的提交来撤消指定的提交。

假设我们要从存储库中删除提交2和4。(更高的提交数;0是最旧的提交,4是最新的提交)

commit 0 : b3d92c5commit 1 : 2c6a45bcommit 2 : <any_hash>commit 3 : 77b9b82commit 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 Checkout master.
  • git reset --hard b3d92c5将主服务器重置为上次可用的提交。
  • git merge repair将我们的新分支合并到master上。
  • git push -f origin master将master推送到远程存储库。

重置本地分支

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

强制推至原点

git push -f origin

来源:https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

删除最后一次提交

比如你最后的承诺

git推送来源+aa61ab32^: master

现在你想删除这个提交,然后一个简单的方法来做到这一点

步骤

  1. 首先将分支重置为当前提交的父级

  2. 把它推到遥控器上。

git reset HEAD^ --hard
git push origin -f

对于特定的提交,你想要重置如下

git reset bb676878^ --hard
git push origin -f

删除本地提交

如上图所示,我想删除恢复“测试更改2”提交(SHA1 ID:015 b 5220 c 50 e 3 dfb b 1063 f 23789 d 92 a e 1 d 3481 a 2(您可以通过在git bash中使用gitk命令获取SHA1 ID))。

为此,我可以使用(以下所有命令仅在本地工作。删除后需要推送):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2//它会备份您到该提交(测试更改4提交的SHA1 ID为515 b 5220 c 50 e 3 dfb b 1063 f 23789 d 92 a e 1 d 3481 a 2
  2. git reset --hard HEAD~1//它在一次提交之前备份你。
  3. git reset --hard HEAD^//从git中删除最后一次提交

删除后:

删除提交后

我已经推送了。需要远程返回一些提交。尝试了许多变化,但是只有这个Justin通过git Bush对我来说工作正常:

git reset --hard $GIT_COMMIT_HASH_HEREgit push origin HEAD --force
// display git commit log$ git log --pretty=oneline --abbrev-commit
// show last two commit and open in your default editor// then delete second commit line and save it$ git rebase -i HEAD~2

参考:如何删除git中的提交,本地和远程

[快速回答]

你有很多选择,例如:

  • 备选案文1:

    git rebase -i <YourCommitId>~1

    更改您要恢复到的提交的数量。

  • 备选案文2:

    git reset --hard YourCommitIdgit push <origin> <branch> --force

    更改您要恢复到的提交的数量。

    我不推荐这个选择,因为你可能会失去你的半成品。

  • 备选案文3:

    git reset --soft HEAD~1

    你可以保留你的工作,只撤消提交。

在我的情况下,我的魔法代码这个puposs是这样的:

git reset --hard @{u}

测试一下,然后告诉我。我试过几种不同的方法,但这种方法是唯一对我有帮助的。

git reset --hard HEAD~1
你现在将处于上一个头。拉分支。推送新代码。提交将从git中删除

对我来说rebase成功了

$ git rebase -i HEAD~98
# Delete everything except for the most recent commit on the shown editor caused by "rebase"
$ git push origin -f production-static

注意:在强制推送减少我的评论后。然后我推送了另一组文件,然后我尝试在另一台计算机上使用相同的“存储库和分支”拉取。令人惊讶的是,没有冲突。这成为我减少存储库大小的方法,同时避免在使用相同git的其他本地人身上拉取冲突

在这里,我只是发布一个明确的管道来做到这一点

步骤1:使用git log获取提交ID。

git log

在此处输入图片描述

Step2:使用git重置回到以前的版本:

git reset --hard <your commit id>

如果您是IntelliJ用户,界面简直太棒了。使用单击,您可以同时立即看到效果。此位置的快捷方式:MacOS上的Cmd + 9

在此处输入图片描述

这里有超过30个答案,我会简单地说明什么对我有用

删除. git文件夹可能会在您的git存储库中引起问题。如果您想删除所有提交历史记录但将代码保持在当前状态,请按照以下方式执行非常安全:

结帐

git checkout --orphan latest_branch

添加所有文件

git add -A

提交更改

git commit -m "commit message"

删除分支

git branch -D master

将当前分支重命名为master

git branch -m master

最后,强制更新您的存储库

git push -f origin master

PS:这不会保留您的旧提交历史记录。

如果您想删除当前正在执行的提交,但不想删除数据-

git reset --soft HEAD~1

如果您想删除当前正在进行的提交并想删除相关数据-

git reset --hard HEAD~1

PS:这些命令只会删除本地提交。