远程仓库高级操作
远程跟踪分支
- Git 好像知道 main 与 origin/main 是相关的,why?
- main 和 o/main 的关联关系是由分支的“
remote tracking”属性决定的。main 被设定为跟踪 o/main —— 这意味着为 main 分支指定了推送的目的地以及拉取后合并的目标。当你克隆仓库的时候, Git 就自动帮你把这个属性设置好了。 - 当你克隆时, Git 会为远程仓库中的每个分支在本地仓库中创建一个远程分支(比如 o/main)。然后再创建一个跟踪远程仓库中活动分支的本地分支,默认情况下这个本地分支会被命名为 main。克隆完成后,你会得到一个本地分支(如果没有这个本地分支的话,你的目录就是“空白”的)。
remote tracking 属性
- 你可以自己指定这个属性,让任意分支跟踪 o/main, 然后该分支会像 main 分支一样得到隐含的 push 目的地以及 merge 的目标。 这意味着你可以在分支 totallyNotMain 上执行 git push,将工作推送到远程仓库的 main 分支上。有两种方法设置这个属性:
- 通过远程分支切换到一个新的分支,执行:
git checkout -b totallyNotMain o/main,就可以创建一个名为 totallyNotMain 的分支,它跟踪远程分支 o/main。

git branch -u 命令:执行git branch -u o/main foo,这样 foo 就会跟踪 o/main 了。如果当前就在 foo 分支上, 还可以省略 foo:git branch -u o/main。
Git Push 的参数
git push <remote> <place>。
- 通过 place 参数来告诉 Git 提交记录来自于 main, 要推送到远程仓库中的 main。也就是说,当为
git push 指定 place 参数为 main 时,我们同时指定了提交记录的来源和去向。

git push origin main 翻译:切到本地仓库中的“main”分支,获取所有的提交,再到远程仓库“origin”中找到“main”分支,将远程仓库中没有的提交记录都添加上去,搞定之后告诉我。
git push origin <source>:<destination>,同时指定源和目的地。
- source 可以是任何 Git 能识别的位置,如
git push origin foo^:main。 - 如果你要推送到的目的分支不存在会怎么样呢?没问题!Git 会在远程仓库中根据你提供的名称帮你创建这个分支!
git fetch 的参数
git fetch 的参数和 git push 极其相似。他们的概念是相同的,只是方向相反罢了(因为现在你是下载,而非上传)。- 如果
git fetch 没有参数,它会下载所有的提交记录到各个对应的远程分支……
git fetch origin foo
- Git 会到远程仓库的 foo 分支上,然后获取所有本地不存在的提交,放到本地的 o/foo 上。
- 你可能在 foo 分支上的工作还未完成,你也不想弄乱它。还记得在 git fetch 课程里我们讲到的吗?它不会更新你的本地的非远程分支, 只是下载提交记录。
git fetch origin <source>:<destination>
- source 现在指的是远程仓库中的位置,而 destination 才是要放置提交的本地仓库的位置。
- 跟 git push 一样,Git 会在 fetch 前自己创建立本地分支, 就像是 Git 在 push 时,如果远程仓库中不存在目标分支,会自己建立一样。
source 参数为空
git pull 的参数
git pull 到头来就是 fetch + merge 的缩写。你可以理解为用同样的参数执行 git fetch,然后再 git merge 你所抓取到的提交记录。git pull origin foo 相当于:git fetch origin foo 、 git merge o/foo。git pull origin bar:bugFix 相当于:git fetch origin bar:bugFix 、 git merge bugFix。