提升你的 Git-fu!
如果我每次查找Git 的使用方法都能赚到一美元,那我就足够发行一种自己的加密货币了(Gitcoin™️,我拥有它的名字)。作为开发者,我们几乎每天都在使用 Git,大多数人在使用 Git 时都会遇到一些似曾相识的场景。这篇博客将讨论如何轻松应对这些场景,并提供一些常见的 Git使用方法的解答。
关闭 git 命令分页
Git 命令(例如git diff
和 )git log
会将大量文本打印到标准输出,因此默认情况下会进行分页(使用less
底层命令),需要用户输入才能导航和终止。要禁用分页并让 Git 显示完整输出,我们只需将--no-pager
标志传递给 Git 即可。
git --no-pager log
如果您想在所有 shell 上禁用它,您可以将以下行添加到您的.bashrc
(Linux)或.zshrc
(macOS),尽管我不建议这样做。
export GIT_PAGER=""
这种技术最适合脚本和自动化,我们希望避免用户交互并在没有提示的情况下保持控制流。
删除错误添加到提交的文件
很多时候,我们可能会不小心提交了错误的文件,而检查也git status
无济于事,因为提交前没有显示提示命令。在这种情况下,我们可以使用
git restore --source=HEAD~ --staged -- <file>
将文件放回暂存区。
如果您不确定文件名,并且希望将所有文件移回暂存区,那么
git reset --soft HEAD~
将成为你最好的朋友。
检查当前提交哈希
我个人一直需要用这个来在提交之间来回切换。每个提交都有一个 SHA-1 哈希值,它由提交的一些属性组成,例如日期、作者/提交者、提交消息等。你可以使用以下命令获取当前提交的 SHA-1 值:
git rev-parse HEAD
Git 提交者统计
该git shortlog
命令可用于按作者和标题汇总提交。这对于发布公告尤其有用。它甚至还提供按数量统计的提交摘要。
例如,aws/eks-distro-prow-jobs存储库中的提交计数摘要如下:
$ git shortlog -sn
62 EKS Distro Bot
31 Abhay Krishna
29 EKS Distro PR Bot
27 Abhay Krishna Arunachalam
23 [REDACTED]
15 [REDACTED]
.
.
.
修改时保留提交信息
有时,我们可能需要对已提交的文件进行一些小的修改。文件更新并git add
编辑后,我们需要修改提交以包含新的更改,但我们可能希望保留相同的提交消息。
我们可以借助
git commit --amend --no-edit
或者
git commit --amend -C HEAD
注意:我发现自己经常使用它,因此我配置了以下 Git 别名,它是“c ommit w ithwithout a mend”的缩写。
git config alias.cwa 'commit --amend --no-edit'
重新排序未合并的提交
在软件公司,你经常会同时开发多个功能或模块。在某些情况下,出于一致性、优先级等原因,你可能希望较新的功能变更优先审核并合并,优先于其他变更。在这种情况下,我们可以按如下方式重新排序提交。
- 获取所有提交及其哈希值的列表
git log --oneline
- 确定您想要根据 HEAD 提交重新排序的提交范围的深度。
- 在分支上执行交互式变基。
git rebase -i HEAD~n # n is the depth from the previous step
这将打开一个编辑器,其中包含指定范围内的提交,并提示如何编辑历史记录。除了重新排序之外,您还可以根据需要编辑、挑选、删除、修改和压缩提交。
- 保存并退出编辑器后,您可以重复步骤 1 来查看重新排序的提交历史记录。
注意:更改历史记录之后并在推送到远程分支之前,重要的是在远程头的顶部进行重新定基,以验证重新排序不会引起冲突。
git fetch upstream
git rebase upstream/main
恢复丢失的更改
如果你正处于这样一种境地:你写了数百行代码,却因为某种原因丢失了它们,那么这个命令就能帮你一臂之力。这个命令就是git reflog
(注意,是ref-log而不是re-flog,不过我明白为什么有人会认为 Git 会配合你,反复地鞭策它,让它承受所有的折磨 😤)。
git reflog
为您提供本地仓库中所有分支上所有更改和操作的完整历史记录。日志中的条目称为引用日志,它们记录了本地 Git 工作树中分支尖端和其他引用的更新时间。每个条目都标有一个索引号,可用于在历史记录中向前或向后移动。
reflog
有几个用例,例如检索丢失/删除的提交、恢复重大更改、识别不同的路径等。
在浏览器上查看 Git 帮助
Git 命令的手册页默认在终端中打开。浏览手册页可能很麻烦,而且在搜索信息时也不方便(除非你的 Vim-fu 很熟练)。如果你想在浏览器中查找命令的手册页,只需使用-w
或--web
标志即可。
git branch
例如,可以使用以下方式在默认浏览器(可配置)上打开的手册页:
git help branch -w
或者
git branch --help -w
获取受影响的文件名
git diff
像和这样的命令git show
,其原始形式非常适合显示所有尚未提交和已提交的更改。但在某些情况下,我们可能只需要受 Git 操作影响的文件名称(例如,用于脚本或筛选)。我们可以通过将以下标志传递给命令来直接获取文件名称。
git diff --pretty="format:" --name-only
git show --pretty="format:" --name-only
要查看添加到暂存区的所有文件,我们可以使用
git diff --staged --pretty="format:" --name-only
还支持基于文件扩展名的过滤。例如,要获取最新提交中的所有 Python 文件列表,我们可以使用
git show --pretty="format:" --name-only -- "*.py"
这篇博客到此结束。感谢大家的阅读!最后,我想指出的是,Git 非常灵活,它提供了多种不同的技术来解决同一个问题。以上方法仅代表我的经验,并非推荐的规范。欢迎留下您的评论和指正,也欢迎通过LinkedIn和Twitter与我联系。
文章来源:https://dev.to/abhaykrishna/elevate-your-git-fu-3ip4