【问题标题】:Does git pull affect remote tracking branch?git pull 会影响远程跟踪分支吗?
【发布时间】:2015-11-20 17:55:12
【问题描述】:

众所周知,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 时完成?

【问题讨论】:

  • 如果将分支 B 合并到分支 A,则需要将更改推送到分支 A 的远程分支,以使更改显示在那里。
  • 对不起,我不是这个意思。我想知道你在做 git fetch + git merge 的时候,远程跟踪分支是否随着本地的变化而更新。
  • 如果您有本地更改,您可以使用git stash 存储更改,然后使用git pull 从远程分支获取更改,然后使用git stash pop 重新应用更改。执行git pull 不会自动将本地更改应用到远程分支。你必须自己把它们推上去。
  • @JackmeriusTacktheritrix 感谢您的回答 - 抱歉,您的回答不是我要的。
  • 顺便说一句,更准确的说法是 origin/master 上的更改将合并到 master,而不是“重放”master。另一方面,如果您将 fetch 设置为使用 rebase 而不是合并,则 您的 更改将被重放(更准确地说,复制一个 la git cherry-pick),但在新的基本提交上找到获取步骤之后的新origin/master

标签: git git-merge git-pull


【解决方案1】:

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

考虑像origin/master 这样的远程跟踪分支的一个好方法是,您的 git 几乎一直保持独立于他们的(来源)git,除非您告诉您的 git 调用他们的 git 并进行协调.执行此操作的命令(通过 Internet 电话调用遥控器)是 git fetchgit push(当然还有最初的 git clone)。因此,origin/master 始终是“master 的原点”,因为您的 git 上次与它同步。

当您获取或推送时,然后您的 git 会了解他们的 git 的所有分支是什么,并更新您的远程跟踪分支。它将它们设置为遥控器当时拥有的任何内容,前提是您还具有那些 SHA-1 ID。1您可以限制 git 更新的分支,但直接 git fetch 的默认值是获取所有遥控器的当前信息。

还有一个命令2 调用远程但不更新你的 git 的远程跟踪分支:git ls-remote 执行获取或推送的第一步,然后简单地显示所有它从远程获取的参考名称。试试吧,它只是提供信息,但会让您了解它是如何工作的。


1您的 git 无法将您自己的远程跟踪分支指向您没有的 SHA-1。因为git fetch 通常会把所有东西都带过来,所以它是主要更新的那个。使用git push,您要求遥控器将其 SHA-1 ID 更改为您的 git 发送过来的东西,所以如果它说“是”,那么根据定义,您也拥有这些对象——但这只能保证您发送的分支和/或标签,而不是他们拥有的其他分支。

2其实有好几个,但只是一个很好的尝试作为说明。为了完整起见,我会提到git remote show 有时也会打电话给遥控器。

【讨论】:

  • 所以我认为在 git push 之后,如果你再次执行 git fetch,远程跟踪分支现在将包含本地的新更改?
  • 如果您的git push 成功,您的远程跟踪分支将已经匹配您推送的任何内容(因为远程同意将他的分支设置为您推送的 ID)。例如,如果你说 git push origin 1234567:master 并且你有一个 ID 为 1234567 的提交并且 push 成功,那么你的 origin/master 现在将包含 1234567。如果你想确定,你可以再次git fetch origin仔细检查,或者使用git ls-remote origin查看。
  • 只是为了确保 - 所以你的回答是,如果我在本地分支中有新的更改并且服务器有新的更改,在 git fetch 和 git merge 之后,我的本地分支将不一样作为我的跟踪分支(源/主),对吗?
  • 你是对的。您尚未将本地更改推送到远程分支,因此它们在这方面会有所不同。
  • @Boon:是的。发生的事情是 git 喜欢保存所有内容,因此它包含所有您的提交,fetch 添加所有他们的提交。如果您随后进行了新的合并提交,则只有您拥有新的提交(并且只有您拥有以前的提交),但您确实收到了他们的提交,并且您的 origin/master(仍然)告诉您“我们上次检查时他们在哪里”。一旦你推送,你给他们你的提交,并要求他们设置 他们的 master 指向 your 最新的提交(你刚刚给他们)。如果他们说“ok”,你的 git 就知道他们现在有了你给他们的东西。
猜你喜欢
  • 2016-12-17
  • 2011-03-04
  • 2011-02-05
  • 2011-02-24
  • 2019-09-30
  • 2014-08-22
  • 2014-02-04
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多