如果我不合并/拉取请求,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 push的local_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 时,如果您错误地发送了敏感文件,通常可以让网站上的管理员清除提交的速度比默认情况下更快,然后它们就真的消失了——但在此期间仍然有人可以复制它们。