本文最后更新于88 天前,其中的信息可能已经过时,如有错误请发送邮件到3095478042@qq.com
一、Git 的基础知识
1.git主要命令
git commit-提交
创建一个新的提交对象,创建项目历史中的一个节点
git commit --amend:修改最新的提交
git branch-分支
用于创建、列出、重命名和删除分支
git branch:列出所有本地分支,当前分支前会有一个*号。git branch <name>:创建一个名为<name>的新分支(基于当前提交)。git checkout <name>或git switch <name>:切换到指定分支。git branch -d <name>:删除一个已合并的分支。git branch -D <name>:强制删除一个分支(即使它还没有被合并)。git checkout -b <new-name>或:git switch -c <new-name>创建并立即切换到新分支。
HEAD 指针
这是一个特殊的指针,它指向你当前所在的分支(也就是当前的工作目录状态)。当你切换分支时,HEAD 会指向新的分支。
git merge-合并
合并指定分支到当前分支,分支的历史合并在一起。它会创建一个新的合并提交(merge commit)
两种合并方式:
- Fast-Forward(快进合并): 如果目标分支(如
main)自分支创建以来没有新的提交,Git 会简单地将分支指针向前移动,指向源分支(如feature/login)的最新提交。不会创建额外的合并提交。- 如何避免快进合并? 使用
git merge --no-ff,这会强制创建一个合并提交,即使可以快进。这能更好地保留历史信息。
- 如何避免快进合并? 使用
- 3-Way Merge(三方合并): 如果目标分支有了新的提交,Git 会创建一个新的合并提交,这个提交有两个父提交(一个是
main的最新提交,一个是feature/login的最新提交)

git merge bugFix

git rebase-变基
变基。它可以将一个分支上的所有提交“复制”到另一个分支的顶端,从而重写项目历史,让提交历史更线性

git rebase main

2.HEAD
HEAD 是 Git 中一个特殊的指针
- 一般情况下,
HEAD间接地通过指向一个分支来工作,而并不直接指向一个提交
分离 HEAD状态是指 HEAD 指针直接指向某个具体的提交,而不是指向一个分支- 通过
git checkout <提交哈希>,让HEAD直接指向某个提交(移动的是HEAD),此时提交历史可独立延伸(但需注意:新提交若不关联分支,可能丢失)
- 通过

git checkout c1

3.相对引用
^(向上移动一代,并选择不同的父提交)- git checkout HEAD^
- 快速移动
HEAD或分支指针
~<n>(向上移动 n 代)- git checkout HEAD~3
- 将引用向上移动
n代,沿着第一个父提交一直回溯。这是在一条直线上向后移动的最常用方法
git branch -f <branch> <commit>是一个强大的命令,用于强制移动一个已存在分支的指针到指定的提交。git branch -f main HEAD~3将 main 分支强制指向 HEAD 的第 3 级 parent 提交- 它是一个重写历史的命令,具有破坏性,会丢弃目标分支上原有的最新提交。

git branch -f main c6

4.撤销变更
git reset通过把分支记录回退几个提交记录来实现撤销改动(会丢失历史,适合本地未推送的提交)- 语法:
git reset <提交哈希>(默认--mixed,移动指针 + 保留工作区修改);git reset --hard <提交哈希>(强制回退,丢弃修改)
- 语法:

git reset HEAD~1

git revert:创建新提交 “抵消” 旧提交的修改(安全,保留历史,适合已推送的提交)。- 语法:
git revert <提交哈希>(生成新提交,反转旧提交的修改)
- 语法:

git revert HEAD

C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。二、移动提交记录
1.整理提交记录(cherry-pick)
git cherry-pick- 复制指定提交到当前分支,生成新提交(哈希不同,但内容一致)
- 语法:
git cherry-pick <提交哈希>,可连续挑选多个提交。

git cherry-pick c2 c4

2.交互式的 rebase(变基)
git rebase -i- 作用:在变基过程中,手动编辑提交历史(如删除、合并、重排、修改提交说明),
- 流程:
- 执行
git rebase -i <目标提交>,进入交互界面。 - 通过编辑指令(
drop/squash/pick/reword等)调整提交。(沙盒中通过鼠标拖动调整顺序,点击删除) - 保存退出后,Git 按指令重写提交历史。
- 执行

git rebase -i HEAD~4

三、Git 技术、技巧与贴士大集合
1、本地栈式提交(只取一个提交记录)

- 利用cherry-pick
git checkout maingit cherry-pick C4
- 利用rebase -i
git rebase -i c1- Drop/Omit:丢弃该提交,选择c2,c3
git branch -f main c4'
2、提交的技巧 #1(rebase)

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

git commit --amend
修改最新的提交,


3、提交的技巧 #2(cherry-pick)

git checkout maingit cherry-pick c2git commit --amendgit cherry-pick c3

4、Git Tags(标签)
是用于标记特定提交的引用,通常用于标记发布版本(如 v1.0, v2.0等)

- git tag v1 c1

5、Git Describe
用来描述离你最近的标签
- 语法:
git describe <ref><ref>可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会使用你目前所在的位置(HEAD)
- 输出结果:
<tag>_<numCommits>_g<hash>tag表示的是离ref最近的标签,numCommits是表示这个ref与tag相差有多少个提交记录,hash表示的是你所给定的ref所表示的提交记录哈希值的前几位。

git describe main会输出:v1_2_gC2
git describe side会输出:v2_1_gC4
四、高级话题
1、多分支 rebase

git rebase main bugFixgit rebase bugFix sidegit rebase side anothergit branch -f main c7'

2、选择 parent 提交记录

- git checkout main^2


- git checkout HEAD~^2~2
- =
- git checkout HEAD;git checkout HEAD^2;git checkout HEAD~2



