作者:opLW
目录
1. 重命名最新commit
2. 重命名历史commit
3. 重命名根节点commit
4. 总结
1. 重命名最新commit
- 概述 重命名分支最新commit,主要使用到
git commit --amend -m 'new_message'
命令。 - 步骤
- 对于分支最新commit,我们使用
git commit --amend -m 'two'
重命名。 - 除了master分支有最新commit外,test分支也有最新commit。因此使用
git checkout test
切换到该分支。 - 位于test分支后使用
git commit --amend -m 'one-two'
重命名test分支最新commit。
- 对于分支最新commit,我们使用
- 结果 此时两个分支的最新commit都已经修改完毕。
注意:git commit --amend -m 'new_message'
命令相当于撤销之前的提交,然后携带新的信息进行一次新的提交,所以重命名后,该节点的id会发生变化。
2. 重命名历史commit
- 概述 重命名历史commit相对比较复杂,需要配合
rebase
相关命令:git rebase -i parent_commit_id
。- 其中
parent_commit_id
为需要重命名commit的父亲节点的id。如此情景中我们修改1
,因此需要其父亲commitInitial commit
的id。 - 注意:修改分支历史commit的信息,需要先切换至该分支。
- 其中
- 步骤 经过前面的操作,当前在test分支。
- 首先通过
git log --oneline --all --graph
查看Initial commit
的id。如下图所示为d1a0b5e
- 使用命令
git rebase -i d1a0b5e
,进入如下页面
其中红色部分为当前待执行的命令,黄色部分为可供选择的命令,因为我们要修改1
、1-1
的commit信息,所以需要使用紫色线对应的命令reword
。 - 使用
reword
修改上面的文件,修改并保存。 - 由于新的文件中需要对两条commit进行重命名,所以系统弹出如下界面供用户输入新的信息。
我们将1
修改为one
并保存。红色部分表明此时在执行reword c6b6d01 1
,还有reword 06a51af 1-1
待处理。所以保存好这次的修改后,系统会弹出第二个修改页面,同理进行修改即可。
- 首先通过
- 结果
奇怪的是产生了一个新的commit:one
而原来的1
还在。我们看下最新的日志
可以发现在test
分支中Initial commit
以上的commit的id都发生了变化,这也是reabse
的一个缺点。
3. 重命名根节点commit
- 概述 前一小节中,重命名历史commit需要父亲commit的id,那没有父亲commit的节点怎么办?对于没有父亲commit的节点如
Initial commit
,则使用命令git rebase -i --root
。 - 步骤 目前已经切换至master分支。
- 使用
git rebase -i --root
命令,其中--root
代替parent_commit_id
。 - 执行类似前一小节的操作。
- 使用
- 结果
前一小节中,两条分支以Initial commit
为基准点分成两条分支。而这里由于对根commit
进行rebase
操作,所以整个树变为完全不相干的两条独立分支。我们看下最新的日志
可以发现所有commit_id
几乎都发生了变化,这也是rebase
的缺点。 - 参考文章 Edit the root commit in Git?
4. 总结
- 注意 上述重命名commit的方式都会导致commit的id发生变化,甚至导致树的结构发生变化。
- 所以如果我们是和其他人合作开发的,那么重命名之前最好进行商榷。否则commit的id发生变化,会导致一些列不必要的麻烦。
- 或者只在个人分支进行修改。
- 可能感兴趣的问答:How to modify existing, unpushed commit messages?
万水千山总是情,麻烦手下别留情。
如若讲得有不妥,文末留言告知我,
如若觉得还可以,收藏点赞要一起。