提升Git工作流:必备命令行工具与图形界面

对比日常Git CLI命令与lazygit、delta、tig等实用工具,以及用于审查和历史工作的GUI客户端。

提升Git工作流:必备命令行工具与图形界面

Git作为一种快速、可扩展的分布式版本控制系统,构成了现代软件开发工作流的基石。虽然其核心命令行界面提供了对版本控制的强大控制,但理解和利用其广泛的命令集,以及专门的命令行工具和图形用户界面(GUI),可以显著提高生产力并简化复杂任务。本指南聚焦于解决实际工作流问题的工具:暂存干净的提交、阅读历史、审查差异以及处理分支而不丢失变更记录。

你不需要这里的所有工具。选择最小集合,让你的日常工作更清晰。

核心Git工作流:基本命令行操作

Git提供了丰富的命令集,分为面向终端用户的高级“瓷器”命令和用于脚本编写及内部对象管理的低级“管道”命令。这里,我们专注于日常任务中必需的瓷器命令。

开始使用仓库

要开始一个新项目或加入现有项目,这些命令是你的起点:

  • 初始化一个新的Git仓库:
    git init
    
  • 从URL克隆一个现有仓库:
    git clone <url>
    

管理变更(暂存和提交)

在提交之前,Git使用一个“暂存区”(也称为索引)来准备变更。这让你对每个提交中包含的内容有精细的控制。

  • 将特定文件添加到暂存区:
    git add <file>
    
  • 将所有未跟踪和修改的文件添加到暂存区:
    git add .
    
  • 交互式地暂存文件的部分内容(块):
    git add -p
    
  • 移动或重命名文件:
    git mv <old> <new>
    
  • 从工作目录和暂存区删除文件:
    git rm <file>
    
  • 从Git跟踪中移除文件而不从文件系统中删除:
    git rm --cached <file>
    
  • 取消暂存特定文件:
    git reset <file>
    
  • 取消所有暂存:
    git reset
    
  • 检查工作目录和暂存区的状态:
    git status
    

一旦变更被暂存,你可以提交它们:

  • 提交暂存的变更(打开编辑器输入消息):
    git commit
    
  • 提交暂存的变更并附带消息:
    git commit -m '你的提交消息'
    
  • 直接提交所有已跟踪的未暂存变更(跳过git add对修改的操作):
    git commit -am '你的提交消息'
    

分支与合并

分支是Git分布式特性的基础,允许并行开发。合并和变更是整合变更的方式。

  • 切换到现有分支:
    git switch <name>
    # 或(旧语法)
    git checkout <name>
    
  • 创建并切换到新分支:
    git switch -c <name>
    # 或(旧语法)
    git checkout -b <name>
    
  • 列出所有本地分支:
    git branch
    
  • 按最近提交时间列出分支:
    git branch --sort=-committerdate
    
  • 删除本地分支(仅当已合并时):
    git branch -d <name>
    
  • 强制删除本地分支(即使未合并):
    git branch -D <name>
    
  • 将一个分支合并到当前分支:
    git merge <branch-to-merge>
    
  • 将一个分支作为单个提交合并到当前分支(压缩合并):
    git merge --squash <branch-to-merge>
    git commit -m '压缩的提交消息'
    
  • 将当前分支变基到另一个分支(重写历史):
    git rebase <base-branch>
    

与远程协作

Git在协作环境中表现出色,可以从远程仓库推送和拉取变更。

  • 添加新的远程仓库:
    git remote add <name> <url>
    
  • 将当前分支推送到其远程跟踪分支:
    git push
    
  • 首次推送新分支并设置上游:
    git push -u origin <name>
    
  • 强制推送(极其谨慎使用,会覆盖远程历史):
    git push --force-with-lease
    
  • 从远程获取变更(不整合到本地分支):
    git fetch origin main
    
  • 获取变更然后合并到当前分支:
    git pull origin main
    # 或(如果设置了跟踪分支)
    git pull
    
  • 获取变更然后变基当前分支:
    git pull --rebase
    

检查历史和差异

了解哪些内容发生了变化以及谁做了这些更改,对于调试和审查至关重要。

  • 显示所有已暂存和未暂存变更的摘要:
    git diff HEAD
    
  • 仅显示已暂存变更的差异:
    git diff --staged
    
  • 仅显示未暂存变更的差异:
    git diff
    
  • 查看提交日志(多种选项):
    git log # 完整日志
    git log --graph # 历史的ASCII艺术树
    git log --oneline # 每行一个简洁的提交
    git log <file> # 特定文件的历史
    git log --follow <file> # 包括重命名的历史
    git log -G <pattern>
    
    git log -G <pattern> 查找匹配行数发生变化的提交。例如,git log -G "timeout" -- app/ 在需要知道服务目录中超时处理何时发生变化时很有用。

让Git更简单的命令行工具

普通的Git CLI应保持为你的基线。额外的工具最好在它们能让状态更易见时使用,而不是在它们隐藏Git正在做什么时使用。

lazygit 为你提供了一个交互式终端UI,用于暂存块、浏览提交、解决简单冲突和推送分支。当你想要视觉概览但仍想在终端中工作时,它很有用。

tig 是一个用于浏览历史的快速文本UI。它在服务器或远程开发机器上特别有用,因为那里没有完整的桌面GUI。

delta 通过语法高亮和更清晰的移动行显示来改进Git差异。安装后,一个常见的设置是:

git config --global core.pager delta
git config --global interactive.diffFilter "delta --color-only"

查看delta的文档以获取与终端颜色匹配的选项。起初保持配置简单,以便仍然容易恢复普通的Git输出。

对于仓库清理或敏感历史移除,git-filter-repo 通常比旧的 git filter-branch 更受推荐。将任何历史重写视为团队操作。它会更改提交ID,并强制每个使用该仓库的人小心地重新同步。

何时GUI是更好的工具

GUI可能是审查广泛变更、比较分支或向视觉思维者教授Git概念的正确选择。诸如GitHub Desktop、GitKraken、Sourcetree、Fork和IDE集成等工具可以使暂存和历史检查更容易。

当GUI帮助你回答具体问题时使用它:

  • 这个分支中哪些文件发生了变化?
  • 哪些提交是这个分支独有的?
  • 这个重命名或重构实际影响了哪些内容?
  • 我应该保留冲突的哪一侧?

不要将GUI作为理解基本命令的替代品。当推送失败、变基冲突或CI检出分离头指针时,错误消息和恢复步骤仍然是Git概念。

日常工作的实用设置

一个平衡的工作流可能如下所示:

git status
git add -p
git diff --staged
git commit -m "添加健康检查端点"
git pull --rebase
git push -u origin feature/health-check

然后使用 git log --oneline --graph --decorate --all 或GUI来检查分支如何融入更广泛的历史。

如果你添加别名,请保持它们直观:

git config --global alias.st status
git config --global alias.lg "log --oneline --graph --decorate --all"
git config --global alias.unstage "restore --staged"

别名应该缩短你已经理解的命令。避免使用执行破坏性操作的别名,除非名称明确无误。

最终要点

使用Git CLI处理那些你需要在压力下理解的操作:status、diff、add、commit、branch、fetch、pull、push、merge和rebase。在能提高可见性的地方添加终端工具或GUI。最好的工作流不是拥有最多工具的那个,而是让你在分享变更之前能清晰看到变更的那个。