git pull会更新所有被跟踪的分支吗?

时间:2015-10-28 22:20:34

标签: git

假设我在本地跟踪3个远程分支,masterbranch1branch2

如果我目前在master分支上,每个分支上的git pull fetchmerge会发生变化吗?

我想我也可以建立一个实验......

3 个答案:

答案 0 :(得分:13)

简短的回答是" no" - 或者甚至" no和yes",如果只读一个问题的标题 - 但这有点误导。

拉动脚本允许选项,其中许多都有趣(并且令人困惑,可能非常不好)。

请记住,git pull基本上是git fetch的缩写,后跟git merge 1 pull脚本将大部分参数传递给fetch步骤。git fetch origin br例如,如果您fetch,则origin步骤会将远程(br)和git fetch的名称作为" refspec"。在git早于1.8.4的版本中,这阻止br更新远程跟踪分支的任何,但是从1.8.4开始,显式获取分支 origin/br 还会更新您的origin(假设有问题的遥控器名为git fetch)。

如果你没有传递额外的参数,git fetch获取遥控器的默认refspec组,通常是 2 &# 34;所有分支"。这意味着origin(假设git fetch origin)或origin将更新pull的所有远程跟踪分支,前提是您运行的是相当现代的(1.8.4或后来)git。 (在git的旧版本中,我认为origin/*脚本在获取步骤中会受到更多限制。)

但是,有可能获取并更新了所有pull远程跟踪分支,git merge脚本将移至master步骤。对于这一部分,git非常关心你现在所处的分支,以及与之合并的远程分支" 3 。如果在您的示例中,您当前正在origin并且它与master' s git merge合并,那么git将使用origin/master步骤运行它引入的任何新东西都在master:master之下(注意这里的斜线)。

技术细节:" refspec"

我用了#34; refspec"以上几次,没有定义它。

" refspec"是第二个最简单的,只是一对分支名称,如develop:develop:等。

这对通常但不总是在它们之间的冒号git push origin master:master的两侧具有相同的两个分支名称。其中一个是您的名称 - 您的分支机构,在您的存储库中 - 另一个是他们的名称,即他们用于的名称在他们的存储库中他们的分支。

通常在推送时会看到这两个名称的形式:例如origin。这意味着"打包我在我的主人身上的东西,通过网络电话打电话给名为master的遥控器,给他发送包裹,然后问他是否将他作为他的HEAD git push origin HEAD:master 1}}分支。"您还可以在左侧使用提交ID或单词originmaster表示"接受我现在提交的任何内容,并询问远程{{1}使他成为他的git fetch"。

当执行origin/时,双方会被颠倒过来,通常您也会在您想要的名字前添加master(或遥控器的名称)。也就是说,您得到他的 origin/master,但在您的存储库中将其称为git fetch origin master:origin/master。所以你git fetch origin master:master,等等。 4 如果你做fetch,你会(可能)消灭你在自己主人身上所做的工作。 5

pull vs master还有一个奇怪的事情。我说这是第二个最简单的" refspec的形式。最简单的只是一个简单的名字,如fetch含义取决于您正在做的事情:对于master,它意味着"带来他的push,但不一定在我的本地存储库中给它任何名称,只需保存SHA-1 ID。"对于master,这意味着"给他master并要求他将其称为git fetch"。

同样,在旧版本的git中,如果您要求fetch带来他们的主人(可能还有其他人),而没有给FETCH_HEAD一个本地名称来使用它,那么只有在git的fetch =文件中保存ID(及其分支名称)。在较新的(1.8.4及更高版本)git版本中,git使用git pull origin master branch配置条目来确定要更新的远程跟踪分支。

丑陋的:git fetch(不要这样做)

如果你告诉git pull带来几个分支,那就行了(无论如何都是git 1.8.4或更高版本)。但是,如果你告诉fetch采取多个分支,那么它的表现很糟糕。

merge步骤正常。 pull步骤出了问题。

git merge脚本要求git fetch将多个分支合并到当前分支中。 Git称这是一个"章鱼合并"。除非你进入高级分支,否则你几乎肯定不会想要这样。所以不要这样做。

底线

我建议做一个git merge,默认会将所有内容全部带回来,然后执行单独的git rebasegit rebase操作。您将能够看到您正在做的事情。

1 git fetch,如果这样配置或指示。重新定位通常比合并更好,但它总是取决于细节。我的建议是首先使用git rebase,然后将自己的git mergefetch =作为单独的步骤,至少在你是git的新手时。我认为实际上较少这种方式令人困惑,但诚然,你必须输入两个命令而不是一个。

2 从技术上讲,它是该远程配置的origin行中的任何内容。远程fetch = +refs/heads/*:refs/remotes/origin/*的正常行读取origin/whatever,这就是git知道如何将原始分支重命名为git pull分支。

3 我使用"远程分支"在这里,区别于"远程跟踪"分支,因为FETCH_HEAD使用git fetch文件中保存的{1}}文件中保存的SHA-1来合成合并或重组步骤的方式pull脚本。通常origin的主人成为您的origin/master,您可以将其命名为origin/master;但配置条目为branch.master.remote = originbranch.master.merge = master。如果有的话,Git必须做一些映射魔术才能将它重新组合到origin/master中。同时,拉动脚本通过FETCH_HEAD文件作弊。

认为所有这些奇怪的东西都是历史的,嗯,&#34;残羹剩饭&#34;,来自git之前使用fetch的方式&#34; remotes&#34;。< / p>

4 我又遗漏了一件事,这是领先的+标志:当他们取得他们的主人&#34;时,你通常想要忘记你以前的任何想法&#34;他们的主人&#34;,所以fetch =行有前导加号。这打开了'#34; force&#34;标志,即使它不是快进操作也要更新。如果您不小心命名本地分支fetch =,并使用origin/something字符匹配多个分支名称,*行也会全部拼出来以避免出现问题。

5 如果你破坏自己的工作,你几乎总能得到它。 Git真的试图坚持至少30天的一切。我们将离开&#34;如何取回&#34;但是,对于其他SO条目。

答案 1 :(得分:3)

没有。 git-pull只会包含更改to your local branch。如果您希望更新其他分支机构,则必须单独检查并更新pull更新。

答案 2 :(得分:1)

您可以使用var myClosure = { [unowned self] in print(self.description) } 拉取所有跟踪的远程分支或git pull --all来获取它们,然后决定如何继续。请注意, pull 通常会自动合并任何更改,而且很少是您想要的。