代码之家  ›  专栏  ›  技术社区  ›  Jorge Israel Peña

Git重置后不能推--软头^

  •  11
  • Jorge Israel Peña  · 技术社区  · 15 年前

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

    不管怎样,在完成了这一点之后,我再次承诺,然后当我试图推动时,我得到了非快速前进的错误。现在,我知道我把重置搞砸了,我的树和原始树的线条上的某些东西现在“不匹配”,但我想知道如何解决这个问题。现在,我只想回到我发出重置之前的时间,这样我就可以手动恢复更改,方法是手动将更改取出,然后提交,除非其他人可以推荐恢复推送提交的正确方法,并且通过这种方法,我并不意味着必须从日志或任何内容中删除历史记录。

    4 回复  |  直到 7 年前
        1
  •  8
  •   rnicholson    15 年前

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

    (我假设这是你的“大师”分支,而你正在推动“起源”)。

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

    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
    
        2
  •  5
  •   VonC    15 年前

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

    如果你只想取消 git reset --soft 你刚刚做了,你可以在反射中查找前head commit id

     $ git reflog
     $ git reset --soft formerCommit
    

    然后你可以准备 git revert

        3
  •  2
  •   HankCa    7 年前

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

    你用 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-fix操作,而是创建一个pull请求。因为如果您已经阅读了上面的链接,那么在master上重写历史将会产生严重的后果(除非您是唯一一个克隆该代码的人)。

        4
  •  0
  •   Stuart    15 年前

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