# 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”分支,将远程仓库中没有的提交记录都添加上去,搞定之后告诉我。

任务:本官我们要更新远程仓库中的foomain,但是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 pushgit 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
lastUpdate: 4/2/2023, 8:18:35 PM