刚才我承诺并推送了一些东西(是的,我在推送上的错误)我认为应该'还原'或'撤消'。所以我被告知要在我的最后发出git reset --soft HEAD^
,我想这会以某种方式创建一个'revert'提交,一旦提交就会让它好像改变从未发生过。我不介意改变的历史是否存在,这正是我想象的那样。
无论如何,完成后我再次提交,然后当我试图推动时,我得到了非快进错误。现在,我知道我搞砸了重置,我的树和起源树的线条现在“不匹配”,但我想知道如何解决这个问题。现在我只想回到我发出重置之前的时间,这样我就可以通过手动取出它们然后提交来手动恢复更改,除非其他人可以推荐恢复推送提交的正确方法,并且我并不是说历史必须从日志或其他任何东西中消失。
答案 0 :(得分:8)
如果我正确理解您的问题,您可以尝试以下方法:
(我假设这是你的'主'分支,你正在推动'起源')
与遥控器同步以进入相同状态。
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
答案 1 :(得分:5)
现在我只想回到发布重置之前的时间
如果您只想取消刚才的git reset --soft
,可以在reflogs中查找以前的HEAD提交ID
$ git reflog
$ git reset --soft formerCommit
然后您可以准备git revert
答案 2 :(得分:2)
虽然我的回答超出了你的要求,但我认为这实际上是你打算做的。
您使用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
分支),并确保打开通信< / strong>在你的团队中。
开发人员通常将此模式用于我所谓的星期五下午提交,以便在硬件故障的情况下在周末之前保存您的工作(但返回到星期一的预先提交状态。)
*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上重写历史将产生严重后果(除非您是唯一克隆该代码的人)。
答案 3 :(得分:0)
您希望使用git revert HEAD
创建一个新的提交,以撤消HEAD的提交。相反,您只需将HEAD移回当前HEAD之前的提交。