【问题标题】:Undo git push that hasn't merged撤消未合并的 git push
【发布时间】:2020-08-23 11:33:33
【问题描述】:

我试图使用 rebase 解决 master 和我的本地分支之间的冲突。我解决了所有冲突并推动。在检查执行拉取请求时,我注意到有一些我不认识的提交并想要撤消推送。未提出合并或拉取请求。

我做了什么:

$ git rebase master
$ Resolved all conflicts
$ git add --all
$ git rebase --continue
$ git push -u origin local_branch

如果我不合并/拉取请求,git push 会发生什么?

【问题讨论】:

    标签: git


    【解决方案1】:

    如果我不合并/拉取请求,git push 会发生什么?

    没有“发生”。已经完成了。它是过去的,不会比你昨天早餐吃的更容易改变。

    git push 所做的是让你的 Git 调用另一个 Git。

    你的 Git 有提交和分支名称,他们的 Git 有提交和分支名称。您的 Git 分支名称不必与其名称匹配 — 使用相同的名称,例如 master,只是对人类理智的让步 — 但如果您和他们有相同的commits,那么您和它们也具有相同的原始 散列 ID

    因此,您的 Git 将其他 Git 的“电话号码”(URL)保存在您的 Git 的“通讯录”(.git/config 条目)中,名称为 origin。使用git push origin,你告诉你的Git:使用存储的URL拨号到另一个Git。git pushlocal_branch部分然后说:

    • 找到我自己名为local_branch的本地分支的提示提交
    • 通过其哈希 ID 向其他 Git 提供该提交。

    如果其他 Git 还没有该提交,他们会说是的,请继续发送,您的 Git 将提供更多提交。这将继续,逐个提交,直到您的 Git 达到他们确实已经完成的提交。所以现在你已经提供了你所有的(嗯,对他们来说是新的)提交。

    当两个 Git 达到这一点,同意发送哪些提交(以及任何其他必要的项目)时,你的 Git 将它们打包:

    Counting objects ...
    Compressing ...
    

    然后将它们发送过来(请参阅When I do "git push", what do the statistics mean? (Total, delta, etc.))。他们的 Git 将这些放在一个临时隔离区——这不是您通常需要关心的事情,但在这个 Covid-19 时代,这是一个丰富多彩的事实。 ?

    然后,在提交提交后,您的 Git 会发送一个礼貌的请求:如果没问题,请将 您的 分支名称 ______(在此处插入名称)设置为 ______(插入哈希此处为 ID)。 在本例中,分支名称为 local_branch——因为这是您在命令行中输入的名称。哈希 ID 与 您的 名称 local_branch 正在存储的哈希 ID 相同。

    假设他们接受这个请求,他们将创建或更新他们的分支名称 local_branch 以指向您在 local_branch 中的最后一次提交(并且所有对象都从隔离区出来,现在存储在他们的 Git 中存储库)。他们会报告这一切都很好。您的 Git 现在将创建或更新您自己的 origin/local_branch 名称,以记住他们所说的安全存储在其名称 local_branch 中的哈希 ID。

    由于您使用了git push -u,您的Git 现在会将您新创建或更新的origin/local_branch 名称设置为您自己的名称local_branch上游 设置。

    请注意,如果您愿意,可以告诉他们使用不同的名称:

    git push -u origin local_branch:fred_and_wilma
    

    这告诉你的 Git 找到名为 local_branch 的分支的提示提交,但是当要求 他们 创建或更新 他们的 分支时,使用名称 @ 987654342@ 代替。您通常不应该这样做,因为它只会导致混乱和心痛,而且当然它需要在命令行中输入更多内容。

    那个分支名称现在存在于 那个 Git 中,并且会一直坐在那里,直到有人——你,或者任何有权限的人——告诉 Git 以某种方式改变它。如果您或他们专门删除它,该名称就会消失。提交本身不会消失——至少不会立即消失。但是,如果该名称是查找提交的唯一方法,那么其他 Git 最终将自行删除这些提交。1

    如果其他人有权访问该其他 Git 存储库,在您的 git push 之后查看该 Git 存储库,这里的其他人可以获取该名称和那些提交并将这些提交存储在 他们的 (第三)Git 存储库。因此,一旦您向某人发送了提交,一般来说,您应该假设现在,每个人 都拥有它们。即使您将它们从第二个originGit、第三、第四、第五等删除,Gits 现在也可能拥有它们。

    (如果没有其他人可以访问origin Git,则上述均不适用。)


    1当使用 GitHub、GitLab 或 BitBucket 之类的网站来托管您的 origin Git 时,如果您错误地发送了敏感文件,通常可以让网站上的管理员清除提交的速度比默认情况下更快,然后它们就真的消失了——但在此期间仍然有人可以复制它们。

    【讨论】:

      【解决方案2】:

      如果我不合并/拉取请求,git push 会发生什么?

      通过“推送”,您只是将本地分支的副本放入远程存储库。如果您不合并或拉取,那么该分支仍将存在于远程存储库中。什么都没有发生。

      解决方案?

      您可以删除远程(原点)中的分支 - 我假设没有人使用它,但您正在使用它。或者您可以简单地覆盖它(警告:这将破坏您现有的远程分支):

      git push origin local_branch --force
      

      【讨论】:

        猜你喜欢
        • 2010-11-19
        • 2011-08-22
        • 2015-09-03
        • 2014-11-03
        • 2012-10-31
        • 2011-01-24
        相关资源
        最近更新 更多