假设我在本地跟踪3个远程分支,master
,branch1
,branch2
。
如果我目前在master
分支上,每个分支上的git pull
fetch
和merge
会发生变化吗?
我想我也可以建立一个实验......
答案 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
之下(注意这里的斜线)。
我用了#34; refspec"以上几次,没有定义它。
" refspec"是第二个最简单的,只是一对分支名称,如develop:develop
,:
等。
这对通常但不总是在它们之间的冒号git push origin master:master
的两侧具有相同的两个分支名称。其中一个是您的名称 - 您的分支机构,在您的存储库中 - 另一个是他们的名称,即他们用于的名称在他们的存储库中他们的分支。
通常在推送时会看到这两个名称的形式:例如origin
。这意味着"打包我在我的主人身上的东西,通过网络电话打电话给名为master
的遥控器,给他发送包裹,然后问他是否将他作为他的HEAD
git push origin HEAD:master
1}}分支。"您还可以在左侧使用提交ID或单词origin
:master
表示"接受我现在提交的任何内容,并询问远程{{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 rebase
或git rebase
操作。您将能够看到您正在做的事情。
1 或git fetch
,如果这样配置或指示。重新定位通常比合并更好,但它总是取决于细节。我的建议是首先使用git rebase
,然后将自己的git merge
或fetch =
作为单独的步骤,至少在你是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 = origin
和branch.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 通常会自动合并任何更改,而且很少是您想要的。