远程分支是位于远程仓库的分支,我们通常会用远程分支来更新本地分支,然后在本地进行修改,最后将修改的结果同步到远程分支上。除此之外,我们还需要搞清楚远程跟踪分支和跟踪分支的概念。
远程跟踪分支是远程分支状态的引用,它们是你无法移动的本地引用。一旦你通过git pull、git push等命令与远程仓库进行同步, Git 就会为你移动它们以精确反映远程仓库的状态。该分支在远程仓库中的位置就是你最后一次连接到它们的位置。
它们以 / 的形式命名。 例如,如果你想要看你最后一次与远程仓库 origin 通信时 master 分支的状态,你可以查看 origin/master 分支。
“origin” 并无特殊含义,远程仓库名字 “origin” 与分支名字 “master” 一样,在 Git 中并没有任何特别的含义一样, “origin” 是当你运行 git clone 时默认的远程仓库名字。 如果你运行 git clone -o booyah,那么你默认的远程分支名字将会是 booyah/master。
跟踪分支是在本地创建的与远程跟踪分支相关联的分支,我们一般在这上面做修改的工作。
为了对Git远程分支的使用有更深的理解,我们需要认识一些基本的命令和常用的操作:
拷贝一份远程仓库,也就是下载一个项目。当你克隆时, Git 会为远程仓库中的每个分支在本地仓库中创建一个远程跟踪分支(比如 o/main)。然后再创建一个跟踪远程仓库中活动分支的本地分支,默认情况下这个本地分支会被命名为 main(实际上默认使用的分支名为master和origin/master,这里为了简便统一命名为main和o/main)。
$ git clone
克隆之后远程跟踪分支就无法再移动,无法自动同步远程仓库分支的更新。
这个时候就需要通过git fetch命令从远程仓库拉取分支来更新本地分支
$ git fetch
拉取分支仅仅只是更新了当前所在分支的分支信息,要将修改合入分支,还需要通过以下命令
$ git merge 远程跟踪分支名
完成上述的操作还有另外一条更常用的命令
$ git pull <远程主机名> <远程分支名>:<本地分支名>
如果远程分支是与当前分支名相同,则冒号后面的部分可以省略
$ git pull <远程主机名> <远程分支名>
git pull相当于git fetch+git merge操作
$ git pull origin main
$ git fetch; git merge o/main
为了使远程提交树变得干净,所有的提交都在一条线上,我们通常会用以下的命令来pull分支
$ git pull --rebase
这样做的好处还在于方便版本回退。当然,这种做法也改变了提交树的历史。比如, 提交 C2 可以被 rebase 到 C3 之后。这看起来 C2 中的工作是在 C3 之后进行的,但实际上是在 C3 之前。一些开发人员喜欢保留提交历史,因此更偏爱 merge。
当我们在本地分支上完成修改后,便需要将修改结果同步到远程分支上。
$ git push <远程主机名> <本地分支名>:<远程分支名>
如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数:
$ git push --force origin master
但一般在推送之前会先更新本地分支。
git push会将本地分支同步并合入远程分支中,同时本地远程跟踪分支的位置也发生了相应的变化。
前面有提到我们需要在本地创建跟踪分支并在上面进行修改,本地分支的创建需要与远程跟踪分支建立起关联属性。
例如:main 和 o/main 的关联关系就是由分支的“remote tracking”属性决定的。main 被设定为跟踪 o/main —— 这意味着为 main 分支指定了推送的目的地以及拉取后合并的目标。
那main 分支上这个属性是怎么被设定的,你并没有用任何命令指定过这个属性!其实, 当你克隆仓库的时候, Git 就自动帮你把这个属性设置好了。
当你克隆时, Git 会为远程仓库中的每个分支在本地仓库中创建一个远程分支。然后再创建一个跟踪远程仓库中活动分支的本地分支,默认情况下这个本地分支会被命名为 main。
这也解释了为什么会在克隆的时候会看到下面的输出:
local branch "main" set to track remote branch "o/main"
你可以让任意分支跟踪 o/main, 然后该分支会像 main 分支一样得到隐含的 push 目的地以及 merge 的目标。 这意味着你可以在分支 bugFix上执行 git push,将工作推送到远程仓库的 main 分支上。
有两种方法设置这个属性,第一种就是通过远程分支检出一个新的分支,执行:
$ git checkout -b bugFix o/main
就可以创建一个名为 bugFix 的分支,它跟踪o/main分支。
另一种设置追踪分支的方法就是使用:git branch -u 命令,执行:
$ git branch bugFix
$ git branch -u o/main bugFix
这样 bugFix 就会跟踪 o/main 了。如果当前就在 bugFix 分支上, 还可以省略 bugFix :
$ git branch -u o/main