Git:每一个开发者都必须要学习的工具

大约 4 分钟工具

什么是Git?

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。在开发中分布式文件管理系统,可以便于多人协作开发。

交互式学习Git

这里提供一个可供交互式学习Git的网站,可以先学起来,后面我会陆续更新常用指令文档。Learn Git Branchingopen in new window

Git的安装

  • For Macos:自带
  • For Windows:等我在虚拟机里研究一下再写

Git初步(基础篇)

说实话,git只是一个工具,不需要了解的过于深入,只要不把命令用错就行。

警告

如果你在命令里发现了-f,请一定一定要谨慎,你可能会把同事的仓库吃掉!

在你开始之前

Git 仓库中的提交记录保存的是你的目录下所有文件的快照,就像是把整个目录复制,然后再粘贴一样,但比复制粘贴优雅许多!

Git 希望提交记录尽可能地轻量,因此在你每次进行提交时,它并不会盲目地复制整个目录。条件允许的情况下,它会将当前版本与仓库中的上一个版本进行对比,并把所有的差异打包到一起作为一个提交记录。

Git 还保存了提交的历史记录。这也是为什么大多数提交记录的上面都有父节点的原因 —— 我们会在图示中用箭头来表示这种关系。对于项目组的成员来说,维护提交历史对大家都有好处。

关于提交记录太深入的东西咱们就不再继续探讨了,现在你可以把提交记录看作是项目的快照。提交记录非常轻量,可以快速地在这些提交记录之间切换!

Git commit

git commit

用于创建新的提交记录,即创建一个新的节点,并使当前分支指向新的节点

Git branch

git branch <branch name> #创建新分支
git checkout <branch name> #切换到新分支
git switch <branch name> #推荐使用的切换到新分支的命令
git checkout -b <branch name> #创建新分支并切换到新分支

按逻辑分解工作到不同的分支

Git merge

git merge <branch2> #把branch2合并到当前分支里,但不改变branch2

git checkout <branch2> #切换到branch2
git merge <branch1> #把branch2也更新到最新的分支

当没有一个分支包含了我们修改的所有内容,通过合并这两个分支来解决这个问题

Git rebase

git rebase <branch eg.main> #注意,请在需要合并的分支上操作
git rebase <branch eg.bugFix> #更新主分支

第二种合并分支的方法,Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。Rebase 的优势就是可以创造更线性的提交历史。

远程篇

git clone

使用

从技术上来讲,git clone 命令在真实的环境下的作用是在本地创建一个远程仓库的拷贝(如 github.comopen in new window)。 但在我们的教程中使用这个命令会有一些不同 —— 它会在远程创建一个你本地仓库的副本。显然这和真实命令的意思刚好相反,但是它把本地仓库和远程仓库关联到了一起。

git clone

发生了什么?

第一个事就是在本地仓库多了一个名为 o/main 的分支, 这种类型的分支就叫远程分支。由于远程分支的特性导致其拥有一些特殊属性。

远程分支反映了远程仓库(在你上次和它通信时)的状态。

远程分支有一个特别的属性,在你切换到远程分支时,自动进入分离 HEAD 状态。

为什么有'o/'?

远程分支有一个命名规范 —— 它们的格式是:<remote name>/<branch name>

大多数的开发人员会将它们主要的远程仓库命名为 origin,并不是 o。这是因为当你用 git clone 某个仓库时,Git 已经帮你把远程仓库的名称设置为 origin 了。

注意

checkout o/main并提交时,会进入HEAD分离状态

git fetch

git fetch

它做了什么

  • 从远程仓库下载本地仓库中缺失的提交记录
  • 更新远程分支指针(如 o/main)

远程分支反映了远程仓库在你最后一次与它通信时的状态,git fetch 就是你与远程仓库通信的方式了

它没做什么

  • git fetch 并不会改变你本地仓库的状态。它不会更新你的 main 分支,也不会修改你磁盘上的文件。
  • 可以理解为单纯的下载操作。

git pull

实际上,由于先抓取更新再合并到本地分支这个流程很常用,因此 Git 提供了一个专门的命令来完成这两个操作。

git pull

可以理解为,git pull就是git fetch和git merge的缩写

团队合作篇