我想放弃commit之后所做的所有更改<commit-hash>
。所以我做了:
git reset --hard <commit-hash>
现在,我想对遥控器执行相同的操作。我怎样才能做到这一点?之后,我做了一些提交(和推送)<commit-hash>
,我只想丢弃它们。只是方式出了什么问题而已,我不想使其变得比现在更糟。;(
我基本上想倒origin/master
带到<commit-hash>
我想放弃commit之后所做的所有更改<commit-hash>
。所以我做了:
git reset --hard <commit-hash>
现在,我想对遥控器执行相同的操作。我怎样才能做到这一点?之后,我做了一些提交(和推送)<commit-hash>
,我只想丢弃它们。只是方式出了什么问题而已,我不想使其变得比现在更糟。;(
我基本上想倒origin/master
带到<commit-hash>
Answers:
假设您的分支master
在这里和远程都被调用,并且您的远程被调用origin
,则可以执行以下操作:
git reset --hard <commit-hash>
git push -f origin master
但是,如果其他任何人正在使用远程存储库并撤消更改,则应避免这样做。在这种情况下,最好还原不需要的提交,然后按正常方式推送。
更新:您已经在下面说明其他人撤消了您已推送的更改,因此最好创建一个新的提交以还原所有这些更改。JakubNarębski的回答中有一个很好的解释,说明了您可以执行此操作的选项。哪一个最方便取决于您要还原的提交数量,以及哪种方法对您最有意义。
由于从您的问题中可以很明显地看出您已经使用git reset --hard
过重置master
分支的方法,因此您可能需要先使用git reset --hard ORIG_HEAD
来将分支移回之前的位置。(和往常一样git reset --hard
,请确保它git status
是干净的,您位于正确的分支上,并且已意识到git reflog
它是恢复显然丢失的提交的工具。)您还应该使用来检查ORIG_HEAD
指向正确的提交的位置git show ORIG_HEAD
。
故障排除:
如果收到类似“ ![远程拒绝] a60f7d85-> master(预接收挂钩被拒绝) ”的消息
那么您必须允许为特定分支重写分支历史记录。例如,在BitBucket中,它说“不允许重写分支历史记录”。有一个Allow rewriting branch history
必须选中的复选框。
git update-ref
代替reset --hard
; 它可以让你做同样的而不是在工作树/签出的分支
revert
但是可以说我想还原过去的4次提交,所以我应该做git revert comit1; git push; git revert comit2; git push; ...
还是简单地做git revert commit4; git push
?
git revert commit4
创建一个新的提交,该提交只会撤消在中引入的更改commit4
。但是,正如我链接到的答案所指出的那样,您可以将它们汇总为一个提交。
git reset --hard
但是我已经删除了本地文件并再次从原点撤出,所以我可以这样做。git revert ...
我的疑问是:我是否必须还原每个提交并一次推入(一个接一个)还是只还原第一个提交之后的提交?仅正确提交?
.git
用他们本不想创建的ref来填充目录。我说错了,但是没有安全检查。您可以在git手册页中找到“管道”和“瓷器”命令的分类。
如果您不介意丢失本地更改,请使用其他答案。如果您选择了错误的提交哈希值,该方法仍然会破坏您的遥控器。
如果您只想使远程匹配成为本地存储库中任何位置的提交,则:
git log
找到你想要的遥远,在提交。git log -p
查看更改或git log --graph --all --oneline --decorate
查看紧凑的树。运行如下命令:
git push --force <remote> <commit-ish>:<the remote branch>
例如
git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
要么
git push --force staging v2.4.0b2:releases
我使用方便的别名(git go
)来查看历史记录,如步骤2所示,可以这样添加:
git config --global alias.go 'log --graph --all --decorate --oneline'`
git config --global alias.graph 'log --graph --all --decorate --oneline'
不太混乱,您仍然可以限制它,例如:git graph -5
q
以退出git日志。2分钟,我永远都不会回来。
less
,这q
是正常的方式。Git Bash就像一个* nix终端。
我通过以下命令解决了像您这样的问题:
git reset --hard <commit-hash>
git push -f <remote> <local branch>:<remote branch>
如果您想要文件的早期版本,建议使用git checkout。
git checkout <commit-hash>
这样做将使您及时返回,不会影响项目的当前状态,您可以进入主线git checkout mainline
但是,当您在参数中添加文件时,该文件会从前一个时间带回到您当前的项目时间,即,您当前的项目已更改,需要提交。
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
我对先前答案的两分钱:如果
git push --force <remote> <the-hash>:<the remote branch>
仍然不起作用,您可能要编辑<your-remote-repo>.git/config
文件的接收部分:
[receive]
#denyNonFastforwards = true
denyNonFastforwards = false
如果您的分支机构不是开发部门也不是生产部门,那么最简单的方法是在本地重置为某个提交并从那里创建一个新分支。您可以使用:
git checkout 000000
(其中000000是您要转到的提交ID)在有问题的分支中,然后只需创建一个新分支:
git remote add [name_of_your_remote]
然后,您可以创建一个新的PR,一切都会正常!
做一件事,获取提交的SHA号。例如87c9808然后
错误:无法将某些引用推送到“ https://github.com/YOURREPOSITORY/AndroidExperiments.git ”提示:由于当前分支的提示位于提示:其远程对应的后面,因此拒绝更新。在再次按下之前,集成远程更改(例如提示:'git pull ...')。**
git push --force origin master
Sourcetree:将远程重置为特定提交
origin/master
没有被其他用户所吸引和推崇吗?您始终希望避免更改公共(即非本地)存储库的历史记录。