13

刚才我提交并推动了一些我决定应该“恢复”或“撤消”的事情(是的,我在推动方面的错误)。所以我被告知要git reset --soft HEAD^在我的最后发出,我认为这会以某种方式创建一个“还原”提交,一旦提交就会使它就像从未发生过变化一样。我不介意改变的历史是否存在,这正是我想象的会发生的事情。

无论如何,在完成之后我再次提交,然后当我尝试推动时,我得到了非快进错误。现在,我知道我在重置时搞砸了一些事情,我的树和起源树的某些东西现在“不匹配”,但我想知道如何解决这个问题。现在我只想回到我发出重置之前的时间,这样我就可以通过手动取出更改然后提交来手动恢复更​​改,除非其他人可以推荐恢复推送提交的正确方法,并且通过这并不是说历史必须从日志或任何东西中消失。

4

4 回答 4

11

尽管我的回答超出了您的要求,但我认为这实际上是您打算做的。

您曾经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 上重写历史将会产生严重的后果(除非您是唯一一个克隆该代码的人)。

于 2017-11-20T00:29:33.827 回答
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
于 2010-01-06T22:05:39.920 回答
5

现在我只想回到我发出重置之前的时间

如果你只想取消git reset --soft你刚刚做的,你可以在 reflogs 中查找以前的 HEAD 提交 id

 $ git reflog
 $ git reset --soft formerCommit

然后你可以准备你的git revert

于 2010-01-06T22:09:54.257 回答
0

您想使用它git revert HEAD来创建一个新的提交,该提交将在 HEAD 处撤消提交。相反,您只是将 HEAD 移回当前 HEAD 之前的提交。

于 2010-01-06T22:06:11.213 回答