提升你的 Git-fu!

2025-06-07

提升你的 Git-fu!

如果我每次查找Git 的使用方法都能赚到一美元,那我就足够发行一种自己的加密货币了(Gitcoin™️,我拥有它的名字)。作为开发者,我们几乎每天都在使用 Git,大多数人在使用 Git 时都会遇到一些似曾相识的场景。这篇博客将讨论如何轻松应对这些场景,并提供一些常见的 Git使用方法的解答。

关闭 git 命令分页

Git 命令(例如git diff和 )git log会将大量文本打印到标准输出,因此默认情况下会进行分页(使用less底层命令),需要用户输入才能导航和终止。要禁用分页并让 Git 显示完整输出,我们只需将--no-pager标志传递给 Git 即可。

git --no-pager log
Enter fullscreen mode Exit fullscreen mode

如果您想在所有 shell 上禁用它,您可以将以下行添加到您的.bashrc(Linux)或.zshrc(macOS),尽管我不建议这样做。

export GIT_PAGER=""
Enter fullscreen mode Exit fullscreen mode

这种技术最适合脚本和自动化,我们希望避免用户交互并在没有提示的情况下保持控制流。


删除错误添加到提交的文件

很多时候,我们可能会不小心提交了错误的文件,而检查也git status无济于事,因为提交前没有显示提示命令。在这种情况下,我们可以使用

git restore --source=HEAD~ --staged -- <file>
Enter fullscreen mode Exit fullscreen mode

将文件放回暂存区。

如果您不确定文件名,并且希望将所有文件移回暂存区,那么

git reset --soft HEAD~
Enter fullscreen mode Exit fullscreen mode

将成为你最好的朋友。


检查当前提交哈希

我个人一直需要用这个来在提交之间来回切换。每个提交都有一个 SHA-1 哈希值,它由提交的一些属性组成,例如日期、作者/提交者、提交消息等。你可以使用以下命令获取当前提交的 SHA-1 值:

git rev-parse HEAD
Enter fullscreen mode Exit fullscreen mode

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]
              .
              .
              .
Enter fullscreen mode Exit fullscreen mode

修改时保留提交信息

有时,我们可能需要对已提交的文件进行一些小的修改。文件更新并git add编辑后,我们需要修改提交以包含新的更改,但我们可能希望保留相同的提交消息。

我们可以借助

git commit --amend --no-edit
Enter fullscreen mode Exit fullscreen mode

或者

git commit --amend -C HEAD
Enter fullscreen mode Exit fullscreen mode

注意:我发现自己经常使用它,因此我配置了以下 Git 别名,它是“c ommit w ithwithout a mend”的缩写。

git config alias.cwa 'commit --amend --no-edit'
Enter fullscreen mode Exit fullscreen mode

重新排序未合并的提交

在软件公司,你经常会同时开发多个功能或模块。在某些情况下,出于一致性、优先级等原因,你可能希望较新的功能变更优先审核并合并,优先于其他变更。在这种情况下,我们可以按如下方式重新排序提交。

  • 获取所有提交及其哈希值的列表
git log --oneline
Enter fullscreen mode Exit fullscreen mode
  • 确定您想要根据 HEAD 提交重新排序的提交范围的深度。
  • 在分支上执行交互式变基。
git rebase -i HEAD~n # n is the depth from the previous step
Enter fullscreen mode Exit fullscreen mode

     这将打开一个编辑器,其中包含指定范围内的提交,并提示如何编辑历史记录。除了重新排序之外,您还可以根据需要编辑、挑选、删除、修改和压缩提交。

  • 保存并退出编辑器后,您可以重复步骤 1 来查看重新排序的提交历史记录。

注意:更改历史记录之后并在推送到远程分支之前,重要的是在远程头的顶部进行重新定基,以验证重新排序不会引起冲突。

git fetch upstream
git rebase upstream/main
Enter fullscreen mode Exit fullscreen mode

恢复丢失的更改

如果你正处于这样一种境地:你写了数百行代码,却因为某种原因丢失了它们,那么这个命令就能帮你一臂之力。这个命令就是git reflog(注意,是ref-log而不是re-flog,不过我明白为什么有人会认为 Git 会配合你,反复地鞭策它,让它承受所有的折磨 😤)。

git reflog为您提供本地仓库中所有分支上所有更改和操作的完整历史记录。日志中的条目称为引用日志,它们记录了本地 Git 工作树中分支尖端和其他引用的更新时间。每个条目都标有一个索引号,可用于在历史记录中向前或向后移动。

reflog有几个用例,例如检索丢失/删除的提交、恢复重大更改、识别不同的路径等。


在浏览器上查看 Git 帮助

Git 命令的手册页默认在终端中打开。浏览手册页可能很麻烦,而且在搜索信息时也不方便(除非你的 Vim-fu 很熟练)。如果你想在浏览器中查找命令的手册页,只需使用-w--web标志即可。

git branch例如,可以使用以下方式在默认浏览器(可配置)上打开的手册页:

git help branch -w
Enter fullscreen mode Exit fullscreen mode

或者

git branch --help -w
Enter fullscreen mode Exit fullscreen mode

获取受影响的文件名

git diff像和这样的命令git show,其原始形式非常适合显示所有尚未提交和已提交的更改。但在某些情况下,我们可能只需要受 Git 操作影响的文件名称(例如,用于脚本或筛选)。我们可以通过将以下标志传递给命令来直接获取文件名称。

git diff --pretty="format:" --name-only
git show --pretty="format:" --name-only
Enter fullscreen mode Exit fullscreen mode

要查看添加到暂存区的所有文件,我们可以使用

git diff --staged --pretty="format:" --name-only
Enter fullscreen mode Exit fullscreen mode

还支持基于文件扩展名的过滤。例如,要获取最新提交中的所有 Python 文件列表,我们可以使用

git show --pretty="format:" --name-only -- "*.py"
Enter fullscreen mode Exit fullscreen mode

这篇博客到此结束。感谢大家的阅读!最后,我想指出的是,Git 非常灵活,它提供了多种不同的技术来解决同一个问题。以上方法仅代表我的经验,并非推荐的规范。欢迎留下您的评论和指正,也欢迎通过LinkedInTwitter与我联系。

文章来源:https://dev.to/abhaykrishna/elevate-your-git-fu-3ip4
PREV
JWT 和 Go。如何将它们与安全需求集成
NEXT
有用的 Javascript 链接 - 学习指南