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

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

我有一个远程主分支。 我有本地主分支。

他们都在同一个修订。

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

我的历史是A- B- C- D- E。 我想回滚我的本地到D。 然后把它推到远程,所以我的当前哈希将是D远程和本地。

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

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


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

git reset --hard HEAD^ 
git push -f 

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

注意,正如alien-technology在下面的评论中所评论的,在Windows (CMD会话)上,你需要^^:

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

然后呢?正如Jon Schneider的评论所指出的:

如果带有“HEAD^”的命令导致错误,没有找到匹配:HEAD^,请参阅“git show HEAD^似乎没有工作。”这正常吗?”

自2011年更新: 使用git push——force-with-lease(我在这里介绍的是2013年git 1.8.5引入的)更安全。

参见Schwern的回答。


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

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

Git在本地恢复你的最后一次提交(创建一个新的提交来反转前一次提交所做的) Push由git revert生成的'revert'。


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

git reset --hard HEAD^

将更改推至原点:

git push --force

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

使用——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日志,以确保远程和本地在同一点提交相同的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 推送原点 +头

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

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


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

git push origin +origin/master~:master

使用以下语法:

git push <remote> <refspec>

这里,<remote>是origin, <refspec>有以下结构:

+origin/master~:master

详见git-push(1)。前面的+表示“force push this ref”,另一部分表示“from origin/master~ to master (from remote 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 origin和git merge origin/master,而是git fetch origin和git 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>
2.git push origin  <Branch-Name>

或者如果提交是合并提交,你可以尝试这样做:

1.git revert -m 1 <HASH> (-m 1 refers to the first parent of two merged branches)
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和RESET之间的交易:

Why would you choose to do a revert over a reset operation? If you have already pushed your chain of commits to the remote repository (where others may have pulled your code and started working with it), a revert is a nicer way to cancel out changes for them. This is because the Git workflow works well for picking up additional commits at the end of a branch, but it can be challenging if a set of commits is no longer seen in the chain when someone resets the branch pointer back. And resetting a branch can be destroying what you have done till now.Because when you reset a commit, GIT will delete all the commits that have done after this commit.One silly mistake can destroy all your hard work and it doesn't keep any history what you are resetting. On the other hand reverting a commit is better option in this scenario. When you revert a commit, GIT creates a new commit with the completely opposite changes of the commit you are willing to revert.And it points to the end of that branch. So it won't mess up anything on our silly mistake.