2010-01-06 226 views
10

刚才我承诺并推了一些东西(是的,我的错推),我决定我应该'恢复'或'撤消'。所以我被告知在我的最后发行git reset --soft HEAD^,并且我认为这会以某种方式创建一个“恢复”提交,一旦提交就会使更改从未发生。我不介意改变的历史是否存在,这正是我所想象的。git reset --soft HEAD^

无论如何,做完这些之后我又犯了一次,然后当我试图推动时,我得到了非快进错误。现在,我知道我把重置的东西搞砸了,现在我的树和原点树的东西都是'不匹配'的,但我想知道如何解决这个问题。现在我只想回到发布重置之前的时间,以便手动将它们手动取出然后提交,除非其他人可以推荐恢复推送提交的正确方法,并且通过这并不意味着历史必须从日志或任何东西中消失。

回答

7

如果我正确理解你的问题,你可以尝试以下方法:

(我假设这是你的“主”分支,你是推到“原点”)

同步了远程达到相同的状态。

git remote update 
git checkout master 
git merge origin/master 

现在恢复你的提交

git revert HEAD (or where ever the commit you want to revert is now) 
git commit -av 

同步了远程

git push 
0

你想使用git revert HEAD创建一个新的承诺,将撤消在HEAD的提交。相反,您只是将HEAD移回到当前HEAD之前的提交。

+0

谢谢,这是有道理的,虽然这可能会更好,因为它并没有真正解决我的问题。不过谢谢。 – 2010-01-06 22:10:13

5

现在我只想回去之前,我发出复位

如果你只是想取消的时候git reset --soft你只是做了,你可以看一下前负责人提交ID在reflogs

$ git reflog 
$ git reset --soft formerCommit 

然后你就可以准备git revert

+0

谢谢,这与IRC上的某个人告诉我要做的事情相似,但这很让人困惑,所以我将与rnicholson的答案一起用于记录目的。 – 2010-01-06 22:16:04

+1

我不熟悉git reflog。很酷。学到了新东西。这可能是一个更好的解决方案,因为它将我的答案的前三个步骤浓缩为一个命令。 – rnicholson 2010-01-06 22:23:10

0

虽然我的回答是超出你的要求,我认为这实际上是你打算做的。您使用git reset --soft HEAD^撤消您提交的提交。这之前,你的承诺(因为HEAD点返回工作副本的状态,以你目前的承诺,并HEAD^指向一个之前(假定只有一个父)。

但是现在,当你git push你被告知的东西像:

! [rejected]   <branch> -> <branch>e (non-fast-forward) 
error: failed to push some refs to 'ssh://<remote server>/<remote path>' 
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. 

这是说,提交不排队,它的存在阻止你犯了一个错误,错误消息是有点误导,你不想做什么暗示。 (拉动你的分支同步)你只能知道不这样做是因为你的意图。

可以解决这个只是得到一个--force(或-f)(*):

git push --force 

您可能需要重新设置上游:

git push --force --set-upstream origin <branch> 

请注意,这将有如果其他人已经撤回你的工作,将会产生后果,因为将会有不同的提交(可能)进行相同的更改。请参阅https://www.kernel.org/pub/software/scm/git/docs/user-manual.html#problems-With-rewriting-history

为了防止,永远只能做推到你的分支任何问题(不是一些公共分支 - 例如development分支的开发者合并其所有功能分支成),并一定要在你的团队开放的沟通

开发人员将通常使用这个模式我称之为周五下午提交您希望在情况的硬件故障周末前保存您的工作(但回到上周一提交前的状态) 。

*Friday* 

git add --all # To add all files whether they are tracked or not 
git commit -m "Friday afternoon commit" 
git --set-upstream push  # --set-upstream is for if the branch doesn't exist on the remote server 

*Monday* 

git reset --soft HEAD^ 
git push -f --set-upstream origin <branch> 

做这种方式,而在另一个答案讨论git revert的好处,是避免多余的提交。重置将有2个提交,这种方式将没有(没有额外的)。 git reset的优势在于它不会重写历史记录,所以更安全,特别是如果您不确定自己在做什么。

(*)通常将存储库配置为不让您执行此操作以便掌握 - 修复分支并创建拉取请求。因为如果你已经阅读过上面的链接,重写master的历史将产生严重的后果(除非你是唯一一个克隆该代码的人)。

相关问题