# origin与它的周边
# 推送主分支
任务:
- 1.共有三个特性分支
side1
,side2
,side3
- 2.我需要将这三分支按循序推送到远程仓库
- 3.因为远程仓库已经被更新过了,所以我们还要把哪些工作合并过来
git fetch
git rebase o/main side1
git rebase side1 side2
git rebase side2 side3
git rebase side3 main
git push
# 合并远程仓库
为什么不用 merge 呢?
- 为了 push 新变更到远程仓库,你要做的就是包含远程仓库中最新变更。意思就是只要你的本地分支包含了远程分支(如 o/main)中的最新变更就可以了,至于具体是用 rebase 还是 merge,并没有限制。
那么既然没有规定限制,为何前面几节都在着重于 rebase 呢?为什么在操作远程分支时不喜欢用 merge 呢?
- 优点:Rebase 使你的提交树变得很干净, 所有的提交都在一条线上
- 缺点:Rebase 修改了提交树的历史
比如, 提交 C1 可以被 rebase 到 C3 之后。这看起来 C1 中的工作是在 C3 之后进行的,但实际上是在 C3 之前。 一些开发人员喜欢保留提交历史,因此更偏爱 merge。而其他人(比如我自己)可能更喜欢干净的提交树,于是偏爱 rebase。仁者见仁,智者见智。 😄
git checkout main
git pull origin main
git merge side1
git merge side2
git merge side3
git push origin main
# 远程追踪
- 1.
git checkout -b foo o/main;git pull
正如你所看到的, 我们使用了隐含的目标 o/main 来更新foo
分支。需要注意的是main
并未被更新! - 2.
git branch -u o/main foo
这样foo
就会跟踪o/main
如果当前就在foo
分支上, 还可以省略foo
:git branch -u o/main
相比之下,第二个命令更明确
git checkout -b side o/main
git commit
git pull --rebase
git push
# git push参数
git push origin master
- 把这个命令翻译过来就是:
- 切到本地仓库中的“main”分支,获取所有的提交,再到远程仓库“origin”中找到“main”分支,将远程仓库中没有的提交记录都添加上去,搞定之后告诉我。
任务:本官我们要更新远程仓库中的foo
和main
,但是git checkout
被禁用了
git push origin main
git push origin foo
# git push参数2
:
冒号前添加的表示一个位置,提交到哪里的意思
git push origin foo:main
git push origin main^:foo
# git fetch参数
和上面是相同的,只是目标和出发地相反
git fetch origin main^:foo
git fetch origin foo:main
git checkout foo
git merge master
# 没有source的source
Git 有两种关于 <source>
的用法是比较诡异的,即你可以在 git push
或 git fetch
时不指定任何 source
,方法就是仅保留冒号和 destination
部分,source 部分留空。
没有会创建,有会删除,真的很神奇
git pull origin :bar
git push origin :foo
# git pull参数
git pull
参数和fetch
是相同的,只是多了一个merge
操作
git pull origin main:foo
- 哇, 这个命令做的事情真多。它先在本地创建了一个叫
foo
的分支,从远程仓库中的main
分支中下载提交记录,并合并到foo
,然后再merge
到我们的当前检出的分支bar
上。操作够多的吧?!
git pull origin bar:foo
git pull origin main:side