Skip to content

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.com

4. --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 status

12. 未跟踪文件

创建:

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 --cached

21. 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
*.log

Git 就会忽略这些文件。


26. .gitignore 只对未跟踪文件直接生效

如果某个文件已经被 Git 跟踪:

text
config.txt

后来才加入:

gitignore
config.txt

Git 不会自动停止跟踪它。

可以:

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
dev

31. 创建并切换分支

可以:

bash
git switch -c feature-login

这相当于:

bash
git branch feature-login
git switch feature-login

32. 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 的修改合并到 main

34. 删除分支

开发完成后:

bash
git branch -d feature-login

强制删除:

bash
git branch -D feature-login

-D 更危险,因为即使分支还没有完整合并,也会删除。


GitHub 和远程仓库

35. 什么是远程仓库

本地 Git 仓库存在自己的电脑上。

GitHub 上的 Git 仓库属于:

text
远程仓库

结构可以理解为:

text
本地电脑

GitHub

36. 查看远程仓库

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.git

Git 会:

text
下载项目文件
下载提交历史
建立 .git
配置 origin

因此 clone 之后不需要再:

bash
git init

也通常不需要重新添加:

text
origin

43. git fetch

获取远程仓库的最新状态:

bash
git fetch origin

它会更新类似:

text
origin/main

但是:

text
不会直接修改当前工作区文件

可以理解成:

text
只把远程最新信息拿回来看看

44. git pull

bash
git pull

通常可以简单理解为:

text
git fetch
+
把远程修改合并到当前分支

所以它会直接影响当前代码。


45. fetchpull 的区别

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
--hard

48. 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 -fd

53. 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
CONFLICT

55. 冲突标记

文件中可能出现:

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
看看改了什么

检查具体差异

加入暂存区

创建提交

上传 GitHub

59. 从 GitHub 获取最新代码

简单方式:

bash
git pull

更希望先看远程状态:

bash
git fetch origin

再决定如何更新。


60. Mac 开发,Linux 只同步

如果主要在 Mac 上开发:

text
Mac
修改

git add

git commit

git push

GitHub

Linux 机器只负责同步:

text
GitHub

Linux

Linux 上可以:

bash
git fetch origin
git reset --hard origin/main

如果还要删除额外的未跟踪文件:

bash
git clean -fd

这样 Linux 会完全跟随远程:

text
origin/main

这种工作流下,Linux 端通常不需要:

bash
git add
git commit
git push

61. 查看当前分支

bash
git branch --show-current

例如:

text
main

也可以:

bash
git status

看到:

text
On branch main

62. 查看远程跟踪状态

bash
git branch -vv

可能看到:

text
* main 8f23c10 [origin/main] update config

说明本地:

text
main

正在跟踪:

text
origin/main

63. 查看远程仓库详细信息

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.git

SSH

类似:

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 ≠ GitHub

67. 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 dev

69. Git 状态变化

可以把 Git 最核心的过程记成:

text
编辑文件


工作区

   │ git add

暂存区

   │ git commit

本地仓库

   │ git push

远程仓库

从远程获取:

text
远程仓库

   │ git fetch / git pull

本地

70. restoreresetclean 区别

git restore

主要处理:

text
已跟踪文件的修改

例如:

bash
git restore main.py

git reset

主要处理:

text
提交位置
暂存区
工作区

例如:

bash
git reset --hard origin/main

git 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 的大部分基础操作都会变得很好理解。