🌟 终极 Git 参考指南:从入门到精通的所有命令
Git是一个分布式版本控制系统 (DVCS),最初由 Linus Torvalds 创建。它允许多个开发者通过跟踪代码历史中的每一次更改进行协作。每个开发者都拥有代码仓库的完整副本,从而支持离线工作和快速合并。Git 以其速度、灵活性和开源社区支持而闻名。Git 中的每次提交都会记录作者的姓名和电子邮件地址,因此您应该在安装 Git 后立即配置这些信息。以下是一份全面的指南,涵盖了 Git 的安装、配置以及所有主要命令,从基础知识到高级技巧,应有尽有。
Git 的架构:上图展示了 Git 的设计:你的工作目录(红色)存放着你的文件,更改会被暂存到索引/缓存(黄色),然后提交到你的本地仓库(绿色)。之后,你需要将本地仓库与GitHub 或 GitLab 等平台上的远程仓库(蓝色)同步。这种流程(工作 → 暂存 → 提交 → 远程)是 Git 工作流的核心。
🖥️ 安装与设置
在使用 Git 之前,请先将其安装到您选择的操作系统上。在Linux 系统上,您可以使用包管理器,例如sudo apt install git-allDebian/Ubuntu 或sudo dnf install git-allFedora/RHEL。在macOS 系统上,Git 已集成到 Xcode 命令行工具中(运行命令会提示安装),或者您可以从git-scm.comgit --version下载最新的安装程序。在Windows 系统上,您可以从官方网站下载Git for Windows ,或者使用 Chocolatey 等包管理器。
安装完成后,配置您的身份(一次性全局配置):
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
这会将您的姓名/电子邮件地址附加到所有未来的提交中,并且之后无法在每次提交中更改。您还可以设置默认值,例如您首选的文本编辑器(core.editor)或启用彩色输出(color.ui auto)git config。为了确保跨平台换行符的一致性,请设置core.autocrlf:在 macOS/Linux 上使用git config --global core.autocrlf input,在 Windows 上使用git config --global core.autocrlf true。这会在提交/推送时将 CRLF 转换为 LF,避免出现混乱的差异。
此外,请.gitignore在仓库根目录创建一个文件,排除生成的文件或敏感文件。您还可以创建一些实用的别名,例如git config --global alias.st status用于简写。许多团队要求提交时必须签名,或者采用特定的用户名/邮箱格式——请查看您所在组织的相关规定。
📦 Git 基础知识(创建和保存)
git init–初始化代码仓库。在项目文件夹中运行此命令,即可开始使用 Git 跟踪项目:
git init
这将创建一个新.git目录。这是项目版本控制中的第一个命令。
git clone [url]–从远程克隆。将现有仓库(及其历史记录)复制到本地计算机:
git clone https://github.com/user/my-project.git
这将创建一个包含项目的新文件夹,以及一个指向该 URL 的remote同名文件origin。现在,您可以离线使用完整副本进行工作了。
git status–查看更改。显示哪些文件已修改、已暂存或未跟踪:
git status
在提交更改或切换分支之前,请务必运行此命令以查看您的工作进度。
git add [file...]–暂存更改。将更改从工作目录移动到暂存区:
git add file1.txt
git add . # stage all changes in current folder
暂存操作会为下一次提交准备一个文件“快照”。
git commit -m "message"–记录更改。将暂存的更改保存为历史记录中的新提交:
git commit -m "Fix bug in user login"
每次提交都应该包含清晰的信息。提交是原子性的工作单元(每次提交只包含一个修复或功能)。提交后,暂存区将被清空,直到您git add再次提交为止。
git log–查看历史记录。显示当前分支的提交历史记录(最新提交在顶部):
git log
结合选项(例如--oneline、--graph或日期格式)来筛选或格式化输出。通常与故障排除git log一起使用(见下文)。git blamegit bisect
git diff–检查更改。比较提交、分支或工作目录之间的文件差异。例如,git diff(不带任何参数)显示未暂存的更改,git diff --staged显示已暂存但未提交的更改。您还可以使用git diff HEAD~1 HEAD来查看最近两次提交之间的差异。示例:
git diff # unstaged changes
git diff --staged # changes staged for commit
输出结果会高亮显示新增(绿色)或删除(红色)的代码行。如果您需要检查提交的内容,可以使用此功能git diff确保不会发生任何意外情况。
-
git rm,,git mv–删除或重命名git rename文件。git rm file.txt删除(并分阶段删除)被跟踪的文件。git mv old new一步即可重命名文件(或将其移动到新位置)。这些操作会同时更新工作目录和暂存区。
🔀 分支与合并
Git 的强大之处在于分支。分支是一个指向一系列提交的可移动指针,用于隔离开发。分支创建独立的工作线。使用 `git branch`git branch [name]列出或创建分支,使用 `git branch` git checkout [branch](或 `git git switch [branch]branch`)切换上下文。例如:
git branch feature/login
git switch feature/login # or `git checkout feature/login`
现在你可以在feature/login分支上进行操作而不会影响主分支main。准备就绪后,将其合并回主分支。
分支图:上图展示了一个功能分支(洋红色)如何从主分支分叉,master以及之后如何合并回主分支。请注意功能/注册分支的提交(紫色)是如何合并到主分支中master而互不干扰的。分支机制允许多个功能(或开发人员)并行推进。
-
git branch–管理分支机构。git branch列出所有本地分店,并突出显示当前分店。git branch <name>从当前提交创建一个新分支。git branch -d <name>删除分支。这是你的通用分支工具。
-
git checkout/git switch–切换分支或恢复文件。传统上,git checkout它有两个作用(切换分支或恢复文件)。Git 2.23+ 引入了专门的命令:git switch <branch>安全地迁移到现有分支或git switch -c <new-branch>创建+切换。git restore <file>撤销工作目录中的更改(放弃修改)。例如:
git switch develop # move to branch 'develop'
git switch -c hotfix/1.0.1 # create and switch to new branch
这些说明更清晰:git switch`git branch` 用于分支更改,` git restoregit file` 用于撤销文件编辑。(在底层,它们使用与 `git branch` 相同的机制git checkout。)
git merge <branch>–将另一个分支合并到当前分支。要将分支中的更改合并到您的活动分支中:
git switch main
git merge feature/login
此操作会找到共同祖先并创建一个新的合并提交(除非可以快进)。合并提交有两个父提交(分别来自两个分支)。合并会保留完整的历史记录,清晰地显示分支合并的时间和原因。如果存在冲突的更改,Git 会暂停,以便您手动解决这些冲突。解决冲突后,git add修复后的文件git commit将完成合并。
-
快进与非快进:如果
main分支后指针没有移动,git merge则只会将main指针向前移动(快进)。为了便于记录,git merge --no-ff feature/login即使在快进时,也应始终创建一个合并提交。 -
git fetch&git pull–与遥控器同步。首先,添加遥控器git remote add origin <url>(通常在设置过程中完成git clone)。然后:git fetch从远程仓库下载新的提交和分支,但不合并它们。git pull本质上就是将远程分支的git fetch内容 加到本地分支中:git merge--rebase
git fetch origin git merge origin/main # or simply git pull origin main
用于pull将上游更改更新到您的分支。有些团队更喜欢git pull --rebase线性化历史记录。
多分支场景:在这个例子中,多位开发者(你、“Sarah”和“Max”)各自创建自己的分支。Sarah 和 Max 的工作(分别用黄色和绿色表示)从主分支开始,master然后各自独立进行。当各自的工作完成后,它们会合并回主分支master。每次合并都可以通过 GitHub/GitLab 等平台上的 pull request 完成git merge,从而实现代码审查。
📚 中级工作流程
-
Fork 工作流程:在 GitHub 等平台上,您通常会fork一个仓库(在线创建自己的副本),将 fork 克隆到本地,在本地进行工作,然后向上游提交 Pull/Merge Request。
git remote add upstream <original_repo>这样您就可以从原始仓库拉取更改。之后,使用 `git pull`git fetch upstream和`git pull`git merge upstream/main(或 `git pull`rebase)来保持更新。 -
Gitflow和分支模型:大型项目通常遵循结构化的工作流程。Gitflow使用专用分支来管理开发
develop、发布feature/*、交付release/*等功能hotfix/*。例如,先创建一个特性分支develop,完成后将其合并git merge到主develop分支,之后再将发布分支合并到主分支main。另一种方法是特性分支工作流程,即每个特性都拥有自己的分支,并通过拉取请求合并到主分支main。选择一种策略并坚持使用,并将其记录下来供团队参考。 -
暂存——如果您正在进行某项工作但需要切换工作内容,
git stash请暂时搁置未提交的更改:
git stash # saves and reverts changes
git switch other-branch
# ... work on something else ...
git switch - # back to previous branch
git stash pop # re-apply stashed changes
这样可以在处理紧急工作的同时保持工作目录的整洁。
🔧撤销更改和历史编辑
-
git reset–取消暂存或移动 HEAD。不带任何选项时,git reset <file>取消暂存更改(将更改从索引移回工作目录)。带标志时:--soft将 HEAD 指针移动到上一个提交,但保留所有更改暂存。--mixed(默认)取消暂存更改,但保留在工作目录中。--hard将所有状态(HEAD、索引、工作目录)重置为指定的提交。git reset请谨慎使用:它会重写历史记录,并丢弃未推送的提交。
-
git revert–安全回滚。与 `git commit` 不同reset,git revert <commit>`git commit` 会创建一个新的提交来撤销给定提交的更改。这是撤销公共提交的推荐方法,因为它保留了历史记录。示例:
git revert abc123 # creates a new commit that reverses commit abc123
-
git clean–删除未跟踪的文件。如果您有不需要的新文件,此操作git clean -f会将其从工作目录中删除。这对于清理构建产物非常有用。(添加此选项-d可删除未跟踪的目录,使用-n此选项可预览)。 -
git commit --amend–编辑上次提交。如果您刚刚提交但忘记了某些内容,请使用:
git add missing_file
git commit --amend
此操作会将之前的提交替换为新的提交(包括您的新更改或更新后的消息)。请务必小心:修改提交会重写历史记录。请仅修改尚未推送的提交(或者做好强制推送并协调的准备)。
git rebase–移动或合并提交。变基会将一个分支的提交重新应用到另一个分支,从而创建线性历史记录。例如,要将上游更改合并到您的特性分支中:
git switch feature
git fetch origin
git rebase origin/main
这会将你的feature分支提交记录从主分支的最新版本开始main。优点:清晰、线性的历史记录(没有合并提交),更容易git log进行二分查找。黄金法则:永远不要对公共/共享分支进行变基(这会重写其他人可能依赖的历史记录)。
交互式变基: git rebase -i HEAD~n允许您压缩、重新排序或编辑提交。这对于在合并之前清理一系列小的提交非常有用。例如,pick变基待办事项中的 `--commit` squash、 `--commit ...fixup
git cherry-pick <commit>–复制提交。将另一个分支上的单个提交应用到当前分支。例如,如果当前main分支有一个您需要的 bug 修复提交develop:
git switch develop
git cherry-pick abc123
这会将abc123(来自任何地方的)提交重新应用为新的提交develop。
git stash branch <branch>– 一步完成创建新分支和应用暂存:
git stash branch new-feature
git submodule– 包含外部仓库。如果你的项目依赖于另一个 Git 仓库,请使用子模块(尽管许多人更喜欢其他方法)。例如:
git submodule add https://github.com/lib/project.git libs/lib-project
这将创建一个.gitmodules文件来跟踪该仓库的特定提交。子模块固定在某个提交中,不会自动更新。当您需要对嵌入式依赖项进行严格的版本控制时,请使用它们。
-
其他高级命令包括:
git bisect(二分查找以查找错误提交)、git reflog(通过查看引用日志恢复丢失的提交)、git blame(查看每行代码的最后修改者)、git cherry(查找未合并的提交)git filter-repo或git filter-branch(全局重写历史记录,例如,从所有提交中删除密码)。每个命令都有其强大的应用场景:git bisect自动对提交历史记录进行二分查找,以找出引入错误的确切提交。git reflog显示所有移动HEAD,使您能够恢复“丢失的”提交(例如,在意外之后reset)。git blame它会在文件的每一行上标注最后一次提交和修改者的姓名,非常适合跟踪代码的来源。
-
git tag–标记提交。标记特定的提交,通常用于发布版本。可以使用轻量级标签(git tag v1.0)或带注释的标签(git tag -a v1.0 -m "Release 1.0")。您可以使用 .push 标签git push origin --tags。
🤝 协作与团队工作流程
Git 在团队协作中表现出色,但良好的使用习惯也很重要:
-
提交小的、原子性的更改。遵循最佳实践:“进行增量式的小更改”,并保持提交的原子性(每次提交只修复一个问题/添加一个新功能)。这使得代码审查和回滚更加容易。
-
描述性的提交信息。请使用祈使现在时撰写信息(例如,“添加用户登录验证”,而不是“已添加”),并清晰地解释更改的原因。好的提交信息有助于团队成员和未来的自己理解上下文。
-
分支策略。确定工作流程:集中式(所有人
main直接提交)、特性分支(每个特性一个分支,然后合并 PR)、GitFlow(使用develop/release分支)或个人分支。将其记录下来,确保每个人都遵循相同的方法。例如,合并时是否压缩提交,还是保留完整的历史记录?在远程仓库上设置分支保护规则(要求代码审查、禁止强制推送main等)。 -
代码审查和拉取请求。在合并代码之前,务必通过拉取请求/合并请求获取反馈
main。代码审查可以提高代码质量并分享知识。在拉取请求上设置持续集成测试,以便及早发现问题。 -
定期同步。频繁地
git pull --rebase(或合并)将团队成员的更改合并到你的分支中。同步越频繁,冲突积累就越少。如果使用长期存在的分支,请考虑经常进行变基操作,以保持历史记录的整洁。 -
跨平台提示:Windows 用户应注意换行符和路径长度问题,我们
core.autocrlf前面已经提到过。此外,Unix 权限(可执行位)并不总是能直接转换到 Windows,因此需要使用一些方法.gitattributes来管理差异。Windows 上的 Git Bash 或 WSL 会模拟 Unix 的命令行为。 -
Git 钩子:团队经常使用 Git 钩子来强制执行策略(例如,在提交前运行代码检查器,在服务器端预接收以强制执行提交消息格式)。可以探索
.git/hooks使用 Husky 等工具来自动化检查。 -
Git LFS:对于大型二进制文件(资源、媒体),请使用Git 大文件存储 (LFS),以免仓库体积膨胀。它会将大型文件替换为指针。
-
备份和远程:始终推送到共享远程仓库(GitHub/GitLab/Bitbucket)。这相当于异地备份(每个克隆都是一个备份副本)。如果您的组织需要高安全性,请启用分支保护或要求提交签名。
-
自定义工具和图形用户界面:虽然 Git CLI 功能强大,但许多团队仍然使用图形用户界面。例如:
- GitHub Desktop(跨平台,免费)——基本的提交/分支 GUI。
- Sourcetree(免费,Atlassian)——可视化分支和提交。
- GitKraken、SmartGit、Tower——具有高级功能的商业客户端。
- TortoiseGit – Windows 资源管理器集成。
- 内置的 IDE 集成(例如 VSCode、IntelliJ 等)也提供了可视化差异/合并工具。这些工具封装了底层 Git 命令(因此所有命令行知识仍然适用),但提供了图形化的便利。
🛠️调试与故障排除
-
合并冲突:当合并或变基操作遇到冲突时,Git 会在文件中标记冲突。编辑这些文件以解决冲突(查找
<<<<<<<标记),然后git add编辑已解决的文件git commit(或git rebase --continue)。使用git merge --abort`git merge` 撤销正在进行的合并,或git rebase --abort使用 `git rebase` 取消变基。 -
git bisect– 查找错误的提交:
git bisect start
git bisect bad # current version has the bug
git bisect good v1.2.3 # a known good older tag/commit
Git 会检出一个中间提交;测试你的代码,然后运行`git checkout`git bisect good或 `git git bisect badcheckout git checkout`。重复此操作,直到 Git 精确定位到引入问题的提交。这对于查找回归问题至关重要。
-
恢复丢失的提交:如果您认为自己丢失了工作(例如,在一次错误的重置之后),请使用 `git commit -c` 列出提交
git reflog记录HEAD。您通常可以git reset回滚到 `git commit -c` 中显示的某个提交哈希值reflog进行恢复。您可以将 `git commit -c` 理解reflog为撤销历史记录。 -
git blame– 查找代码来源。运行此命令git blame file.txt可查看文件中每一行代码的最后修改者。这有助于确定错误何时以及为何被引入。许多托管服务(例如 Bitbucket/GitHub)会在用户界面中以图形方式显示责任归属信息。 -
网络问题:如果
git push由于冲突或非快进而被拒绝,请先拉取或--force-with-lease谨慎使用(如果您知道必须覆盖远程分支,则仅限个人分支,未经main协调绝不可在共享分支上使用)。 -
身份验证:为远程服务器设置 SSH 密钥或基于令牌的身份验证,以避免重复输入密码。GitHub/GitLab 提供了具体的 SSH 设置说明。
🔍 技巧与最佳实践
-
🎯小而精的提交:频繁提交逻辑清晰的更改。避免提交包含许多不相关功能的“大杂烩”式提交。这样可以简化代码审查和回滚。
-
📝使用有意义的分支名称:例如
feature/login,bugfix/typo`myBraft` 、hotfix/urgent-patch`myCraft`、`myCraft`。有些团队会在分支名称前加上 JIRA 问题 ID 前缀。请保持分支名称简洁明了,并具有描述性。 -
🖋维护良好的提交历史:在共享之前,使用交互式变基(rebase
git rebase -i)来合并或重新排序混乱的本地提交。清晰的提交历史对每个人都有帮助。如果通过拉取请求进行合并,可以先合并再合并,以保持main提交顺序的线性。 -
🔐保护重要分支:配置远程仓库(GitHub/GitLab),要求对拉取请求进行审核、通过持续集成 (CI) 检查,并禁止对根分支
main(/)master和发布分支强制推送。这可以防止意外覆盖。 -
☑️提交前务必检查:始终
git status要git diff仔细核对即将提交或发布的内容。快速检查git log --oneline --decorate --graph可以让你直观地了解自己所处的位置。 -
✅代码审查:正如 GitLab 所指出的,“向他人征求反馈是确保代码质量的绝佳方法”。使用拉取请求评论来讨论更改。资深开发人员可以通过代码审查提供指导。
-
🔄变基与合并策略:与团队共同决定何时进行变基。一个常见的规则是:在合并之前(针对你的私有分支)进行变基,以保持代码历史记录的整洁,但永远不要对公共分支(例如其他人正在使用的分支)进行变基。在共享分支上进行合并可以确保每个人的代码副本保持同步。
-
🛡️大型重写前务必备份:如果您即将执行破坏性操作(例如
git filter-branch`git git pull` 或大型变基),请务必备份仓库文件夹(或 Git 打包文件)。使用功能强大的命令很容易丢失工作成果。 -
🌐及时更新 Git:新版本偶尔会添加一些实用命令(例如
git switch,git restore2.23 及更高版本中新增的命令,git worktree用于在一个仓库中创建多个工作目录等)。请查看发行说明或访问git-scm.com了解新功能。 -
🤝沟通:始终与团队保持沟通。如果必须强制推送分支,请通知其他人。如果遇到棘手的冲突,请先询问,不要盲目操作。良好的 Git 使用不仅在于命令,更在于协作。
🌐 跨平台和 GUI 说明
-
Windows 与 macOS/Linux: Git 命令基本相同,但要注意换行符(
core.autocrlf)。在 Windows 系统中,路径长度可能会受到限制;Windows 版 Git 提供了 Git Bash,这是一个类 Unix 终端,可以弥补许多差异。在 macOS/Linux 系统中,Git 是原生支持的。 -
图形用户界面客户端:它们以可视化的形式呈现 Git。以下是一些比较知名的客户端:
- GitHub Desktop(Windows/macOS,免费):非常适合初学者,集成了GitHub功能。
- Sourcetree(Windows/macOS,免费):Bitbucket/GitHub 的可视化分支管理。
- GitKraken(跨平台,免费和付费版本):高级用户界面,集成问题跟踪。
- Tower(macOS/Windows,付费):功能丰富的专业图形用户界面。
- 许多集成开发环境(例如 VS Code、IntelliJ 等)都内置或通过插件集成了 Git,可以显示差异并提供一键提交/推送功能。选择你喜欢的即可——只需记住底层命令的工作方式相同。即使使用图形用户界面 (GUI),也应该了解命令行界面 (CLI) 的基础知识以便进行故障排除。
🎉 结论
Git 功能强大且灵活。本指南涵盖了其核心命令(init、clone、add、commit、status、log、diff、branch、checkout/switch、merge、pull、push)、中级工具(rebase、stash、cherry-pick、tag、reset、revert、remote、submodule)以及高级技巧(bisect、reflog、blame、hooks)。此外,我们还简要介绍了工作流程、团队协作技巧、跨平台注意事项以及 GUI 替代方案。
精通 Git 需要练习。始终编写清晰的提交信息,使用分支来隔离工作,并频繁地进行拉取/合并操作。使用代码审查尽早发现问题。使用远程仓库备份你的工作,并先在小范围内测试合并。记住:如果出现问题,像 `git pull`、`git pull` 和 `git pull` 这样的命令git reflog通常git reset可以git revert帮你恢复。
遵循以上最佳实践,Git 将简化您的开发和协作流程。祝您编码愉快!🚀
AquaScript API本网站由我和我的好朋友
Precious Kelvin 和 Madhurima Rawat 共同创建。AquaScript 为开发者提供免费的 API。
文章来源:https://dev.to/hanzla-baig/the-ultimate-git-reference-all-commands-from-beginner-to-advanced-5ch6

aquascript.xyz