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

时间:2011-01-10 13:25:16

标签: git

我已经阅读了关于这个主题的类似帖子,并且不能为我的生活弄清楚如何正确地做到这一点。

我检查了大约1000个我不想要的文件,而且我不需要通过1by1将它们全部从回购中删除。

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

它们都处于同一版本。

我想通过1次提交回滚我的遥控器。

master上说我的历史记录是A--B--C--D--E 我想将我的本地回滚到D 然后将其推送到远程,这样我的当前哈希将是D远程和本地。

我有这样的问题。
我正在使用Git Tower,但我对命令行很满意。有什么帮助吗?

更新 下面的好评。似乎部分不鼓励使用重置,尤其是在与其他用户共享存储库的情况下。 在不使用硬重置的情况下撤消上一次提交更改的最佳方法是什么?有办法吗?

14 个答案:

答案 0 :(得分:264)

如果还没有人撤回您的远程仓库,您可以更改分支HEAD并强制将其推送到远程仓库:

git reset --hard HEAD^ 
git push -f 

(或者,如果您可以直接访问远程仓库,则可以更改其HEAD reference even though it is a bare repo

请注意,正如alien-technology中的the comments below在Windows(CMD会话)上所评论的那样,您需要^^

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

  

如果有人已经撤回回购怎么办?那我该怎么办?

然后我会建议一些不会改写历史的东西:

  • git revert 本地您最后一次提交(创建一个新提交,以反转先前提交的内容)
  • 推动' revert'由git revert生成。

答案 1 :(得分:51)

将本地分支设置为一个修订版本(HEAD^表示一个版本返回):

git reset --hard HEAD^

将更改推送到原点:

git push --force

你必须强制推动,否则git会认识到你只有一次提交后面origin而且没有任何改变。

使用--force执行此操作会告诉git覆盖远程仓库中的HEAD,而不考虑其中的任何进展。

答案 2 :(得分:17)

如果你想恢复最后一次提交,请听:

第1步:

使用消息检查您的本地提交

$ git log

第2步:

删除上次提交而不重置本地分支(或主)的更改

$ git reset HEAD^

如果您不想要上次提交文件和更新,则需要

$ git reset HEAD^ --hard

第3步:

我们可以更新文件和代码,并再次需要强制推送它将删除以前的提交。它会保持新的提交。

$ git push origin branch -f

就是这样!

答案 3 :(得分:6)

通过输入bellow命令,您可以看到您的git提交历史记录 -

$ git log

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

步骤1:通过 -

在本地删除最后一次提交

$ git reset --hard HEAD~

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

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

$ git push origin + HEAD

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

<强> P.S。此命令在Mac OSX上进行测试,也可以在其他操作系统上运行(不过声称其他操作系统)

答案 4 :(得分:6)

这是更安全的过程的更新版本。

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

git push -f会随意用您自己的更改替换远程存储库。如果其他人推动了更改,则它们将丢失。 git push --force-with-lease仅在存储库符合您的期望时才推送您的基准。如果其他人已经推送,则推送将失败。

请参见–force considered harmful; understanding git’s –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。这会将其在master之上的所有本地更改重写到新的基于基础的origin/master之上。 -r将保留他们可能进行的所有合并。

我建议将此设置为拉动的默认行为。它很安全,可以处理其他人的重新定基,并减少不必要的合并。

[pull]
        rebase = merges

答案 5 :(得分:2)

对于Windows计算机,请使用:

git reset HEAD~1  #Remove Commit Locally

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

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

1.通过恢复提交:

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

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

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

或者您可以使用该提交的哈希值恢复到任何先前的提交。例如:

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

2.通过重置以前的 Head

如果您只想指向任何先前的提交,请使用 reset;它将您的本地环境指向先前的提交。您可以将您的头部重置为之前的提交或将您的头部重置为之前的任何提交。

重置为之前的提交。

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

重置为之前的任何提交:

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

REVERT 和 RESET 之间的交易:

为什么您会选择对重置操作进行还原?如果您已经将提交链推送到远程存储库(其他人可能已经在那里拉取了您的代码并开始使用它),则还原是取消他们更改的更好方法。这是因为 Git 工作流程适用于在分支的末尾获取额外的提交,但如果有人将分支指针重新设置回来时,链中不再看到一组提交,这可能具有挑战性。

答案 8 :(得分:0)

如果您可以直接访问远程仓库,则可以始终使用:

git reset --soft HEAD^

这是有效的,因为没有尝试修改不存在的工作目录。有关详细信息,请参阅原始答案:

How can I uncommit the last commit in a git bare repository?

答案 9 :(得分:0)

我只想删除远程和清除提交历史记录中的最后一次提交。 以下工作就像一个魅力

git reset --hard HEAD^ 
git push -f 

答案 10 :(得分:0)

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

$ 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)

答案 11 :(得分:0)

如果您只想从远程存储库中删除最后一个提交而又不弄乱本地存储库,那么这里是一个单行代码:

git push origin +origin/master~:master

这使用以下语法:

git push <remote> <refspec>

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

+origin/master~:master

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

答案 12 :(得分:0)

对我来说,这两个命令起作用:

git checkout commit_id
git push origin +name_of_branch

答案 13 :(得分:0)

您也可以这样做:

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

,并让其他所有收到最新错误提交的人重置:

git reset --hard origin/master