问题 git reset后无法推送--soft HEAD ^


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

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


2872
2018-01-06 21:51


起源



答案:


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

(我假设这是你的'主'分支,你正在推动'起源')

与遥控器同步以进入相同的状态。

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

8
2018-01-06 22:05





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

如果你只想取消 git reset --soft 你刚刚做了,你可以在reflogs中查找前一个HEAD commit id

 $ git reflog
 $ git reset --soft formerCommit

然后你可以准备你的 git revert


5
2018-01-06 22:09



谢谢,这类似于IRC上的某个人告诉我要做的事情,但这很令人困惑所以我将采用rnicholson的回答来进行记录。 - Jorge Israel Peña
我不熟悉git reflog。很酷。学到了新的东西。这可能是一个更好的解决方案,因为它压缩了我对一个命令的答案的前三个步骤。 - rnicholson


答案:


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

(我假设这是你的'主'分支,你正在推动'起源')

与遥控器同步以进入相同的状态。

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

8
2018-01-06 22:05





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

如果你只想取消 git reset --soft 你刚刚做了,你可以在reflogs中查找前一个HEAD commit id

 $ git reflog
 $ git reset --soft formerCommit

然后你可以准备你的 git revert


5
2018-01-06 22:09



谢谢,这类似于IRC上的某个人告诉我要做的事情,但这很令人困惑所以我将采用rnicholson的回答来进行记录。 - Jorge Israel Peña
我不熟悉git reflog。很酷。学到了新的东西。这可能是一个更好的解决方案,因为它压缩了我对一个命令的答案的前三个步骤。 - rnicholson


虽然我的答案超出了你的要求,但我认为这实际上是你打算做的。

你用过 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>

与a相比,这样做的优势 git revert 在另一个答案中讨论,是为了避免额外的提交。重置将有2次提交,这种方式将没有(没有额外的)。的优点 git reset 是它不会重写历史,所以更安全,特别是如果你不确定你在做什么。

(*)通常,存储库配置为不允许您执行此操作 - 修复分支并创建拉取请求。如果您已经阅读了上述链接,那么在master上重写历史将会产生严重后果(除非您是唯一克隆该代码的人)。


1
2017-11-20 00:29





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


0
2018-01-06 22:06



谢谢,这是有道理的,虽然这可能会更好作为评论,因为它并没有真正解决我的问题。谢谢。 - Jorge Israel Peña