Git 的核心并不只是记住命令,而是理解它的四个工作区域以及数据在这些区域之间是如何流动的。

本文将 Git 的体系分为“基础架构”和“核心功能”两部分来介绍。

Git 的体系架构

在深入功能之前,你需要理解 Git 追踪代码的四个位置:

  1. **工作区 (Workspace)**:你电脑里实际看到的文件夹,也就是你写代码的地方。
  2. **暂存区 (Index / Staging)**:一个临时的“缓冲带”,记录你准备提交哪些修改。
  3. **本地仓库 (Local Repository)**:存储在你电脑上的版本历史(位于 .git 文件夹)。
  4. **远程仓库 (Remote Repository)**:托管在服务器上的代码库(如 GitHub、GitLab)。

核心功能详解

几个操作场景:

A. 获取与上传(与远程交互)

  • 克隆(Clone):将远程仓库的完整代码、历史记录和分支下载到本地,创建一个全新的本地文件夹。
  • 推送(Push):将你本地仓库的提交(Commit)上传到远程仓库,让团队成员看到你的更改。
  • 拉取(Pull):将远程仓库的最新的代码下载并自动合并到你当前的工作中。
  • 同步(Sync):这不是一个单一命令,通常指“先拉取再推送”的循环,确保本地和远程保持一致。

B. 保存与记录(本地版本管理)

  • 提交(Commit):Git 的灵魂。它将暂存区的修改打包成一个“快照”,永久保存到本地仓库。每个提交都有一个唯一的哈希值。
  • 显示日志(Log):查看历史账单。你可以看到谁在什么时候做了什么修改。
  • 版本库浏览器(Repository Browser):通常指图形化界面(如 Sourcetree, GitKraken 或 VS Code 的 Git Graph),让你直观地看到分支的生长和交汇。

C. 差异与对比

  • 比较差异(Diff):查看工作区和暂存区有什么不同;查看两个提交(Commit)之间改了哪些行。

D. 分支与合并(团队协作的核心)

  • 切换/检出(Switch/Checkout)
    • Switch:在不同的分支(如 mainfeature)之间跳转。
    • Checkout:一个老牌全能命令,既能切分支,也能从仓库里把某个旧文件“检出”来覆盖当前修改。
  • 合并(Merge):将一个分支的修改集成到另一个分支。例如,把开发好的功能(Feature 分支)合并到主干(Main 分支)。

E. 临时处理与撤销(后悔药)

  • 贮藏更改(Stash)非常实用! 如果你写到一半需要紧急切换分支处理 Bug,但又不想提交不完整的代码,可以用 stash 把修改暂时“藏”起来,稍后再恢复。
  • 还原(Restore / Revert / Reset)
    • Restore:撤销工作区还没保存的修改。
    • Revert:通过创建一个“反向”的新提交来抵消某次错误的提交(对团队协作安全)。
    • Reset:强制将版本回退到过去的某个点(比较危险,需谨慎)。

常用功能对比表

功能 英文命令 主要作用
提交 git commit 将暂存区内容存档到本地库
拉取 git pull 获取远程更新并合并到本地
推送 git push 将本地存档上传到服务器
贮藏 git stash 暂时把手头的活儿搁一边,清空工作区
切换 git switch 在不同的开发任务(分支)间跳转

常用场景

  1. 场景一:拉取远程仓库代码,并完全覆盖掉我本地的代码

    当你发现本地代码写乱了,或者想放弃所有本地修改,直接以远程仓库为准时,使用这个“重置”法。

    1
    2
    3
    4
    5
    # 1. 下载远程仓库的最新元数据(不会影响你当前的代码)
    git fetch --all

    # 2. 将本地当前分支强制重置到远程分支的状态(以 main 分支为例)
    git reset --all origin/main

    解释:git fetch 只是把更新拉下来存着,git reset --hard 则是强制把你的工作区、暂存区和本地历史都同步成和远程一模一样。

  2. 场景二:拉取远程代码,但保留我自己修改的代码

    这是最常见的开发场景。如果你直接 git pull 可能会遇到冲突,最好的做法是先“存”再“取”。

    • 方案 A:使用“贮藏” (Stash) —— 最推荐 如果你还没准备好提交代码:

      1
      2
      3
      git stash              # 把本地修改暂时“藏”起来,此时工作区变干净了
      git pull # 拉取并合并远程代码
      git stash pop # 把藏起来的修改“拿”出来,合入最新的代码
    • 方案 B:使用“变基” (Rebase) 如果你已经 commit 了但还没 push

      1
      git pull --rebase      # 拉取远程代码,并将你的提交“接”在远程提交的后面
  3. 场景三:想撤销刚刚的提交

    需求: 刚刚 git commit 完,发现漏写了一个文件,或者备注写错了,想撤回这次提交但保留代码。

    • 命令: git reset --soft HEAD~1

    • 效果: 撤销最近一次提交,但你的代码还在“暂存区”里,改完后再 commit 即可。

  4. 场景四:紧急修复 Bug,但手头工作没做完

    需求: 正在开发新功能,老大突然说线上有个 Bug 要马上改,你不想提交半成品代码。

    • 操作: 1. git stash (藏起新功能代码) 2. git checkout main (切换去改 Bug) 3. 改完、提交、推送。 4. git checkout feature (回到新功能分支) 5. git stash pop (继续写代码)
  5. 场景五:找回被误删的代码

    需求: 正在开发新功能,老大突然说线上有个 Bug 要马上改,你不想提交半成品代码。

    • 操作: 1. git stash (藏起新功能代码) 2. git checkout main (切换去改 Bug) 3. 改完、提交、推送。 4. git checkout feature (回到新功能分支) 5. git stash pop (继续写代码)