我想放弃提交<commit-hash>
后完成的所有更改。
所以我做了:
git reset --hard <commit-hash>
现在我想对我的遥控器做同样的事情。我怎样才能做到这一点?我在<commit-hash>
之后做了一些提交(并推送),我只是想把它们全部丢弃。只是在某种程度上非常错了,我不想让它变得比现在更糟糕。 ;(
我基本上想将origin/master
后退到<commit-hash>
答案 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)
如果您不介意丢失本地更改,请使用其他答案。如果选择错误的提交哈希值,此方法仍可能会破坏您的遥控器。
如果您只想让远程匹配成为本地分支中已有的提交:
git log
查找您想要远程设置的提交的哈希值。 git log -p
查看更改,git log --graph --all --oneline --decorate
查看压缩树。 (将最后一个作为shell中的别名非常方便。)运行如下命令:
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)
源树:将远程重置为特定提交
答案 8 :(得分:0)
做一件事, 得到提交的SHA号。比如87c9808然后,
错误:无法将某些引用推送到 'https://github.com/YOURREPOSITORY/AndroidExperiments.git' 提示:更新被拒绝,因为您当前分支的提示落后 提示:它的远程对应物。整合远程更改(例如 提示:'git pull ...')然后再推。**
git push --force origin master
答案 9 :(得分:0)
假设您的分支在本地和远程都被称为 master,并且您的 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