前言

  • 这是一个陆爻齐跟着 Learn Git Branching 网站学习(复习) Git 的系列记录,会跟着其内容的步伐做学习记录,并结合自身浅薄的知识积累和几乎为零的实践经验做一点点的补充。

    https://learngitbranching.js.org

  • 私以为,该网站比较适合有一点 Git 基础来学习,如果是完全零基础,还是看看 Git 官网教程,在 GitHub 这样的代码托管网站走一遍流程比较好。

  • 注意,由于下面的笔记不可避免地涉及到过关的答案,所以强烈建议,自行体验过网站内容再看本文。

正文

做一名仁慈的独裁者一定会很有趣……

  • 好奇怪的引语,不过本章说是高级操作,陆爻齐在此前 git 出现奇怪问题的时候,向 gpt 请教过,给出类似的代码,有时奏效有时又寄,所以还是十分建议学习的:)

推送主分支

  • 这章要展示的是,开发者从远程仓库获取主分支的更新,然后在本地其它分支开发完后,如何在主分支上完成更新并推送的步骤。
  1. 获取主分支的更新,为了保持线性的提交历史,就可以采用git pull --rebase,注意,先切换到主分支再用 pull;

  2. 然后更新本地主分支,此时主分支已经接收了远程仓库的更新。那么这里为了线性的提交历史,还是选择 rebase 方法,分别让其它几个分支变基(【一起来学 Git】LearnGitBranching-基础篇【Learn Git Together】)就行;

  3. 最后推送,这个简单,git push;

合并远程仓库

  • 这章和上一章要解决的是一个问题,只不过不要求线性的提交历史,用 merge 实现主分支的功能更新。

  • merge 不说怎么搞了,但是这一章关卡过完就能够深刻地感受到,线性的提交历史多清晰,多好看。

远程跟踪分支

  • 本章解释了 main,origin/main 如何关联的。其实除了之前所说的 pull 和 push 时两者的关系外,它们其实在 clone 其实会自动关联起来。

  • 注意,远程分支的跟踪可以自定义,比如git checkout -b foo origin/main,那么就会新建一个分支 foo 跟踪远程分支 origin/main,此时要是git pull就会把本地没有的提交拉取下来,更新到 origin/main 和 foo 上。

  • 注意,自定义后,原来的 main 就没有跟踪 origin/main 了,所以刚刚的拉取不会更新 main。

  • 同理,推送 push 时,也可以推送到远程的指定分支,比如上面关联后,git push就会把 foo 上新的提交推送到远程仓库的 main 上。

  • 但是,上面的绑定方法也会新建分支,有没有直接绑定现有分支和远程分支的方法呢?有的:)git branch -u origin/main foo就能让 foo 跟踪 远程仓库的 main ,而且如果当前分支就是 foo,还能省略成git branch -u origin/main

Git push 的参数

  • 有时候想不切换过去,而是直接推送一个分支上去,那就用到本章知识。

  • 比如,当前的HEAD指针在其它地方,却想把本地的 foo 分支推到远程的 foo 分支。而如果直接写git push,是不会有用的,因为完整的句子其实是git push <remote> <locale>。这里的<remote>指的是目的地——远程仓库,一般写 origin 就行,<locale>是本地分支的名字。

Git push 的参数2

  • 上面的 push 参数能够让指定分支推送上去,但有时候在其他分支开发的东西,想推送到远程仓库的指定分支,这个时候就可以设定 push 的参数来实现。

  • 比如git push origin foo^:main就会把 foo 的上一个提交之前的远程仓库没有的提交推送到远程仓库的 main 分支上,如果远程仓库没有 main 分支,就会新建一个 main 分支获取推送信息。

Git fetch 的参数

  • 与上面的 push 类似,拿例子比较好理解。

  • 对于git fetch origin foo 则会把远程仓库中foo的本地没有的提交给 fetch 下来,更新到 origin/foo 上。

  • 对于git fetch orgin main^:foo则会把远程仓库的main分支上一个提交之前的本地没有的分支 fetch 到本地的 foo 分支上,注意,是 foo 和 origin/main 上,不是 origin/foo。(这个操作几乎用不到,但语法是支持的)

  • 最后,绝大部分情况下,一个git fetch拉取那些更新就行,不用搞上面那些虚头八脑的。

没有 source 的 source

  • 这里看网站内容才能理解标题的含义,下面主要简单说下知识点。

  • Git 支持下面删除远程分支的方式git push origin :foo就会把远程仓库中的 foo 分支给删除。

  • 同时也支持下面创建新分支的方式git fetch origin :bar就会在本地新建一个叫 bar 的分支

Git pull 的参数