Git基本操作快速入门

180 阅读5分钟

基础篇

git commit:

执行git commit

Peek 2023-02-03 10-48.gif

创建一个新的提交记录C2,C2 的父节点是C1,父节点是当前提交中变更的基础。


git branch

Git 的分支也非常轻量。它们只是简单地指向某个提交记录,在将分支和提交记录结合起来后,我们会看到两者如何协作。现在只要记住使用分支其实就相当于在说:“我想基于这个提交以及它所有的父提交进行新的工作。”

使用 git branch new Image 创建分支,新创建的分支 newImage 指向的是提交记录 C1

Peek 2023-02-03 10-50.gif

现在咱们试着往新分支里提交一些东西。执行git commit

Peek 2023-02-03 10-50.gif

为什么 main 分支前进了,但 newImage 分支还待在原地呢?!这是因为我们没有“在”这个新分支上,看到 main 分支上的那个星号(*)了吗?这表示当前所在的分支是 main

使用 git checkout 可以切换分支 在当前分支(带*号)上进行commit,修改会保存到当前的分支 执行git cehckout newmage;git commit

Peek 2023-02-03 10-52.gif

创建一个新的分支同时切换到新创建的分支:可以通过 git checkout -b <your-branch-name> 来实现。


git merge

在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。翻译成自然语言相当于:“我要把这两个父节点本身及它们所有的祖先都包含进来。”

执行git merge bugFix

Peek 2023-02-03 10-18.gif

首先,main 现在指向了一个拥有两个父节点的提交记录。假如从 main 开始沿着箭头向上看,在到达起点的路上会经过所有的提交记录。这意味着 main 包含了对代码库的所有修改

这时再执行git checkout bugFix;git merge main,结果如下

Peek 2023-02-03 10-55.gif

因为 main 继承自 bugFix,Git 什么都不用做,只是简单地把 bugFix 移动到 main 所指向的那个提交记录。


git rebase

Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。 我们想要把 bugFix 分支里的工作直接移到 main 分支上。移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。

Peek 2023-02-03 10-21.gif

现在我们切换到了 main 上。把它 rebase 到 bugFix 分支上,执行git rebase bugFix

Peek 2023-02-03 10-24.gif

好了!由于 bugFix 继承自 main,所以 Git 只是简单的把 main 分支的引用向前移动了一下而已。


高级篇

分离HEAD

HEAD 总是指向当前分支上最近一次提交记录,HEAD 通常情况下是指向分支名的(如 bugFix) 执行git checkout C1; git checkout main; git commit; git checkout C2 如下图,HEAD 指向了 main,随着提交向前移动。

Peek 2023-02-03 10-27.gif

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


相对引用 (^) 和 (~)

通过指定提交记录哈希值的方式在 Git 中移动不太方便。 git相对引用的两个简单的用法:

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

git checkout main^

Peek 2023-02-03 10-31.gif

git checkout HEAD~4

Peek 2023-02-03 10-32.gif

强制修改分支位置

现在用它来做点实际事情。

作者使用相对引用最多的就是移动分支。可以直接使用 -f 选项让分支指向另一个提交。例如:

git branch -f main HEAD~3

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

Peek 2023-02-03 10-34.gif


撤销变更

有两种方法用来撤销变更 —— 一是 git reset,还有就是 git revert

git reset 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。

git reset HEAD~1

Peek 2023-02-03 10-35.gif

Git 把 main 分支移回到 C1;现在我们的本地代码库根本就不知道有 C2 这个提交了。 (译者注:在reset后, C2 所做的变更还在,但是处于未加入暂存区状态。)

虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!

为了撤销更改并分享给别人,我们需要使用 git revert

git revert HEAD

Peek 2023-02-03 10-37.gif

奇怪!在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。

revert 之后就可以把你的更改推送到远程仓库与别人分享啦。


移动提交记录,自由修改提交树

git cherry-pick

如果你想将一些提交复制到当前所在的位置(HEAD)下面的话, Cherry-pick 是最直接的方式了。 git cherry-pick C2 C4

Peek 2023-02-03 10-39.gif 我们只需要提交记录 C2 和 C4,所以 Git 就将被它们抓过来放到当前分支下了。

git rebase

如果你不清楚你想要的提交记录的哈希值呢? 我们可以利用交互式的 rebase —— 如果你想从一系列的提交记录中找到想要的记录

交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i 如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。

当 rebase UI界面打开时, 你能做3件事: - 调整提交记录的顺序 - 删除你不想要的提交 - 合并提交。 简而言之,它允许你把多个提交记录合并成一个。


杂项(这个去做一遍更好) Git 技术、技巧与贴士大集合 提交的技巧 git tag git describe... 后面的关卡还有远程的操作,没写


远程的操作

git pull --rebase

执行如下,就会有图中的结果,

git fetch
git rebase o/main
git push

git pull --rebase是上面的缩写,结果是一样的,rebase o/main就放到o/main的前头

fetch_rebase_push.gif

不带参数,直接git pull是以下的缩写

git fetch
git merge o/main
git push

fetch_merge.gif


参考文章

git关卡网站 learngitbranching.js.org/?locale=zh_…

【Git】Learn Git Branching 总结 www.jianshu.com/p/6e94b5592…