
日常使用 Git 的 19 个建议
目录:
[[toc]]
日志输出参数
命令示例:
git log --oneline --graph
也许你用过 git log。它支持很多命令行参数,将这些参数结合起来使用,功能尤为强大。下面是我经常使用的一些参数:
- -–author="Alex Kras":只显示某个用户的提交任务
- -–name-only:只显示变更文件的名称
- -–oneline:将提交信息压缩到一行显示
- -–graph:显示所有提交的依赖树
- -–reverse:按照逆序显示提交记录(最先提交的在最前面)
- -–after:显示某个日期之后发生的提交
- -–before:显示发生某个日期之前的提交
例如,曾经有位主管要求在每周五提交周报。所以我每周五都运行一下这个指令: git log --author="Alex Kras" --after="1 week ago" --oneline
,然后将输出结果编辑一下,发送给主管审核。
Git 有很多命令行参数,使用起来非常方便。运行 man git log
,来看一下这些参数的作用。
如果这些都不好用,git 还有一个 --pretty
参数,可以用来创建高级自定义输出。
查看文件的详细变更
命令示例:
git -log -p filename
git log -p
或者 git log -p filename
不仅显示提交说明、提交者以及提交日期,还会显示这每次提交实际修改的内容。
然后你就可以使用 less 中常用的检索命令即“斜杠”后面加检索词(/{{在此处添加你的检索词}}
),在变更内容日志中检索指定的关键词(使用小写的 n 跳到下一条检索结果,大写的 N 跳到上一条检索结果)。
查看文件中指定位置的变更
你可以使用 git blame filename
追查出文件中每一行是由谁变更的。
git blame
是一个非常强大的工具,但是又是无法提供足够的信息。
git log 提供了一个 -L
的选项。这个选项允许指定文件中的某些行。Git 只会输出与这些行的变更日志。这有点像带焦点的 git log -p
。
git log -L 1,1:some-file.txt
查看尚未合并的变更
命令示例:
git log --no-merges master..
如果你曾经与很多小伙伴工作在同一个持久分支上,也许会有这样的经历,父分支(例如:master)上的大量合并同步到你当前的分支。这使得我们很难分辨哪些变更时发生主分支,哪些变更发生在当前分支,尚未合并到 master 分支。
git log --no-merges master..
可以解决这个问题。注意 --no-merges
标志意味着只显示没有合并到任何分支的变更,master..
选项,意思是指显示没有合并到 master 分支的变更(在 master 后面必须有 ..
)。
你也可以运行 git show --no-merges master..
或者 git log -p --no-merges master..
命令(输出结果相同)来查看一下尚未合并的文件变更。
查看其他分支中的文件
命令示例:
git show some-branch:some-file.js
用这个命令可以很方便地查看其他分支上的文件而无需切换到那个分支。
当然你也可以通过 git show some-branch-name:some-file-name.js
命令在终端中显示指定的文件.
你还可以将输出重定向到一个临时文件,这 样你就可以再指定的编辑器中,以并排视图来查看它了。
git show some-branch-name:some-file-name.js > deleteme.js
如果你想查看另一个分支上文件与当前分支上文件的差异,只要运行下面的命令就可以了:
git diff some-branch some-filename.js
关于变更基线的几点说明
命令示例:
git pull --rebase
之前我们说过在远程分支上工作会有大量的合并提交。使用 git rebase
可以避免这些提交。
总的来说我认为变更基线是高级特征,最好是留到另一篇文章中详细介绍。
甚至在 git book 中也有这样的论述:
但是,令人狂喜的变更基线并不是任何情况下都适用,一言以蔽之:若是工作区中存在尚未提交到仓库的变更,请不要使用变更基线。如果遵照这条指南,不会有什么问题。不然,你可能会招致厌恶与谩骂。
也就是说,变更基线本身并不可怕,关键在于使用方式。
或许,最好的方法是使用交互式变更基线,调用命令为 git rebase -i {{某个提交序列号}}