将远程重置为某个提交

时间:2011-04-28 09:46:48

标签: git

我想放弃提交<commit-hash>后完成的所有更改。 所以我做了:

git reset --hard <commit-hash>

现在我想对我的遥控器做同样的事情。我怎样才能做到这一点?我在<commit-hash>之后做了一些提交(并推送),我只是想把它们全部丢弃。只是在某种程度上非常错了,我不想让它变得比现在更糟糕。 ;(

我基本上想将origin/master后退到<commit-hash>

11 个答案:

答案 0 :(得分:978)

假设您的分支在这里和远程都被称为master,并且您的远程调用origin,您可以这样做:

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

但是,如果其他人正在使用您的远程存储库并撤消了您的更改,则应该避免这样做。在这种情况下,revert提交你不想要的提交会更好,然后按正常方式推送。

更新:您已经在下面解释过,其他人已经撤消了您推送的更改,因此更好地创建了一个可以恢复所有这些更改的新提交。对于this answer from Jakub Narębski中执行此操作的选项,有一个很好的解释。哪一个最方便取决于您想要还原的提交数量,以及哪种方法对您最有意义。

由于您的问题显然已经使用git reset --hard来重置master分支,因此您可能需要先使用git reset --hard ORIG_HEAD将分支移回原来的位置之前。 (与git reset --hard一样,确保git status是干净的,您是在正确的分支上,并且您知道git reflog是恢复明显丢失的提交的工具。 )您还应该检查ORIG_HEAD是否指向正确的提交,并git show ORIG_HEAD

答案 1 :(得分:88)

如果您不介意丢失本地更改,请使用其他答案。如果选择错误的提交哈希值,此方法仍可能会破坏您的遥控器。

如果您只想让远程匹配成为本地分支中已有的提交:

  1. 执行任何重置。
  2. 使用git log查找您想要远程设置的提交的哈希值。 git log -p查看更改,git log --graph --all --oneline --decorate查看压缩树。 (将最后一个作为shell中的别名非常方便。)
  3. 复制哈希。
  4. 运行如下命令:

    git push --force <remote> <the-hash>:<the remote branch>
    

    e.g。

    git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
    

答案 2 :(得分:53)

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

git reset --hard <commit-hash> 
git push -f <remote> <local branch>:<remote branch> 

答案 3 :(得分:6)

我对之前答案的两分钱:如果

git push --force <remote> <the-hash>:<the remote branch>

仍然不起作用,您可能想要编辑<your-remote-repo>.git/config文件的接收部分:

[receive]
  #denyNonFastforwards = true
  denyNonFastforwards = false

答案 4 :(得分:5)

如果你想要一个以前版本的文件,我建议你使用git checkout。

git checkout <commit-hash>

这样做会及时发回给你,它不会影响你项目的当前状态,你可以来主线     git checkout主线

但是当你在参数中添加一个文件时,该文件会被带回给你 从上一次到您当前的项目时间,即您当前的项目已更改并需要提交。

git checkout <commit-hash> -- file_name
git add .
git commit -m 'file brought from previous time'
git push

这样做的好处是它不会删除历史记录,也不会还原特定的代码更改(git revert)

点击此处https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout

答案 5 :(得分:5)

在GitLab上,您可能需要在执行此操作之前将分支设置为不受保护。您可以在[repo]&gt;中执行此操作设置&gt;存储库&gt;受保护的分支机构。那么马克答案的方法就可以了。

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

答案 6 :(得分:1)

如果您的分支不是开发或生产分支,那么实现此目的的最简单方法是在本地重置为某个提交并从那里创建一个新分支。您可以使用:

git checkout 000000

(其中000000是您要提交的提交ID)在有问题的分支中,然后只需创建一个新分支:

git remote add [name_of_your_remote]

然后您可以创建一个新的PR,一切都会正常!

答案 7 :(得分:1)

源树:将远程重置为特定提交

  1. 如果您对远程(origin / feature / 1337_MyAwesomeFeature)进行了错误提交,如下图所示:

Go to Remotes

  1. 转到“遥控器”>“源”>“功能”> 1337_MyAwesomeFeature
  2. 右键单击并选择“删除origin / feature / 1337_MyAwesomeFeature”(如果要备份,请更改其名称,并跳过步骤4。)
  3. 单击“强制删除”,然后单击“确定”。

enter image description here enter image description here

  1. 选择您的旧提交,然后选择“将当前分支重置为此提交”
  2. 选择您想要的模式(如果您不希望最后一次更改,则选择硬模式),然后选择“确定”。

enter image description here enter image description here

  1. 将此提交推送到新的原点/功能/ 1337_MyAwesomeFeature enter image description here

  2. 您的本地功能分支和远程功能分支现在位于上一次(您选择的)提交中 enter image description here

答案 8 :(得分:0)

做一件事, 得到提交的SHA号。比如87c9808然后,

  1. 移动自己,这是你指定的提交(通过做 git reset --hard 89cef43 //在这里提到你的号码)
  2. 接下来在随机文件中进行一些更改,以便git会要求您在本地提交,然后远程提交 因此,你现在需要做的是。 申请变更后 git commit -a -m“trial commit”
  3. 现在推送以下提交(如果已在本地提交) 通过 git push origin master
  4. 现在git会问你的是
  5.   

    错误:无法将某些引用推送到   'https://github.com/YOURREPOSITORY/AndroidExperiments.git'   提示:更新被拒绝,因为您当前分支的提示落后   提示:它的远程对应物。整合远程更改(例如   提示:'git pull ...')然后再推。**

    1. 因此,现在你可以做的是
    2. git push --force origin master

      1. 因此,我希望它有效:)

答案 9 :(得分:0)

假设您的分支在本地和远程都被称为 ma​​ster,并且您的 remote 被称为 origin,您可以这样做:

git reflog 要获取所有提交历史记录,您的 commit hash 格式如下:e34e1ff

git reset --hard <commit-hash>

git push -f origin master

答案 10 :(得分:-2)

在Atlasssian博客上学习部分:撤消公开提交并使用还原 https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting