Git改变历史-章节笔记
Git权威指南改变历史章节笔记
章节分为两个部分
1、“悔棋” 指最近的一次或最近几次的提交进行更改。
2、“穿越” 指对之前的某次历史提交进行修改,不对对其他提交进行修改
悔棋
修改最近一次的提交信息
git commit --amend
gerrit中,克隆了代码和钩子文件后,如果代码提交中没有Change-ID,使用此命令还会生成Change-ID。
修改最近一次提交
vim helloworld.c 重新修改文件
git add helloworld.c 添加到暂存区
git commit --amend 编辑提交信息(不修改可以在--no-edit参数)
多步悔棋(最近多个提交合并成一个)
git reset --soft HEAD^^想修改几个提交合一就会退几步
(如果有修改需要git add添加到暂存区)
git commit -m "modify helloworld.c"提交
穿越
删除某次提交,后续不变
举例将图一的提交记录删除提交"c"
(图一)
方法一 拣选操作git cherry-pick
我想删除 "c"
那么就要到 HEAD指向 "b" git checkout 8683ce86
之后跳过"c"去cherry-pick "d""e""f"
git cherry-pick bccd918b "d"
git cherry-pick a57a2eec "e"
git cherry-pick c4d8c3ec "f"
提示文件有冲突的需要解决冲突后执行git cherry-pick --continue
git checkout master 切回master
git reset --hard HEAD@{1} 到此结束
通过git reflog可以看出
HEAD@{1}就是之前cherry-pick后的哈希值

通过cherry-pick这种方式修改的内容相同但是提交的哈希值不同

思考:经过方法一目前状态变成了HEAD->haiji->9e1512a2,下面要使用第二方法进行实验我们需要恢复到进行方法一之前的状态(即HEAD->haiji->c4d8c3ec),需要执行什么指令呢?
方法二 变基操作git rebase
git rebase --onto <newbase> <since> <till>
git rebase --onto 8683ce86 0d884488 c4d8c3ec
<newbase> 是b的哈希值
<since> 是c的哈希值(从这里开始但是不包括这个
<till> 是f的哈希值(到这里结束包括这个
提示文件有冲突的需要解决冲突后执行git rebase --continue
git checkout master
git reset --hard HEAD@{1}
方法三 交互变基操作git rebase -i
git rebase -i 8683ce86 因为要删除“c” 所以这里用"b"的哈希值
出来的文件编辑删除第一行也就是“pick c”删掉
合并历史中的几次提交,后续不变
合并某两次提交
git checkout 要合并提交的哈希值
git reset --soft HEAD^^ 回到两次提交前
git commit 提交信息
git cherry-pick 一个一个后续提交
git checkout master 切回master
git reset --hard HEAD@{1}
变基操作 rebase
比如将ABCDEF变成AB(CD)EF
git checkout D的哈希值
git reset --soft HEAD^^ 退到B了
git commit 提交信息 记住提交的哈希值xxx
git rebase --onto xxx E^ master
交互变基操作 rebase -i
比如将ABCDEF变成AB(CD)EF
git rebase -i C^
将要合并的pick修改为squash
保存
再编辑提交信息
保存
完成
2025/05/15修改
发现了被忽视掉的git reflog
这个指令可以查看 HEAD 引用的移动历史记录。它记录了所有分支的引用变化,包括提交、重置、合并、切换分支等操作,即使这些操作没有保存在常规的提交历史中。
这样就能够理解上面修改历史中最后总是使用** HEAD@{1} **的原因了
核心作用
恢复丢失的提交:当你执行 git reset --hard 或删除分支后,提交并没有立即消失,reflog 可以帮助你找回这些“丢失”的提交。
追踪操作历史:记录所有 HEAD 的移动,包括未提交的操作(如 checkout、reset、merge 等)。
调试工具:当你误操作后,可以通过 reflog 回溯到操作前的状态。

浙公网安备 33010602011771号