MetadataFeb 26, 2024
TAGS
gittools
Skip to content
从游戏开始快速入门git

git commit -m "init(*): Hello World!"


介绍 ​

这是一个挺有趣的git小游戏,我还是比较喜欢这种互动式学习的

这里是链接: git游戏

下面是游戏的攻略(?)

基础篇 ​

Git Commit ​

Git Commit

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

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

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

创建两个commit即可

shell
git commit
git commit

Git Branch ​

Git Branch

Git 的分支也非常轻量。它们只是简单地指向某个提交纪录 —— 仅此而已。所以许多 Git 爱好者传颂:

早建分支!多用分支! 这是因为即使创建再多的分支也不会造成储存或内存上的开销,并且按逻辑分解工作到不同的分支要比维护那些特别臃肿的分支简单多了。

在将分支和提交记录结合起来后,我们会看到两者如何协作。现在只要记住使用分支其实就相当于在说:“我想基于这个提交以及它所有的 parent 提交进行新的工作。”

创建分支并切换到新分支

shell
git branch bugFix
git checkout bugFix

Git Merge ​

Git Merge

太好了! 我们已经知道如何提交以及如何使用分支了。接下来咱们看看如何将两个分支合并到一起。就是说我们新建一个分支,在其上开发某个新功能,开发完成后再合并回主线

shell
$ git branch bugFix

$ git checkout bugFix

$ git commit

$ git checkout main

$ git commit

$ git merge bugFix

Git Rebase ​

Git Rebase

第二种合并分支的方法是 git rebase。Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。

Rebase 的优势就是可以创造更线性的提交历史,这听上去有些难以理解。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。

shell
$ git checkout bugFix -b

$ git commit

$ git checkout main

$ git commit

$ git checkout bugFix

$ git rebase main

高级篇 ​

分离HEAD ​

HEAD

我们首先看一下 “HEAD”。 HEAD 是一个对当前所在分支的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。

HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。

HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见

分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。

shell
git checkout c1

相对引用 ​

相对引用

通过指定提交记录哈希值的方式在 Git 中移动不太方便。在实际应用时,并没有像本程序中这么漂亮的可视化提交树供你参考,所以你就不得不用 git log 来查查看提交记录的哈希值。

并且哈希值在真实的 Git 世界中也会更长(译者注:基于 SHA-1,共 40 位)。例如前一关的介绍中的提交记录的哈希值可能是 fed2da64c0efc5293610bdd892f82a58e8cbc5d8。舌头都快打结了吧...

比较令人欣慰的是,Git 对哈希的处理很智能。你只需要提供能够唯一标识提交记录的前几个字符即可。因此我可以仅输入fed2 而不是上面的一长串字符。

  • 使用 ^ 向上移动 1 个提交记录
  • 使用 ~<num> 向上移动多个提交记录,如 ~3
shell
$ git checkout bugFix^

强制修改分支位置 ​

强制修改分支位置

shell
git branch -f main HEAD~3

上面的命令会将 main 分支强制指向 HEAD 的第 3 级 parent 提交

shell
$ git checkout c6
$ git branch -f main HEAD
$ git checkout HEAD~3
$ git branch -f bugFix HEAD~

标答说能三步,我不知道怎么实现

撤销变更 ​

  • git reset不保留记录,但是不能再远程仓库中起到作用
  • git revert生成一个撤回记录
shell
$ git reset HEAD^

$ git checkout pushed

$ git revert HEAD

要注意reset需要多向上一格

整理提交记录 ​

Git Cherry-pick ​

直接复制相关git commit到HEAD下

shell
$ git cherry-pick c3 c4 c7

交互式rebase ​

交互式rebase

交互式的 rebase 当你知道你所需要的提交记录(并且还知道这些提交记录的哈希值)时, 用 cherry-pick 再好不过了 —— 没有比这更简单的方式了。

但是如果你不清楚你想要的提交记录的哈希值呢? 幸好 Git 帮你想到了这一点, 我们可以利用交互式的 rebase —— 如果你想从一系列的提交记录中找到想要的记录, 这就是最好的方法了

加入-i改为交互式

shell
git rebase -i HEAD~4