关于git-rebase:从git中的分支中删除提交

Delete commits from a branch in Git

我想知道如何删除提交。

delete中,我的意思是,好像我没有做出承诺,当我在将来进行推送时,我的更改不会推送到远程分支。

我读了Git帮助,我想我应该使用的命令是git reset --hard HEAD。这是正确的吗?


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

假设您坐在提交上,那么这个命令会搞乱它…

1
git reset --hard HEAD~1

HEAD~1是指在head之前的承诺。

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

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


如果你已经推了它,你将需要做一个强制推来摆脱它…

1
git push origin HEAD --force

然而,如果其他人可能已经拉了它,那么你最好开始一个新的分支。因为当他们拉的时候,它会合并到他们的工作中,你会再次把它推回原位。

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


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


最后,如果您需要找到一个"已删除"的提交,那么它通常会出现在git reflog中,除非您已经垃圾收集了您的存储库。


如果您还没有在任何地方推送提交,那么可以使用git rebase -i删除该提交。首先,了解提交的时间(大约)有多远。然后这样做:

1
git rebase -i HEAD~N

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

Git的书中有一个很好的部分,介绍了如何用图片和示例进行重新调整。

但是要小心,因为如果你改变了你在别处推过的东西,除非你打算进行强制推,否则就需要另一种方法。


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

1
git rebase -i <commit>~1

这将在您想要攻击的提交之前以交互模式-i启动rebase。编辑器将开始列出此后的所有提交。删除包含要删除的提交的行并保存文件。Rebase将完成剩下的工作,只删除该提交,并将所有其他提交重新放回到日志中。


我附加这个答案是因为我不明白为什么任何刚尝试过提交工作的人都会因为使用git时出错而想要删除所有的工作!

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

1
git reset --soft HEAD~1

不要使用--hard标志,除非您希望销毁自上次提交以来正在进行的工作。


删除整个提交

1
git rebase -p --onto SHA^ SHA

显然,将"sha"替换为要删除的引用。该命令中的"^"是文字。

http://sethrobertson.github.io/gitfixum/fixup.html


如果没有发布更改,要删除最新的提交,可以执行以下操作

1
$ git reset --hard HEAD^

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

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

1
$ git revert HEAD


1
2
3
git reset --hard commitId

git push <origin> <branch> --force

ps:commitid指的是您想要恢复到的那个


强制改变历史

假设您不只是想删除最后一次提交,而是想删除最后n次提交的特定提交,请执行以下操作:

git rebase -i HEAD~,所以如果你想看到最后五个承诺,git rebase -i HEAD~5

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

附加更改历史记录

试试git revert 。Revert将创建一个撤消指定提交的新提交。


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

1
git reset HEAD~1

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

如果要取消提交n个提交,但要保留工作目录中的代码更改:

1
git reset HEAD~N

如果您想摆脱最近的提交,而不想保留代码更改,可以执行"硬"重置。

1
git reset --hard HEAD~1

同样,如果您希望放弃最后n次提交,而不希望保留代码更改:

1
git reset --hard HEAD~N


假设我们要从回购协议中删除承诺2和4。

1
2
3
4
5
commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 :
commit 3 : 77b9b82
commit 4 :

注:由于您使用的是--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将master重置为last usable commit。
  • git merge repair把我们的新分支合并到master上。
  • git push -f origin master将master推到远程repo。


1
git rebase -i HEAD~2

这里的"2"是您想要重新平衡的提交数。

1
'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"简单地删除该提交,或者删除具有该提交的行。


要在本地分支中删除,请使用

1
git reset --hard HEAD~1

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

1
git push origin HEAD --force

错误:

我用git rebase -i --root修改了我的分支,无知地认为我可以修改与主提交不同的第一个提交(用于Windows的Github默认视图是与主提交的比较,隐藏了它的完整性)。

我留着硅谷的胡须,900多个承诺让自己变得高尚。退出时没有任何变化,我充电,然后开始刮胡子,因为所有900+个人承诺,无意识地重新平衡-重置他们的承诺时间到现在。

为了打败Git并保留原来的时间,我删除了这个本地存储库并从远程重新克隆。

现在,它又增加了一个最新的不必要的承诺,我想删除主人,所以这样继续下去。

耗尽选项:

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

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

为了获取最新的sha,我检查了github.com上的远程存储库-minor win。

在认为git reset --hard 已经工作之后,我更新了另一个分支,让master和1…2…噗!承诺又回来了-吉特赢了。

退房到master,该试试git rebase -i 了,然后把线路移开……没用,可悲的说。"如果在此处删除一行,则提交操作将丢失"。啊…掩盖了2.8.3发行说明中的n00b新特性。

解决方案:

git rebase -i ,然后是d, drop = remove commit

为了验证,我去了另一个分支,瞧,没有隐藏承诺从主服务器获取/拉。

祝你生日快乐。


另一种方法是:

签出要还原的分支,然后将本地工作副本重置回要成为远程服务器上最新的提交(之后的所有内容都将变为再见)。为此,在SourceTree中,我右键单击并选择"将BranchName重置为此提交"。我认为命令行是:

1
git reset --hard COMMIT_ID

因为您刚刚从远程签出了分支,所以不会有任何本地更改来担心丢失。但如果你这样做的话,就会失去他们。

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

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

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


上面的所有命令都会像提交之前一样还原工作树和索引的状态,但不要还原存储库的状态。如果您查看它,"删除的"提交实际上并没有被删除,它只是不是当前分支尖端的提交。

我认为没有办法取消用瓷命令的承诺。唯一的方法是从日志和reflog中删除它,然后执行git prune --expire -now


如果您刚刚弄乱了上次提交的内容(错误的消息,忘记添加一些更改),并希望在将其推送到公共回购之前修复它,为什么不使用:

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

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

当然,如果您在推后修改了一个提交,那么您将重写历史,因此如果您这样做,一定要理解它的含义。

如果希望使用上一个提交的消息,也可以传递"--no edit"选项而不是"-m"。

Docs:网址:http://git-scm.com/docs/git-commit.html


如果要保留历史记录,显示提交和还原,则应使用:

1
git revert GIT_COMMIT_HASH

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

1
git push

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


资料来源:https://gist.github.com/sagarjethi/c077223b2f4fa74ad8bdf229166cf79d8

删除最后一次提交

例如,上一次提交

git push-origin+aa61ab32^:master

现在您想删除这个提交,然后用一个简单的方法来完成下面的操作

步骤

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

  • 用力推到遥控器上。

  • 1
    2
    3
    git reset HEAD^ --hard

    git push origin -f

    对于特定的提交,您要重置的内容如下

    1
    2
    3
    git reset bb676878^ --hard

    git push origin -f

    如果您已经推了,首先找到您想要的提交(这里是git-commit-hash),然后运行以下命令:

    1
    2
    git reset --hard $GIT_COMMIT_HASH_HERE
    git push origin HEAD --force

    然后复制repo的每个位置,运行:

    1
    git reset --hard origin/master


    当我承诺和推动的时候我通常做什么(如果有人推动他的承诺,这就解决了问题):

    1
    2
    3
    git reset --hard HEAD~1

    git push -f origin

    希望这有帮助


    在本地分支上重置

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

    强制推到原点

    1
    git push -f origin

    我已经pushed。这对一些commits remotly后返回。 有太多的变化tried, 但这只通过布什在NEA从贾斯廷我们工作精细的方法: </P >

    1
    2
    git reset --hard $GIT_COMMIT_HASH_HERE
    git push origin HEAD --force

    将代码备份到临时文件夹中。以下命令将重置服务器。

    1
    2
    3
    git reset --hard HEAD
    git clean -f
    git pull

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

    1
    2
    git reset --soft HEAD^
    git pull

    delete local commit </P >

    你们可以在这是我想删除的图像恢复的"测试的变化2"Commit(SHA1 015b5220c50e3dfbb1063f23789d92ae1d3481a2(ID:你可以通过使用SHA1 id gitkget命令的bash的NEA))。 </P >

    那我可以用下面的命令下工作(使用的是本地的只。这些对你的推后删除): </P >

  • git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2/ /它反向放大,你去那Commit(提交身份证的SHA1值的变化在515b5220c50e3dfbb1063f23789d92ae1d3481a2试验4)
  • git reset --hard HEAD~1/ / IT后台提交你的前一个。
  • git reset --hard HEAD^/ / to remove NEA从提交的孩子
  • 售后服务:删除 </P >

    after delete commit </P >


    Git重置--硬

    Git推原点--力

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


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


    使用git revert https://git-scm.com/docs/git-revert。它将还原所有代码,然后您可以进行下一次提交。然后head将指向最后一次提交。还原提交从不删除,但不会影响上一次提交。