【问题标题】:Pushed commit without pulling before推送提交而不拉之前
【发布时间】:2021-05-27 13:16:46
【问题描述】:

我不小心推送了一个提交而之前没有拉。所以我没有合并团队成员之前推送的提交。 我确定我没有收到冲突警告,但我现在如何在我当前的开发状态下合并这个提交?

【问题讨论】:

  • 你能解释一下所涉及的分支吗?如果您推送了一个共享分支并且它不需要先拉取,那么其他贡献者将需要先拉取。
  • 拉一下。你想多了。
  • 有趣的是,如果其他开发人员已经推送了,那么您不应该能够推送....除非您强制推送。你有吗?
  • 我在团队成员承诺的分支中工作。我是新手,但(不幸的是)管理员。这可能是我能够在没有冲突的情况下推动的原因。我很确定我没有用力推动。但是我现在该如何合并呢?

标签: git merge push


【解决方案1】:

如果您要成为管理员,则需要了解 Git 的工作原理。不过现在,请放心,如果您不使用 git push -fgit push --force 或等效项,1您没有做错任何事情,并且先拉动不会有任何影响。

从您的 StackOverflow 用户信息中不清楚您可能已经对图论有所了解,但是,一旦您掌握了一些简单的本地提交,您应该通读 Think Like (a) Git 网站。了解以下内容也有帮助:

  • Git 真的是关于提交。分支——或者更准确地说,分支 names; 重要的是要记住,人类(和 Git)过度使用了 branch 这个词,以至于有时它实际上变得毫无意义——只是一个find 提交的方法。提交本身具有真实的名称,这些名称是丑陋的散列 ID。它们看起来是随机的,人类无法使用,所以我们不这样做:我们使用名称,例如分支名称和标签名称。真实姓名(哈希 ID)永远不会改变,因为它们实际上是对提交的内容进行加密哈希的结果。

    Git 在内部使用哈希 ID。 git log 命令显示它们。他们是真名。但是我们和 Git 使用 branch 名称来查找 hash IDs。每个分支名称都有一个哈希ID。

  • 分支名称是一个特定存储库的本地名称。克隆存储库会复制它的所有提交2 并且没有它的分支名称3一旦提交存在于新克隆 git clone 在新克隆中创建一个 new 分支名称。这个新的分支名称与您的 Git 在其 Git 中找到的名称具有 相同 哈希 ID:例如,如果您是 git clone -b leeloo <url>,您的 Git 会在 中查找 leeloo 分支名称他们的 Git。这代表一些特定的提交,通过哈希 ID。然后,您的 Git 使用他们现在正在使用的 相同 哈希 ID 创建 您自己的 leeloo 名称。

    存储在分支名称中的哈希 ID 会随着时间而变化。添加新提交意味着更新名称。您的 Git 中的名称包含每个分支的 latest 提交哈希 ID。在其他所有 Git 存储库中也是如此。

  • git pull 实际上是一个方便的命令,由两个更基本的命令组成。其中之一是 get me any new commits they have 命令:git fetch 让您的 Git 调用其他 Git 存储库,找出他们有哪些您没有的提交,然后带上这些提交超过。 (实际上,克隆主要只是对空存储库的提取。)正是这个git fetchgit push 的对立面最接近。由于历史原因,pull 命令名称错误。

    (运行 git fetch, git pull 然后运行第二个 Git 命令来合并获取的提交。您通常最终会想要这样做;git pull 让你这样做立即,这有时为时过早。但由于您通常最终还是想要它,因此立即完成有时会很方便。但是第二个命令可能会出错,重要的是要意识到您选择 使用第二个命令,以及在它确实出错后必须做的事情,取决于那个选择。)

    fetch 命令在任何时候都可以安全使用,因为它所做的只是从其他 Git 中获取新的提交。您自己在自己的分支上的提交完全不受此影响。你的分支是你的:其他人添加到他们的分支的新提交不会触及它们。

    pull 运行的 second 命令不是那么安全,无论你选择哪一个,尽管它们都旨在是非破坏性的。 4

  • git push 是将新提交从您的 Git 存储库发送到其他 Git 存储库的命令。这个很棘手,因为与 git fetch 不同,它通过询问或命令其他 Git 存储库设置它的一些分支结束,这取决于你告诉 git push 推送 。由于他们通过他们的分支找到提交,您可以告诉他们loose 提交。这就是--force 选项生效的地方:没有它们,如果你要求它做一些会丢失提交的事情,另一个 Git 会告诉你“不”。 对于--forcegit push 的最后一步是命令而不是礼貌请求,如果您拥有正确的权限(例如管理员访问权限),他们通常会服从。

您需要了解所有关于提交如何向后连接到旧提交,以及git mergegit rebase 是如何工作的。这是git pull 的两个标准第二个命令。两者都很复杂,尽管 rebase 比 merge 复杂得多(因为 rebase 主要是重复挑选樱桃,每次挑选樱桃都是一种合并形式)。我上面链接的网站很好地涵盖了大部分内容。


1您可以通过以加号开头的 refspec 来使用 git push <em>remote refspec</em> 设置 per-refspec 强制标志,但有大约 0% 的可能性你这样做是偶然的。还有--force-with-lease,就像--force带了安全带。

2您可以限制要克隆的提交集,当某些提交只能通过特殊名称(例如refs/replace/,或特定于 GitHub 的拉取请求名称)找到时,某些提交默认情况下可能不会被复制。但总的来说,这是将克隆视为复制提交的方式。

3使用git clone --mirror 可以让Git 直接复制分支名称,还有其他技巧可以使这个错误,但同样,这是思考 克隆。

4在 Git 1.5 左右的糟糕旧时代,这里有一些错误。我的作品不止一次被git pull 破坏。

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2020-03-11
    • 2012-11-28
    • 2011-08-08
    相关资源
    最近更新 更多