最近工作时发现一个挺有意思的Git命令练习网址(https://learngitbranching.js.org)感兴趣的可以去挑战一下
下面是其中一些比较常用的命令
基础命令
1.Git Commit (提交代码,只是本地仓库)
Git 仓库中的提交记录保存的是你的目录下所有文件的快照,就像是把整个目录复制,然后再粘贴一样,但比复制粘贴优雅许多!
Git 希望提交记录尽可能地轻量,因此在你每次进行提交时,它并不会盲目地复制整个目录。条件允许的情况下,它会将当前版本与仓库中的上一个版本进行对比,并把所有的差异打包到一起作为一个提交记录。
Git 还保存了提交的历史记录。这也是为什么大多数提交记录的上面都有父节点的原因 —— 我们会在图示中用箭头来表示这种关系。对于项目组的成员来说,维护提交历史对大家都有好处。
修改代码库,并把这些修改保存成了一个提交记录 C2
。C2
的父节点是 C1
,父节点是当前提交中变更的基础。
2.Git Branch(建立新的分支)
3.Git Checkout <分支名> (切换到指定的分支)
Git 的分支也非常轻量。它们只是简单地指向某个提交纪录。即使创建再多的分支也不会造成储存或内存上的开销,并且按逻辑分解工作到不同的分支要比维护那些特别臃肿的分支简单多了。
新创建的分支 newImage
指向的是提交记录 C1
。
在不同分支提交不会影响其他分支,git checkout <分支名> 来切换到指定的分支,再提交就是提交相应的分支数据
4.Git Merge (合并分支)
在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。翻译成自然语言相当于:“我要把这两个父节点本身及它们所有的祖先都包含进来。”
Git Merge bugFix
首先,main
现在指向了一个拥有两个父节点的提交记录。假如从 main
开始沿着箭头向上看,在到达起点的路上会经过所有的提交记录。这意味着 main
包含了对代码库的所有修改。↓↓↓
还有,看见各个提交记录的颜色变化了吗?为了帮助学习理解,我引入了颜色搭配。每个分支都有不同的颜色,而每个提交记录的颜色是所有包含该提交记录的分支的颜色混合之后的颜色。
所以,main
分支的颜色被混入到所有的提交记录,但 bugFix
没有。下面咱们让它也改变一下颜色。****
因为 main
继承自 bugFix
,Git 什么都不用做,只是简单地把 bugFix
移动到 main
所指向的那个提交记录。
现在所有提交记录的颜色都一样了,这表明每一个分支都包含了代码库的所有修改!
5.Git Rebase ( 合并分支 )
git rebase
是另一种合并分支的方法。Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。
Rebase 的优势就是可以创造更线性的提交历史,这听上去有些难以理解。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。
现在 bugFix 分支上的工作在 main 的最顶端,同时我们也得到了一个更线性的提交序列。
注意,提交记录 C3 依然存在(树上那个半透明的节点),而 C3’ 是我们 Rebase 到 main 分支上的 C3 的副本。
现在唯一的问题就是 main 还没有更新,下面咱们就来更新它吧……
远程仓库操作命令
1.Git Clone(复制一个本地仓库到远程)
2.Git Fetch(获取远程数据)
C2
,C3
被下载到了本地仓库,同时远程分支 o/main
也被更新,反映到了这一变化
git fetch
完成了仅有的但是很重要的两步:
- 从远程仓库下载本地仓库中缺失的提交记录
- 更新远程分支指针(如
o/main
)
git fetch
并不会改变你本地仓库的状态。它不会更新你的 main
分支,也不会修改你磁盘上的文件。
理解这一点很重要,因为许多开发人员误以为执行了 git fetch
以后,他们本地仓库就与远程仓库同步了。它可能已经将进行这一操作所需的所有数据都下载了下来,但是并没有修改你本地的文件。我们在后面的课程中将会讲解能完成该操作的命令 😄
3.Git Pull(获取远程数据,相当于git fetch 和 git merge 的缩写)
既然我们已经知道了如何用 git fetch
获取远程的数据, 现在我们学习如何将这些变化更新到我们的工作当中。
其实有很多方法的 —— 当远程分支中有新的提交时,你可以像合并本地分支那样来合并远程分支。也就是说就是你可以执行以下命令:
-
git cherry-pick o/main
-
git rebase o/main
-
git merge o/main
-
等等
实际上,由于先抓取更新再合并到本地分支这个流程很常用,因此 Git 提供了一个专门的命令来完成这两个操作。它就是我们要讲的 git pull
。
git pull
就是 git fetch 和 git merge 的缩写! 分别执行和用pull是一样的,一般情况用pull就行,但如果要进行复制操作就得用拆开的命令组合。
4.Git Push
git push
负责将你的变更上传到指定的远程仓库,并在远程仓库上合并你的新提交记录。一旦 git push
完成, 你的朋友们就可以从这个远程仓库下载你分享的成果了!
你可以将 git push
想象成发布你成果的命令。它有许多应用技巧,稍后我们会了解到,但是咱们还是先从基础的开始吧……
注意 —— git push
不带任何参数时的行为与 Git 的一个名为 push.default
的配置有关。它的默认值取决于你正使用的 Git 的版本,但是在教程中我们使用的是 upstream
。 这没什么太大的影响,但是在你的项目中进行推送之前,最好检查一下这个配置。