Git 进阶——告别三板斧
前言
Git 三板斧指 git commit、git pull、git push。此篇分享开发过程中经常会使用到的 Git 进阶操作。
虽说会了三板斧就可以横行江湖,但总觉得不够潇洒飘逸。
阅读本文需要有一定 Vim 基础。
修改上个 commit 内容
场景:提交完一个 commit 之后,发现提交的message信息不够准确想要修改。
使用: git commit --amend 命令。输入命令后会进入 Vim 编辑界面修改提交 message 即可。
1 | firstOne |
输入 I 进入编辑模式,firstOne 修改成想要的信息,ESC键退出编辑模式 输入 :wq保存并退出 Vim。再使用 git log命令查看结果。
git commit –amend 命令必须在代码未 push到远程分支使用,不建议修改远程分支的 message 信息。
合并多个 commit 内容
场景:提交多个 commit 之后发现,前面提交的 commit 信息和现在提交的相近描述,为了分支 commit 信息可阅读性,建议把最近提交的 commit 信息合并成一个。
使用: git rebase -i Head~3 合并提交。
Head~3 代表近三个 commit
1 | pick d5d8c16 firstOne |
把 third 和 second 合并到 firstOne。把对应要合并信息前的 pick 修改为 s 即可(如下所示)。
1 | pick d5d8c16 firstOne |
修改完之后输入 :wq 会进入到如下所示。
1 | 这是一个 3 个提交的组合。 |
按照提示把 third和second删除掉留下firstOne即可,也可以全部删除重新编辑新的作为合并这三个commit的message信息。完成之后退出 Vim。同样可以使用 git log命令查看。
同样不建议修改已 push 到远程的 commit。
git revert
场景:代码 commit 并且 push 之后,产品经理说这个功能还是原来的好,因为已经提交到公共开发分支,为了不影响其他开发者。
使用:git revert
用法相对来说比较简单,只要根据 git 的提示一步步操作就行。git revert -h看下使用说明,这里就不再做演示了。
1 | 用法:git revert [<选项>] <提交号>... |
git revert 对比 git reset
git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。- 使用
git revert可以作用于已经 push 的 commit 。 git reset是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。
git stash
场景一:此时正在A分支上开发接到一个紧急的需求需要去B分支修复一个bug,此时A分支的任务还没开发好不想 commit 。
步骤:
在 A 分支使用
git stash暂存已修改的代码,执行之后代码会回到上个commit。使用
git stash list查看暂存清单使用
git switch B切换到B分支修复完bug之后再切换回 A 分支。使用 git stash pop 就回到熟悉的状态,又可以在 A 分支继续愉快的开发了。
场景二:写完最后一个分号准备 commit 的时候发现自己没有在正确的分支进行开发。
说明:可以使用 git stash把修改未提交的代码从 A 分支 移动到 B 分支。步骤上面类似。
恢复本地错误操作
场景:进行了一系列 git 命令之后想还原到最初的时刻。
步骤:
使用
git reflog show察看历史版本记录。如下所示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22ae7c1b0 (HEAD -> main) HEAD@{0}: reset: moving to ae7c1b0
2437376 (origin/main) HEAD@{1}: reset: moving to HEAD
2437376 (origin/main) HEAD@{2}: reset: moving to 2437376
ae7c1b0 (HEAD -> main) HEAD@{3}: revert: Revert "firstOne"
2437376 (origin/main) HEAD@{4}: reset: moving to Head~1
a4bc216 HEAD@{5}: revert: Revert "firstOne"
2437376 (origin/main) HEAD@{6}: reset: moving to Head~1
48cdd88 HEAD@{7}: reset: moving to HEAD
48cdd88 HEAD@{8}: commit: 111
2437376 (origin/main) HEAD@{9}: rebase (finish): returning to refs/heads/main
2437376 (origin/main) HEAD@{10}: rebase (squash): firstOne
4bb0287 HEAD@{11}: rebase (squash): # 这是一个 2 个提交的组合。
d5d8c16 HEAD@{12}: rebase (start): checkout HEAD~3
ebbe0a1 HEAD@{13}: commit: third
f768621 HEAD@{14}: commit: second
d5d8c16 HEAD@{15}: commit (amend): firstOne
a41872c HEAD@{16}: commit (amend): firstOne
e50328a HEAD@{17}: commit: first
6dee34b HEAD@{18}: reset: moving to HEAD
6dee34b HEAD@{19}: commit: add ConversionService
a0313c5 HEAD@{20}: commit: NIO
5f611c7 HEAD@{21}: commit: SPI记下版本号(commit id SHA)使用 git rest –hard <版本号> 恢复。
git reflog 对比 git log
git log是显示当前的HEAD和它的祖先的,递归是沿着当前指针的父亲,父亲的父亲。。。git reflog根本不遍历HEAD的祖先。它是HEAD所指向的一个顺序的提交列表。记录下所有在本地进行的操作。不包括
pushesfetches与远程分支有关的命令。
签出指定文件
场景:此时正在 A 分支编码,想参考 B 分支的一个类(A分支没有之歌文件)。
使用:git checkout <分支> -- <文件路径>
查看本地分支是否合并
场景:年纪大了记性会不好,时常会忘记feature分支是否合并到maser分支。
使用:
git branch --no-merged查看未被合并的分支git branch --merged查看已被合并的分支
总结
此篇没有罗列 Git 各种命令的能力,而是结合开发场景介绍了使用频率较高的几个 Git 命令。希望对你有帮助尽快摆脱 Git 三板斧(git commit、git pull、git push)的囧境。