Git 是 Linus 大佬创造的版本管理工具。常见的命令有 git add、git commit、git push、git pull、git stash、git reset、git revert 等。以上命令不做赘述,下面介绍几个快速定位问题、解决问题的急救命令,希望能够帮到你。
cherry-pick
️🤔️ 使用场景?
把 A 分支的提交应用到 B 分支。
️🤔️ 如何使用?
1 首先在 A 分支拿到要 pick 的 commit-id
2 切到要应用的 B 分支
3 执行 git cherry-pick <commit-id>
⚠️ 要注意的地方:
1 如果你是从一个公共的分支 pick,最好加上 -x 参数,这样公共分支仍然可以跟踪提交的来源,并可能避免将来发生合并冲突:
git cherry-pick -x <commit id>
2 想要 pick 一个区间的提交 :
git cherry-pick <start-commit-id>..<end-commit-id> (前开后闭,不包含start-commit-id)
git cherry-pick <start-commit-id>^..<end-commit-id> (前后均闭)
3 如果你的提交之间耦合太重,比如 pick 的这次提交用到的某个方法不在本次提交的代码里,那么 cherry-pick 后就会出现报错,所以最好每次提交之间没有耦合性,且 commit message 写的规范一些
4 cherry-pick 的时候出现冲突怎么办呢?由于篇幅有限,给大家留作课后作业吧~
git blame & git show
️🤔️ 使用场景?
这段代码写得这么牛/这么烂 我要看看是谁写的
️🤔️ 如何使用?
执行 git blame path/to/file 即可, 会依次展示该文件下每一行的最近依次 commit ID | 代码提交作者 | 提交时间 | 代码位于文件中的行数 | 实际代码
一个🌰 :执行 git blame package.json 的结果如下
想看看 commit id 为 fcf3fd31 的这次提交具体做了哪些更改,执行git show fcf3fd31 package.json
另外,git blame 和 git show 有很多可选参数,比如git blame可以传入开始行数和要展示的行数,(🌰:git blame -L 160,+10 path/to/file), 输入git blame -h/git show -h 查看更多参数选项
git reflog
可能老司机警告过你要避免使用 git reset,因为它是一种破坏性的操作,不仅修改HEAD(--soft)和索引(--mixed),还可能修改你的工作目录。但有些特殊情况下必须要做 hard reset,会不会有什么风险呢?️ 大胆去做吧,有 git reflog 这道安全保障在呢。
reflog 能够记录几乎所有本地仓库的改变。包括所有分支提交记录,甚至已经删除(其实并未被实际删除)的提交记录。只要 HEAD 发生变化,就可以通过 reflog 查看到。
️🤔️ 使用场景?
哎呀,我版本回退后后悔了,想要把之前 reset 了的文件找回来。
️🤔️ 如何使用?
执行 git reflog 命令,结果如下:
可以看到版本回退后,仍然可以看到所有的版本记录,方便查看每个操作步骤所在的版本,这时可以根据版本号自由前进后退。执行git checkout HEAD@{n} 将会使用指定 commit 提交的内容覆盖工作区内容。
⚠️ 要注意的地方:
reflog信息没法与其他任何人共享,每个人都是自己特有的reflog。重要的一点是,它不是永久保存的,默认会让90天前的数据过期。
另外,也可以手动设置过期时间:
1. 使用--expire=参数,强制让设置时间之前的记录全部过期,🌰 :git reflog expire [--expire=<time>]
2. 使用now作为时间参数,让 reflog 的全部记录都过期,🌰 :git reflog expire --expire=now all
以上是个人日常工作中感觉可以提高效率🚀的 git 命令,希望可以对你有所帮助,文章如有错误或不足欢迎指正。如果你患有懒癌懒得了解这些命令,没事没事,懒人也有懒人的办法😄,编辑器也有很多 git 插件扩展可以帮助快速定位问题,比如 VsCode 的 GitLens、Git History 等。