Git 基础
1. Git 是什么
Git 是一个分布式版本控制系统,用来记录代码和文件的变化。
它主要可以帮助我们:
- 保存项目历史版本
- 查看文件改了什么
- 回退到之前的版本
- 多人协作开发
- 管理不同开发分支
- 和 GitHub、GitLab 等平台配合使用
可以把 Git 理解成:
text
给项目保存一个个“存档点”2. 查看 Git 是否安装
bash
git --version例如:
text
git version 2.50.1说明 Git 已经安装。
3. 配置用户名和邮箱
第一次使用 Git 时,一般需要配置:
bash
git config --global user.name "Your Name"配置邮箱:
bash
git config --global user.email "you@example.com"查看配置:
bash
git config --global --list例如:
text
user.name=Your Name
user.email=you@example.com4. --global 是什么意思
例如:
bash
git config --global user.name "moonlit"其中:
text
--global表示这个配置对当前用户的所有 Git 仓库生效。
如果不加:
bash
git config user.name "moonlit"则只修改当前 Git 仓库的配置。
5. 创建 Git 仓库
进入项目目录:
bash
cd project初始化:
bash
git init之后项目中会出现一个隐藏目录:
text
.git/.git 保存了:
text
提交历史
分支信息
Git 配置
版本对象一般不要手动修改 .git 里面的内容。
6. 查看隐藏的 .git
普通:
bash
ls可能看不到。
使用:
bash
ls -a可以看到:
text
.
..
.git
main.py
README.md只要当前目录中存在:
text
.git通常说明它是一个 Git 仓库。
7. Git 最核心的三个区域
学习 Git 时,最重要的是理解三个区域:
text
工作区
暂存区
本地仓库可以理解为:
text
修改文件
↓
git add
↓
暂存区
↓
git commit
↓
本地仓库8. 工作区
你平时直接编辑的项目文件,就是工作区。
例如:
text
project/
├── main.py
├── README.md
└── .git/修改:
text
main.py之后,这个修改首先只存在于:
text
工作区Git 还没有正式保存这个版本。
9. 暂存区
执行:
bash
git add main.py之后,修改会进入:
text
暂存区暂存区可以理解成:
text
准备提交的文件集合10. 本地仓库
执行:
bash
git commit -m "add main function"之后,暂存区里的修改会真正保存成一个版本。
这个版本保存在:
text
本地 Git 仓库11. 查看当前状态
Git 中非常重要的命令:
bash
git status它可以查看:
- 哪些文件被修改
- 哪些文件没有被 Git 跟踪
- 哪些文件已经进入暂存区
- 当前分支
- 是否有待提交内容
学习 Git 时可以经常使用:
bash
git status12. 未跟踪文件
创建:
bash
touch main.py执行:
bash
git status可能看到:
text
Untracked files:
main.py表示:
text
main.py还没有被 Git 跟踪。
13. git add
把文件加入暂存区:
bash
git add main.py再次:
bash
git status可能看到:
text
Changes to be committed:
new file: main.py说明:
text
main.py已经准备提交。
14. 一次添加多个文件
可以:
bash
git add main.py README.md也可以:
bash
git add .表示把当前目录下的修改加入暂存区。
这是日常开发中很常见的命令。
但是执行:
bash
git add .之前最好先:
bash
git status确认没有把不该提交的文件一起加入。
15. git commit
提交暂存区:
bash
git commit -m "add main.py"其中:
text
-m表示直接填写提交信息。
例如:
bash
git commit -m "add login feature"提交成功后,相当于给当前项目保存了一个新的版本。
16. 基础提交流程
最基础的 Git 工作流:
bash
git status
git add .
git commit -m "update project"也就是:
text
查看变化
↓
加入暂存区
↓
创建提交17. 查看提交历史
使用:
bash
git log可能看到:
text
commit a1b2c3d4...
Author: moonlit
Date: ...
add main.py每个提交都有一个唯一的:
text
commit hash也就是提交 ID。
18. 简洁查看提交历史
推荐:
bash
git log --oneline例如:
text
8f23c10 add README
4f91ab2 add main.py
b1a2140 initial commit这样更加适合快速查看历史。
19. 查看文件修改
如果修改了:
text
main.py可以执行:
bash
git diff查看:
text
工作区和:
text
暂存区之间的差异。
20. 查看已经暂存的修改
执行:
bash
git diff --staged可以查看:
text
暂存区和:
text
上一次提交之间的差异。
也可以写:
bash
git diff --cached21. git restore
如果你修改了一个已被 Git 跟踪的文件,但是还没有 git add,想放弃修改:
bash
git restore main.py这会把文件恢复到最近一次提交的状态。
注意:
text
未提交的修改可能会丢失所以执行前最好先:
bash
git diff确认。
22. 取消暂存
假设已经:
bash
git add main.py但不想让它进入下一次提交。
可以:
bash
git restore --staged main.py它会把文件从暂存区移回工作区。
文件修改本身不会消失。
23. git rm
删除一个已经被 Git 跟踪的文件:
bash
git rm test.txt然后:
bash
git commit -m "remove test.txt"这样 Git 会记录:
text
文件被删除24. git mv
重命名文件:
bash
git mv old.txt new.txt然后提交:
bash
git commit -m "rename file"Git 会记录这个变化。
25. .gitignore
有些文件不应该提交到 Git。
例如:
text
.venv/
node_modules/
.env
.cache/
__pycache__/可以创建:
text
.gitignore例如:
gitignore
.venv/
__pycache__/
.env
*.logGit 就会忽略这些文件。
26. .gitignore 只对未跟踪文件直接生效
如果某个文件已经被 Git 跟踪:
text
config.txt后来才加入:
gitignore
config.txtGit 不会自动停止跟踪它。
可以:
bash
git rm --cached config.txt然后提交。
这样:
text
本地文件还在
Git 不再跟踪Git 分支
27. 什么是分支
分支可以理解成:
text
项目的一条独立开发路线例如:
text
main
├── login
└── feature-ui你可以在不同分支上修改代码,而不立即影响主分支。
28. 查看分支
bash
git branch例如:
text
* main
dev其中:
text
*表示当前所在分支。
29. 创建分支
bash
git branch dev此时只是创建:
text
dev还没有切换过去。
30. 切换分支
推荐使用:
bash
git switch dev切换到:
text
dev31. 创建并切换分支
可以:
bash
git switch -c feature-login这相当于:
bash
git branch feature-login
git switch feature-login32. git checkout
以前常见:
bash
git checkout dev现在 Git 更推荐:
bash
git switch dev来切换分支。
恢复文件则推荐:
bash
git restore这样职责更清晰。
33. 合并分支
假设:
text
feature-login已经开发完成。
先回到:
bash
git switch main然后:
bash
git merge feature-login表示:
text
把 feature-login 的修改合并到 main34. 删除分支
开发完成后:
bash
git branch -d feature-login强制删除:
bash
git branch -D feature-login-D 更危险,因为即使分支还没有完整合并,也会删除。
GitHub 和远程仓库
35. 什么是远程仓库
本地 Git 仓库存在自己的电脑上。
GitHub 上的 Git 仓库属于:
text
远程仓库结构可以理解为:
text
本地电脑
↕
GitHub36. 查看远程仓库
bash
git remote通常会看到:
text
origin更详细:
bash
git remote -v例如:
text
origin git@github.com:user/project.git (fetch)
origin git@github.com:user/project.git (push)37. origin 是什么
origin 并不是 GitHub 的固定关键字。
它只是远程仓库的一个:
text
名字通常第一次添加远程仓库时习惯命名为:
text
origin例如:
bash
git remote add origin git@github.com:user/project.git这里:
text
origin可以理解成:
text
这个 GitHub 仓库的本地简称38. 添加远程仓库
例如:
bash
git remote add origin git@github.com:user/project.git查看:
bash
git remote -v确认添加成功。
39. git push
把本地提交上传到远程仓库:
bash
git push origin main意思是:
text
把本地 main 分支
推送到 origin 远程仓库40. 第一次 push
第一次通常可以:
bash
git push -u origin main其中:
text
-u会建立:
text
本地 main和:
text
远程 origin/main之间的跟踪关系。
以后通常直接:
bash
git push即可。
41. origin/main 是什么
例如:
text
origin/main可以理解成:
text
origin 这个远程仓库中的 main 分支注意:
text
main和:
text
origin/main不是同一个东西。
main:
text
本地分支origin/main:
text
本地保存的远程 main 分支状态42. git clone
把远程仓库完整下载到本地:
bash
git clone git@github.com:user/project.gitGit 会:
text
下载项目文件
下载提交历史
建立 .git
配置 origin因此 clone 之后不需要再:
bash
git init也通常不需要重新添加:
text
origin43. git fetch
获取远程仓库的最新状态:
bash
git fetch origin它会更新类似:
text
origin/main但是:
text
不会直接修改当前工作区文件可以理解成:
text
只把远程最新信息拿回来看看44. git pull
bash
git pull通常可以简单理解为:
text
git fetch
+
把远程修改合并到当前分支所以它会直接影响当前代码。
45. fetch 和 pull 的区别
git fetch
bash
git fetch origin特点:
text
获取远程最新状态
不会直接修改当前文件git pull
bash
git pull特点:
text
获取远程修改
然后更新当前分支所以如果想先看看远程发生了什么:
bash
git fetch通常更安全、更容易理解。
46. 查看本地和远程差异
先:
bash
git fetch origin然后:
bash
git log --oneline main..origin/main可以查看:
text
远程有,但本地没有的提交。
反过来:
bash
git log --oneline origin/main..main查看:
text
本地有,但远程没有的提交。
reset
47. git reset
git reset 可以移动当前分支指针,也可以影响暂存区和工作区。
这是一个比较重要、也比较容易误操作的命令。
常见三种:
text
--soft
--mixed
--hard48. git reset --soft
例如:
bash
git reset --soft HEAD~1表示:
text
撤销最近一次 commit
但修改仍保留在暂存区适合:
text
提交信息写错
想重新整理提交49. git reset --mixed
默认就是 mixed:
bash
git reset HEAD~1相当于:
bash
git reset --mixed HEAD~1效果:
text
撤销 commit
取消暂存
但代码修改仍保留50. git reset --hard
例如:
bash
git reset --hard HEAD~1会:
text
撤销提交
恢复暂存区
恢复工作区也就是说相关未保存修改可能直接消失。
所以:
text
--hard使用前要特别谨慎。
51. HEAD
Git 中:
text
HEAD可以简单理解为:
text
当前所在提交例如:
text
HEAD~1表示:
text
当前提交的上一个提交HEAD~2:
text
当前提交往前两个版本52. 强制同步远程仓库
如果本地只作为同步副本,不需要保留本地修改,可以:
bash
git fetch origin
git reset --hard origin/main这样本地当前分支会直接变成:
text
origin/main对应的状态。
如果还有未跟踪文件,可以查看:
bash
git status如果确认全部不需要,再:
bash
git clean -fd53. git clean
删除未被 Git 跟踪的文件:
bash
git clean -f删除未跟踪目录:
bash
git clean -fd执行前推荐先预览:
bash
git clean -nd其中:
text
-n表示:
text
只显示将删除什么,不真正删除git clean 删除的文件通常不能依靠 Git 恢复,所以需要谨慎。
Git 冲突
54. 什么是冲突
如果两边同时修改了同一段代码,Git 可能无法自动判断应该保留哪一个。
例如:
text
main和:
text
dev都修改了:
text
main.py同一位置。
合并时可能出现:
text
CONFLICT55. 冲突标记
文件中可能出现:
text
<<<<<<< HEAD
本地内容
=======
另一个分支内容
>>>>>>> dev需要手动决定:
text
保留哪部分
或者合并两部分然后删除这些冲突标记。
56. 冲突解决流程
修改好文件后:
bash
git add 文件然后:
bash
git commit完成冲突解决。
如果是某些 merge 流程,也可能继续使用:
bash
git merge --continue常用 Git 工作流
57. 新项目初始化
bash
mkdir my-project
cd my-project
git init创建文件:
bash
touch README.md查看:
bash
git status添加:
bash
git add .提交:
bash
git commit -m "initial commit"58. 日常修改代码
平时最常见:
bash
git status
git diff
git add .
git commit -m "update feature"
git push可以理解成:
text
看看改了什么
↓
检查具体差异
↓
加入暂存区
↓
创建提交
↓
上传 GitHub59. 从 GitHub 获取最新代码
简单方式:
bash
git pull更希望先看远程状态:
bash
git fetch origin再决定如何更新。
60. Mac 开发,Linux 只同步
如果主要在 Mac 上开发:
text
Mac
修改
↓
git add
↓
git commit
↓
git push
↓
GitHubLinux 机器只负责同步:
text
GitHub
↓
LinuxLinux 上可以:
bash
git fetch origin
git reset --hard origin/main如果还要删除额外的未跟踪文件:
bash
git clean -fd这样 Linux 会完全跟随远程:
text
origin/main这种工作流下,Linux 端通常不需要:
bash
git add
git commit
git push61. 查看当前分支
bash
git branch --show-current例如:
text
main也可以:
bash
git status看到:
text
On branch main62. 查看远程跟踪状态
bash
git branch -vv可能看到:
text
* main 8f23c10 [origin/main] update config说明本地:
text
main正在跟踪:
text
origin/main63. 查看远程仓库详细信息
bash
git remote show origin可以看到:
text
远程地址
默认分支
跟踪分支
push 信息64. 修改远程地址
例如从 HTTPS 改成 SSH:
bash
git remote set-url origin git@github.com:user/project.git查看:
bash
git remote -v确认修改结果。
65. HTTPS 和 SSH
GitHub 常见两种连接方式:
HTTPS
类似:
text
https://github.com/user/project.gitSSH
类似:
text
git@github.com:user/project.git两种都可以。
长期在自己的电脑上开发时,配置好 SSH 后通常比较方便。
66. Git 不等于 GitHub
这两个概念不要混淆。
Git
text
版本控制工具可以完全离线使用。
例如:
bash
git init
git add .
git commit -m "test"这些都不需要 GitHub。
GitHub
text
远程 Git 仓库托管平台提供:
text
远程仓库
协作
Issue
Pull Request
Actions所以:
text
Git ≠ GitHub67. Git 基础命令速查
| 命令 | 作用 |
|---|---|
git init | 初始化仓库 |
git status | 查看状态 |
git add | 加入暂存区 |
git commit | 创建提交 |
git log | 查看提交历史 |
git diff | 查看修改 |
git restore | 恢复工作区文件 |
git branch | 查看/创建分支 |
git switch | 切换分支 |
git merge | 合并分支 |
git clone | 克隆远程仓库 |
git remote -v | 查看远程仓库 |
git fetch | 获取远程最新状态 |
git pull | 拉取并更新当前分支 |
git push | 推送本地提交 |
git reset | 重置提交/暂存区 |
git clean | 删除未跟踪文件 |
68. 最常用的一套命令
日常开发:
bash
git status
git add .
git commit -m "update"
git push拉取远程修改:
bash
git pull查看历史:
bash
git log --oneline查看修改:
bash
git diff切换分支:
bash
git switch main创建分支:
bash
git switch -c dev69. Git 状态变化
可以把 Git 最核心的过程记成:
text
编辑文件
│
▼
工作区
│
│ git add
▼
暂存区
│
│ git commit
▼
本地仓库
│
│ git push
▼
远程仓库从远程获取:
text
远程仓库
│
│ git fetch / git pull
▼
本地70. restore、reset、clean 区别
git restore
主要处理:
text
已跟踪文件的修改例如:
bash
git restore main.pygit reset
主要处理:
text
提交位置
暂存区
工作区例如:
bash
git reset --hard origin/maingit clean
主要处理:
text
未被 Git 跟踪的文件例如:
bash
git clean -fd可以简单记成:
text
restore → 恢复已跟踪文件
reset → 重置 Git 状态
clean → 清理未跟踪文件71. 常见安全习惯
执行危险命令前先查看:
bash
git status特别是:
bash
git reset --hard
git clean -fd这两个命令都可能直接删除本地修改或文件。
执行 git clean 前可以先:
bash
git clean -nd预览。
执行 reset 前,如果本地修改重要,先确认是否已经:
text
commit或者另外保存。
小结
Git 最核心的三个阶段:
text
工作区
↓ git add
暂存区
↓ git commit
本地仓库
↓ git push
远程仓库新手最需要掌握:
bash
git status
git add .
git commit -m "message"
git log --oneline
git diff
git pull
git push然后再逐渐掌握:
bash
git branch
git switch
git merge
git fetch
git restore
git reset最重要的是理解:
text
git add
不是保存代码
git commit
才是创建一个 Git 版本
git push
则是把本地版本上传到远程仓库只要把:
text
工作区 → 暂存区 → 本地仓库 → 远程仓库这个流程彻底理解,Git 的大部分基础操作都会变得很好理解。