我想在这里{@ 3}}添加这个问题作为对@KevinBallard答案的评论,但我的评论很长。
所以我的问题是:
如果我在一个名为topic
的分支中,是否可以只编写git rebase master
而不是git rebase origin/master
?或者真的有两个不同的本地master
分支?一个是远程主分支的副本,一个是我自己的主分支?如果是这样的话:当我git pull
都是本地主分支(一个叫做origin / master,另一个叫做master)时更新了?我很困惑......
或许它是这样的:origin/master
是获取遥控器(复制,即覆盖)的真实远程主分支的本地副本,以及我的本地分支我master
(或git merge origin/master
)时,只会更改被叫git rebase …
。也就是说:当我git pull origin master
我的本地副本origin/master
和master
都被更新/合并时。当然假设我目前在主分支(即git checkout master
是我的最后一次结账)。
答案 0 :(得分:16)
master
是您当地的分支。origin master
是名为master
的远程存储库上的分支origin
。origin/master
是您origin master
的本地副本。当你git pull
(我认为是邪恶的,还有其他人?)时,它会自动执行:
origin master
复制到origin/master
。 (以及所有其他origin xxx
到origin/xxx
)。 origin/master
合并到master
。如果你想要改变主人,你必须这样做:
git help pull
的摘录:
更确切地说, git pull 使用给定参数和调用 git merge 运行 git fetch 以合并检索到的分支头进入当前分支
答案 1 :(得分:6)
<remote>/<branch>
命名分支由git自动管理。
当你git pull
时,git真正做的是
git fetch
git merge origin/master
git fetch
会自动更新origin/master
本地分支,以指向origin
远程master
分支的最后一次提交。
是的,当你致电git pull
时,两者都会更新。这是因为fetch
更新origin/master
和merge
更新master
。
如果我在一个名为topic的分支中,是否可以只编写git rebase master而不是git rebase origin / master?
你可以,但是主人不一定和origin/master
一样 - 尽管他们大多数时候都是。所以这取决于你。
或者真的有两个不同的本地主分支吗?
是的,他们是两个不同的地方分支机构。他们通常只是指向相同的提交并共享一棵共同的树。
答案 2 :(得分:1)
当您在任何分支上执行git pull
时,实际上会执行两项操作:git fetch
和git [merge|rebase]
。
提取只是从远程仓库下载所有对象,默认情况下称为origin
。在下载的对象中有refs - 它们是指向某些具体提交的指针。其中一些指针称为 branches 。如果远程仓库master
中有origin
分支,则它会在您的本地仓库中保存为origin/master
- 只是为了不干扰您的同名本地分支。
获取后,git会查看您的配置,默认情况下,会尝试将当前分支合并或重新绑定到origin
的分支上,并使用相同的名称。
在配置中,您可以指定在哪个远程分支上重新定位哪个本地分支 - 这样您就可以在没有其他参数的情况下运行git pull
。
答案 3 :(得分:1)
分支是只是对提交点的引用。标签也引用了提交点,但分支与标签不同,因为在某些情况下,git会自动更新分支引用以指向另一个提交。这些自动更新发生,比如说,当您创建新的提交点(git commit
)时,当前HEAD 的分支会更新以引用新创建的提交点。
Git维护两种类型的分支:本地和远程。如上所述,本地分支得到更新。执行以下操作时会更新远程分支:git fetch
。
此外,您可以拥有 track 远程分支的本地分支,在这种情况下,git pull
只是方便以下两个操作:git fetch; git merge origin/<tracked branch>
。
请注意,跟踪的本地分支和远程分支可以使用不同的名称。
因此,在您的情况下,当您说git merge master
时,您正在合并本地主人。当你说git merge origin/master
时,你正在合并远程分支(最终,它可以指向与本地主服务器相同的提交)
另请注意,确实合并了分支指向的提交点(您可以说git merge <some commit>
),而不是分支本身。