Git push branch-a 然后与 master 合并然后 push 到 master 什么都不做?

Git push branch-a then merge with master then push to master doing nothing?

所以我的团队遵循这个流程。

  1. git checkout -b BRA-123

进行更改

  1. git 添加 .
  2. git commit -am "BRA-123 - made some changes"
  3. git 推送原点 BRA-123
  4. git结帐大师
  5. git 合并 BRA-123
  6. git push origin master

然后我得到

Total 0 (delta 0), reused 0 (delta 0)

问题是在我推送到 BRA-123 之后它用完了提交,此时我不能推送到两个分支而不直接在 master 中进行更改。

我不知道这是为什么?有谁知道为什么?

您的第 6 步 (git merge BRA-123) 可能会导致 "fast-forward" 合并。也就是说,在第 3 步,您的提交图看起来像这样:

              C   <-- BRA-123
             /
... <- A <- B     <-- master

在这里,新提交 C 指向其父提交 BB 指向 A,以此类推。

现在,当我说 "your commit graph" 我的意思是 你的 提交图,在你自己的机器上的存储库中,而不是 origin 上的共享存储库你会 git push.

您的 存储库中,标签master 指向提交B,标签BRA-123 指向提交C (这里的单个字母代表丑陋的 40 个字符的 SHA-1,例如 81e0842b2eb89a882eaa9e11aba7f3d7260bcc75)。

让我们先画出相同的提交图,暂时不考虑标签:

... <- A <- B <- C

这次我不需要将 C 放在单独的行中,因为我不需要分支标签的空间。

这部分只有提交和它们自己的箭头,是 git 在您看到 Total 0 (delta 0) 时计算的内容。这是因为标签位于图表之外,并且 git 正在计算它在图表上所做的压缩。

现在,当你第一次做 git push origin BRA-123 时,这是完整版本 git push origin BRA-123:BRA-123 的缩写,意思是 "Please Internet-call (or otherwise connect to) the machine listed on the URL that goes with the remote origin and give to his git repo any commits and other graph bits needed so that he can set his BRA-123 to point to the same commit my BRA-123 points-to."

"His repo",当然,只有一系列以 ... <- A <- B 结尾的提交。所以你的 git 与他的 git 交谈,他们决定你方必须发送提交 C,可能还有一些文件等等。这些加起来不是零,所以你得到一个非零 Total 3 或其他什么。你的 git 发送过来,然后他的 git 检查是否可以设置(或创建)分支 BRA-123 以指向提交 C。假设是,他的 git 会执行此操作,而您的 git 会收到成功报告,一切都很好。

现在继续第 5 步 (git checkout master),然后是第 6 步 (git merge BRA-123)。在第 6 步中,您告诉 git 找到当前 master 提示和 BRA-123 提示之间的公共合并基础——即找到提交 B 之间的最新共享提交并提交 C。这只是提交 B 本身,这意味着 master 可以以 "fast-forward" 的方式移动。如果你不禁止这种快进,git 会那样做:它只是擦除旧标签 master 并指向 master 提交 C,给你这个:

... <- A <- B <- C   <-- BRA-123, master

也就是说,两个标签都指向提交C。 (这在 git-ese 中是完全正常的。其他源系统可能总是创建一个单独的合并提交,即使快进是可能的;git 可以那个,但默认情况下不是。)

现在您继续执行第 7 步 (git push origin master:master),要求您的 git 再次呼叫另一个 git。你的 git 这样做了,它与他的 git 交谈,他们发现不需要发送任何提交或其他东西:Total 0。然后你的 git 要求他的 git 将他的 master 更改为指向他已经拥有的提交 C

这要么成功(他的 git 快进 master 从提交 B 到提交 C)要么失败,和往常一样,你会得到一个单独的失败指示,如果有失败。大概就成功了。但是,它不需要将新对象添加到提交图中,因为您只是要求另一个 git 对其 master 分支标签进行快速快进。