learngit 学习git

100 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

learngit 学习git

learngitbranching.js.org/?locale=zh_…

基础篇

1. Git Commit

git commit

2. Git Branch

git branch bugFix // 创建分支
git checkout bugFix // 切换分支

3. Git Merge

git branch bugFix // 创建bugFix分支
git checkout bugFix // 切换到bugFix分支
git commit // 在bugFix分支上提交
git checkout main // 切换到main分支
git commit // 在main分支上提交
git merge bugFix // 将bugFix分支上的提交合并到main分支

4. Git Rebase

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

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

git checkout -b bugFix // 创建bugFix分支并切换到

高级篇

1. 分离 HEAD

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

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

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

git checkout C4 // 将HEAD的指向指到C4

2. 相对引用(^)

操作符 (^)。把这个符号加在引用名称的后面,表示让 Git 寻找指定提交记录的父提交。

所以 main^ 相当于“main 的父节点”。

main^^ 是 main 的第二个父节点

git checkout bugFix^

3. 相对引用(~)

“~”操作符

如果你想在提交树中向上移动很多步的话,敲那么多 ^ 貌似也挺烦人的,Git 当然也考虑到了这一点,于是又引入了操作符 ~。

该操作符后面可以跟一个数字(可选,不跟数字时与 ^ 相同,向上移动一次),指定向上移动多少次。

强制修改分支位置

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

git branch -f bugFix C0
git branch -f main C6
git checkout HEAD~1

4. 撤销变更

Git Reast

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

Git Revert

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

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

  • 要撤销的提交记录后面多了一个新提交.状态和要撤销之前的状态一致。
git reset C1
git checkout pushed
git revert C2

移动提交记录

1. Git Cherry-pick

将一些提交复制到当前所在的位置

git cherry-pick C3
git cherry-pick C4
git cherry-pick C7

2. 交互式 rebase

交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i

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

当 rebase UI界面打开时, 你能做3件事:

  • 调整提交记录的顺序(通过鼠标拖放来完成)
  • 删除你不想要的提交(通过切换 pick 的状态来完成,关闭就意味着你不想要这个提交记录)
  • 合并提交。 遗憾的是由于某种逻辑的原因,我们的课程不支持此功能,因此我不会详细介绍这个操作。简而言之,它允许你把多个提交记录合并成一个。
git rebase -i HEAD~4  // UI

杂项

1. 只取一个提交记录

git checkout main
git cherry-pick C4

2. 提交的技巧-1

git rebase -i HEAD~2
git commit --amend
git rebase -i HEAD~2
git branch -f main C3''

3. 提交的技巧-2

cherry-pick 可以将提交树上任何地方的提交记录取过来追加到 HEAD 上(只要不是 HEAD 上游的提交就没问题)。

git checkout main
git cherry-pick C2
git commit --amend
git cherry-pick C3

4. Git Tag

git tag v0 C1
git tag v1 C2
git checkout C2

5. Git Describe

Git Describe 能帮你在提交历史中移动了多次以后找到方向;当你用 git bisect(一个查找产生 Bug 的提交记录的指令)找到某个提交记录时,或者是当你坐在你那刚刚度假回来的同事的电脑前时, 可能会用到这个命令。

git describe 的语法是:

git describe

可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(HEAD)。

它输出的结果是这样的:

__g

tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。

当 ref 提交记录上有某个标签时,则只输出标签名称

git describe main
git describe side
git commit

高级话题

1. 多次Rebase

git rebase main bugFix 
git rebase bugFix side 
git rebase side another 
git rebase another main

2. 两个父节点

操作符 ^ 与 ~ 符一样,后面也可以跟一个数字。

但是该操作符后面的数字与 ~ 后面的不同,并不是用来指定向上返回几代,而是指定合并提交记录的某个父提交。

git branch bugFix main^^2^

3. 纠缠不清的分支

git checkout one
git cherry-pick C4 C3 C2
git checkout two
git cherry-pick C5 C4 C3 C2
git branch -f three C2