通过1次提交回滚本地和远程git存储库

我读过关于这个主题的类似帖子,但我不知道如何正确地做到这一点。

我签入了大约1000个我不想要的文件,我宁愿不需要逐个检查并将它们全部从回购中删除。

  • 我有一个远程master分支。
  • 我有本地master分支。

他们都在同一个修订。

我想回滚我的远程1提交。

说我在master上的历史是A--B--C--D--E 我想回滚本地到D.
然后把它推到远程,所以我的当前哈希将是D远程和本地。< / p >

我做这个有问题 我正在使用Git Tower,但对命令行很熟悉。任何帮助吗?< / p >

< >强更新: 下面的评论很棒。使用重置似乎在一定程度上是不鼓励的,特别是当存储库与其他用户共享时。 撤销之前提交的更改而不使用硬复位的最好方法是什么?有办法吗?

155667 次浏览

如果还没有人拉你的远程回购,你可以改变你的分支HEAD,并强制将其推到远程回购:

git reset --hard HEAD^
git push -f

(或者,如果你可以直接访问远程回购,你可以改变它的HEAD参考,即使它是一个裸回购)

注意,正如外星人技术下面的评论中所注释的那样,在Windows (CMD会话)上,你需要^^:

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

然后呢?正如的评论乔恩·施耐德所指出的:

如果命令带有"HEAD^"error no matches found: HEAD^中的结果,参见“;__abc3”;

更新自2011年:
使用git push --force-with-lease (我在这里展示的, 2013年在Git 1.8.5中引入)更安全

参见Schwern回答来说明。


如果已经有人收回了呢?那我该怎么办?

那我建议一些不会改写历史的事情:

  • git revert本地你的最后一次提交(创建一个新的提交,它将反转前一次提交所做的)
  • push由git revert生成的'revert'。

将本地分支向后设置一个修订版本(HEAD^表示向后设置一个修订版本):

git reset --hard HEAD^

将更改推至原点:

git push --force

你必须强制push,否则git会在一次提交时就识别出你落后于origin,什么都不会改变。

--force做这件事告诉git在远程回购中覆盖HEAD,而不考虑那里的任何改进。

如果你可以直接访问远程回购,你可以使用:

git reset --soft HEAD^

这是可行的,因为没有尝试修改不存在的工作目录。欲了解更多详情,请参阅原答案:

如何取消在git裸库中的最后一次提交?< / >

如果你想还原上次提交,请听:

步骤1:

检查带有消息的本地提交

$ git log

步骤2:

在不重置本地分支(或主分支)更改的情况下删除最后一次提交

$ git reset HEAD^

或者如果你不想最后提交文件和更新监听

$ git reset HEAD^ --hard

步骤3:

我们可以更新文件和代码,再次需要推动与力量,它将删除以前的提交。它将保持新的提交。

$ git push origin branch -f

就是这样!

对于Windows机器,使用:

git reset HEAD~1  #Remove Commit Locally

我用这个命令解决了你的问题:

git reset --hard HEAD^
git push -f <remote> <local branch>:<remote branch>

我只是想从远程和清除提交历史中删除上次提交。 下面的工作就像一个魔法

git reset --hard HEAD^
git push -f

重置头部并恢复到前一次提交的方法是通过

$ git reset HEAD^ --hard
$ git push <branchname> -f

但有时它可能不被远程分支接受:

To ssh:<git repo>
! [rejected]        develop -> develop (non-fast-forward)
error: failed to push some refs to 'ssh:<git repo>'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

另一种方法是

git revert HEAD
git push <remote branch>

这很好。

注意:记住如果git push -f <force>失败,然后你尝试恢复。在此之前执行git pull,以便远程和本地是同步的,然后再尝试git revert
检查git log以确保远程和本地在同一点提交相同的SHA1..

git revert
A --> B --> C -->D
A--> B --> C --> D --> ^D(taking out the changes and committing reverted diffs)

在本地主机上

git reflog
-- this will list all last commit
e.g Head@{0} -- wrong push
Head@{1} -- correct push
git checkout Head@{1} .
-- this will reset your last modified files


git status
git commit -m "reverted to last best"
git push origin/master

没必要担心别人拉不拉。

完成了!

通过输入以下命令,你可以看到你的git提交历史-

git日志美元

假设你在那个特定分支上的历史是- commit_A, commit_B, commit_C, commit_D。其中,commit_D是最后一次提交,这是HEAD保留的位置。现在,要从本地和远程删除上次提交,您需要执行以下操作:

步骤1:通过-删除上一次本地提交

git重置-硬头~美元

这将把您的提交HEAD更改为commit_C

步骤2:将新HEAD提交的更改推送到远程

git push origin +HEAD美元

该命令将从远程删除最后一次提交。

附注:此命令在Mac OSX上进行了测试,应该也可以在其他操作系统上运行(但不声明其他操作系统)

如果你只想在不破坏本地存储库的情况下从远程存储库中删除最后一次提交,这里有一行代码:

git push origin +origin/master~:master

使用以下语法:

git push <remote> <refspec>

这里,<remote>origin,而<refspec>的结构如下:

+origin/master~:master

详细信息可以在git-push(1)中找到。前面的+表示“强制推此ref”,而另一部分表示“从origin/master~master(远程origin)”。不难知道origin/master~origin/master之前的最后一次提交,对吗?

这是更安全的更新版本。

git reset --hard HEAD^
git push --force-with-lease

git push -f将不加区别地用您自己的更改替换远程存储库。如果是其他人推动了变革,他们就会迷失。git push --force-with-lease只会推动你的rebase如果存储库是你所期望的。如果别人已经推动了你的努力,你的努力就会失败。

看到-被认为有害的力量;理解git的-force-with-lease

我建议将其别名为repush = push --force-with-lease

如果已经有人收回了呢?那我该怎么办?

告诉他们git pull --rebase=merges。它不是git fetch origingit merge origin/master,而是git fetch origingit rebase -r origin/master。这将在新的重基origin/master之上重写它们的任何局部更改为master-r将保留他们可能做出的任何合并。

我建议将此设置为拖动的默认行为。它是安全的,将处理其他的重基,并导致较少不必要的合并。

[pull]
rebase = merges

对我来说有两个命令:

git checkout commit_id
git push origin +name_of_branch

你还可以这样做:

git reset --hard <commit-hash>
git push -f origin master

并让所有获得最新糟糕提交的人重置:

git reset --hard origin/master

* * 简短回答关于恢复和重置的问题 * *

有很多方法可以做到这一点。根据您的需求,从下面选择任何内容。

1. 通过REVERTing commit:

如果你想要恢复你上次提交的所有更改,这意味着如果你在你的文件中添加了一些东西,在恢复完成后将被删除。如果你删除文件中的某些东西,还原过程将添加这些文件。

您可以还原最后一次提交。如:

1.git revert HEAD^
2.git push origin <Branch-Name>

或者您可以使用该提交的散列恢复到任何以前的提交。如:

1.git revert <HASH>
OR git revert -m 1 <HASH> if the commit is a merge commit
2.git push origin  <Branch-Name>

2. 通过重置前头部

如果你只想指向之前的提交使用reset;它将本地环境指向上一次提交。你可以重置你的头到以前的提交或重置你的头到以前的任何提交。

重置到最后一次提交。

1.git reset HEAD^
2.git push -f origin <Branch-name>

重置到任何以前的提交:

1.git reset <HASH>
2.git push -f origin <Branch-name>

REVERT &之间的贸易;重置:

  1. 为什么要选择还原而不是重置操作?如果您已经将提交链推到远程存储库(其他人可能已经提取了您的代码并开始使用它),那么恢复是为他们取消更改的更好方法。这是因为Git工作流可以很好地在分支的末尾获取额外的提交,但是当有人将分支指针重置回来时,如果在链中不再看到一组提交,那么它就具有挑战性。

  2. 重置一个分支可能会破坏你到目前为止所做的事情。因为当你重置一次提交时,GIT会删除在这次提交之后所做的所有提交。一个愚蠢的错误就能毁掉你所有的努力,也不会保留你正在重置的任何历史。另一方面,在这种情况下,恢复提交是更好的选择。当您恢复提交时,GIT会创建一个新的提交,其中包含与您希望恢复的提交完全相反的更改。它指向树枝的末端。这样就不会把这个愚蠢的错误搞砸了。