git pull 是否影响远程跟踪分支?

Does git pull affect remote tracking branch?

我们知道 git pull = git fetch + git merge。但是我对 git merge 的理解是它只影响你要合并到的分支,而不是你要合并的分支。

所以在 git pull 的情况下,我想象它看起来像这样:

git fetch origin
git merge origin/master

如果是这种情况,来自 origin 的新更改将在 master 上重播,但 origin/master 不会将更改提交到本地 master 分支。 git pull 是否确保远程跟踪分支 (origin/master) 包含在 git merge 之后在 master 中所做的所有新更改,或者当您执行 git push 时是否完成?

简短的回答很简单:不,远程跟踪分支不受影响。

考虑像 origin/master 这样的远程跟踪分支的一个好方法是,您的 git 几乎一直独立于它们的(来源)git,除了当你告诉你的 git 打电话给他们的 git 并协调时。执行此操作的命令(通过 Internet 调用遥控器 phone)是 git fetchgit push(当然还有最初的 git clone)。因此,origin/master 始终是 "where master was on origin" 截至上次您的 git 与其同步。

当你获取或推送时,然后你的git得到他们git关于他们所有分支的想法,并更新你的远程-跟踪分支机构。它会将它们设置为当时遥控器所具有的任何值,前提是您还具有这些 SHA-1 ID。1 您可以限制 git 更新的分支,但默认直接 git fetch 是获取所有遥控器的当前信息。

还有一个命令2 phone 启动了远程但不会更新您的 git 的远程跟踪分支:git ls-remote 执行获取或推送的第一步,然后简单地显示它从远程获取的所有引用名称。尝试一下,它纯粹是提供信息,但会让您了解它的实际工作原理。


1您的 git 不能将您自己的远程跟踪分支指向您没有的 SHA-1。由于 git fetch 通常会带来所有内容,因此它是进行主要更新的那个。使用 git push 时,您要求遥控器 将其 SHA-1 ID 更改为 git 发送过来的内容,因此如果它说 "yes" 那么根据定义你也有这些对象——但这只保证你发送的分支 and/or 标签,而不是他们拥有的其他分支。

2其实有好几种,不过就拿个试试看吧。为了完整起见,我会提到 git remote show 有时也会 phone 遥控器。