【问题标题】:Will 'git reset' + 'git push' send my detached commits to the remote repository?'git reset' + 'git push' 会将我分离的提交发送到远程存储库吗?
【发布时间】:2014-11-03 22:08:45
【问题描述】:

我的存储库中有一个分支,其中包含有关新更改的新提交(例如 'Commit A')。 而且我还没有将提交推送到远程存储库。

现在,此提交中缺少一个修复程序,我想:

  • git reset HEAD~1(回到之前的提交A-1,放回工作目录中最后提交的更改)
  • 更改缺少修复的文件
  • git add .
  • git commit(说 'Commit B'
  • git push

我的问题主要是关于重置提交(A)。

  • 它会作为分离提交保留吗?或者它还会在我的分支中吗?
  • 这会以任何方式将“提交 A” 推送到远程存储库吗?
  • 它会扰乱我的历史吗?或者git push 只会将提交同​​步到分支中,而忽略分离的? (即'Commit A'

最后

  • 如果我已经推送了 'Commit A' 并尝试执行相同的操作序列怎么办?

【问题讨论】:

    标签: git github version-control git-push git-reset


    【解决方案1】:

    如果你不执行 git push,什么都不会在远程存储库中结束。

    Git reset 默认为“混合”模式,因此您的命令将等同于“git reset --mixed HEAD~1”。从 git docs 它说以下关于混合模式重置:

    Resets the index but not the working tree (i.e., the changed files are preserved but not marked for commit) and reports what has not been updated. This is the default action.
    

    您也可以使用“git commit --amend”命令修改您的提交,而不是重置。这将使用您想要添加的更改来修改您的上次提交。

    【讨论】:

    • 它没有回答我关于重置提交的 detached/limbo 状态的问题。而且我知道如果我不推送,我不会影响远程存储库。但是 +1 将我指向git amend;我没想到。
    • @Kamafeather 在您重置的提交之后所做的提交不会被删除。他们将退出,但将成为孤儿。可以使用 'git fsck --lost-found' 命令找到它们。这就是你想知道的吗?
    • 是的,就是这样。我想确保本地重置不会远程保留重置提交。谢谢
    【解决方案2】:

    它会作为分离提交保留吗?或者它还会在我的分支中吗?

    如果您在 detached HEAD mode 中,那么任何重置仍将在分离的 HEAD 中。
    如果您不在分离的 HEAD 中,则 git reset 将您的分支的 HEAD 重置为 commitB,这意味着:

    -commitA 在另一个分支中(参见“How to list branches that contain a given commit?”:git branch --contain commitA) - 或者在git reflog中可见一段时间

    这会以任何方式将“提交 A”推送到远程存储库吗?

    不可以,除非commitA 是另一个分支的一部分,并且如果您正在推送另一个分支。

    它会扰乱我的历史吗?

    不是您的本地历史。只有当 commitA 已经被推送时,它才会弄乱上游 repo 的历史记录。

    在某一时刻,您需要:

    • 任一 git checkout aBranch
    • 或从您所在的位置(或重置为)git checkout -b aNewBranch 创建一个分支。

    您需要在分支中才能推送。

    【讨论】:

    • 是的,但我在一个分支。从我的分支中,我 git reset 和我的 HEAD 仍将指向该分支(即使它将指向其先前的提交之一)。唯一分离的东西是 'Commit A',因为它不再出现在我的分支历史记录中(实际上我'回来'并'选择了另一条路径'(重置 + 提交)。但也许 “分离”不是描述提交状态的正确术语吗?
    【解决方案3】:

    关于重置提交 (A)。

    它会作为分离提交保留吗?还是会在我的 分公司?

    它将作为分离的提交保留(无法从您的分支访问),您可以通过这样做来访问它

    git reflog
    

    该命令将列出 HEAD 指向的所有提交的历史记录,在这种情况下,您将看到如下内容:

    af35532 HEAD@{0}: commit: Commit B
    bae2395 HEAD@{1}: reset: moving to HEAD~
    6685f32 HEAD@{2}: commit: Commit A
    

    因此,您可以通过这种方式将您的分支恢复到之前的状态(指向 Commit A):

    git reset HEAD@{2}
    

    这会以任何方式将“提交 A”推送到远程存储库吗?

    不,因为 push 只发送头(又名分支)并且提交来自这些头的可达性

    由于无法从您的分支访问提交 A,因此永远不会发送它。请注意,如果有另一个不同的分支使提交 A 可访问,则提交 A 将与该分支一起发送

    它会扰乱我的历史吗?或者 git push 只会将提交同​​步到 分支,忽略分离的? (即“提交 A”)

    不,它不会弄乱你的历史记录,git push 不会同步分离的提交

    如果我已经推送了“提交 A”并尝试做同样的事情怎么办 操作顺序?

    在这种情况下,您的推送将被拒绝为“非快进”,因为您试图用分散的历史记录覆盖远程头

    To https://github.com/user/repo.git
    ! [rejected]        master -> master (non-fast-forward)
    

    【讨论】:

      猜你喜欢
      • 2010-11-20
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 2012-05-09
      • 2010-09-20
      相关资源
      最近更新 更多