Git 是现代软件开发中不可或缺的分布式版本控制系统。它不仅能追踪代码变更,还能协调多人协作、管理项目历史。本文从核心概念入手,逐步深入讲解 Git 的基础与高级命令,结合实用场景,帮助您从入门到精通。
一、Git 核心概念
理解 Git 的工作原理是高效使用它的前提。以下是三个核心概念及其关系:
1. 项目目录(工作区)
项目目录是你直接操作的本地文件夹,也叫"工作区"(Working Directory)。它包含代码文件、配置文件等所有内容。Git 不会自动管理这里的任何文件,除非你明确告诉它哪些需要追踪。工作区是你编写代码的起点。
2. 暂存区
暂存区(Staging Area 或 Index)是工作区与 Git 仓库之间的中间层。通过 git add
,你可以选择性地将工作区的变更"暂存"到这里,准备提交。暂存区的存在让你可以分步骤组织提交内容,而不是一次性提交所有修改。例如,你可以先暂存部分文件,检查后再提交。
3. Git 仓库
Git 仓库(Repository)是存储项目历史和版本数据的地方。本地仓库位于项目目录下的 .git
文件夹,包含所有提交记录、分支信息等。远程仓库(如 GitHub、GitLab)则是多人协作时的共享存储。通过 git commit
,暂存区的更改会被永久记录到本地仓库。
三者关系
- 工作区 → 暂存区 :通过
git add
将修改"暂存"。 - 暂存区 → 仓库 :通过
git commit
将暂存内容提交。 - 仓库 → 工作区 :通过
git checkout
或git restore
恢复文件。
这三层结构是 Git 的核心逻辑,贯穿所有操作。
二、基础命令详解
1. Git 配置(git config)
在使用 Git 前,配置用户身份和偏好是必要步骤。这些设置会影响提交记录和操作体验。
git config --global user.name "Your Name"
设置全局用户名,所有提交都会携带此信息。例如:git config --global user.name "Alice"
。git config --global user.email "[email protected]"
设置全局邮箱,通常与代码托管平台(如 GitHub)账号一致。例如:git config --global user.email "[email protected]"
。git config --global core.editor "vim"
指定默认编辑器,用于编写提交信息。支持 Vim、Nano、VS Code(需配置路径,如"code --wait"
)等。git config --global core.autocrlf true
处理换行符问题。Windows 用户建议设为true
(自动转换 CRLF 为 LF),Linux/Mac 用户设为input
(仅提交时转换)或false
(不转换)。git config --global -e
使用默认编辑器打开全局配置文件(通常是~/.gitconfig
),手动编辑所有设置。
案例
新手小明刚安装 Git,他运行:
bash
git config --global user.name "Ming"
git config --global user.email "[email protected]"
git config --global core.editor "code --wait"
现在,他的每条提交都会标记为 "Ming [email protected]",并且用 VS Code 编写提交信息。
2. 文件操作(git add / git rm / git mv)
添加文件到暂存区
git add file.txt
将指定文件(如file.txt
)加入暂存区。git add *.txt
添加所有.txt
文件,支持通配符。git add .
添加当前目录下所有改动(新增、修改、删除)的文件。
Git 只追踪显式添加的文件。每次修改已追踪文件后,需再次 git add
更新暂存区。例如,你修改了 readme.txt
,必须运行 git add readme.txt
才能提交最新版本。
删除文件
git rm file.txt
从工作区和暂存区同时删除文件,下次提交时记录删除操作。git rm --cached file.txt
停止追踪某文件,但保留工作区副本。常用于误提交的文件(如日志文件)。git rm -r bin/
递归删除文件夹及其内容(如bin/
目录)。
重命名或移动
git mv oldname.txt newname.txt
重命名文件并更新暂存区。例如:git mv readme.md README.md
。git mv file.txt dir/
将文件移动到指定目录。
案例
小明新建了 test.txt
,并运行:
bash
git add test.txt
后来他决定重命名:
bash
git mv test.txt test_new.txt
若想删除:
bash
git rm test_new.txt
3. 查看状态(git status)
git status
显示当前工作区和暂存区的状态,包括:- 未暂存的修改(Changes not staged for commit)。
- 已暂存待提交的内容(Changes to be committed)。
- 未追踪的文件(Untracked files)。
git status -s
简洁输出,例如:M file.txt
:已修改但未暂存。A file.txt
:已暂存的新文件。?? newfile.txt
:未追踪文件。
案例
小明修改了 main.py
并新增 notes.txt
,运行 git status
:
Changes not staged for commit:
modified: main.py
Untracked files:
notes.txt
他运行 git add .
,再检查:
Changes to be committed:
modified: main.py
new file: notes.txt
4. 提交更改(git commit)
git commit -m "Fix the bug"
提交暂存区内容,附带简洁消息。社区惯例使用现在时,如 "Add feature" 而不是 "Added feature"。git commit
打开默认编辑器(如 Vim)输入多行提交信息。保存并关闭后提交。git commit -a
自动暂存所有已追踪文件的修改并提交,但不包括新增文件。
注意事项
- 提交消息要清晰。例如:
"Update login validation logic"
比"Update"
更具描述性。 -a
不适用于新文件,需先git add
。
案例
小明修复了一个 bug:
bash
git add bugfix.py
git commit -m "Fix login error handling"
若想跳过暂存:
bash
git commit -a -m "Update readme"
5. 查看差异(git diff)
git diff
比较工作区与暂存区的差异。git diff --staged
比较暂存区与上次提交的差异。git diff HEAD
比较工作区与上次提交的差异(包括未暂存和已暂存)。
配置差异工具
git config --global diff.tool vscode
使用 VS Code 查看差异。git config --global difftool.vscode.cmd "code --wait --diff $LOCAL $REMOTE"
设置调用命令。git difftool
启动配置的工具。
输出解读
- 绿色
+
:新增行。 - 红色
-
:删除行。 @
符号:指示变更位置。
案例
小明修改了 main.py
,运行 git diff
:
- print("Hello")
+ print("Hello, Git!")
暂存后运行 git diff --staged
,确认变更正确。
6. 查看历史(git log / git show)
git log
显示提交历史,每条包括哈希值、作者、日期和消息。git log --oneline
每条提交一行,仅显示哈希和消息。git log --oneline --reverse
正序显示简洁历史。git log --graph
显示分支合并图。git show d601
查看指定提交(d601
是哈希前缀)的详情。git show HEAD
查看最新提交。git show HEAD~1
查看上一次提交。
案例
小明运行 git log --oneline
:
d601f2e Fix the bug
a3b9c1d Add main.py
他用 git show d601f2e
查看具体变更。
7. 文件列表与结构
git ls-files
列出暂存区追踪的文件。git ls-tree HEAD
显示当前提交的树结构,包括文件和目录。
案例
小明运行 git ls-files
:
main.py
readme.txt
8. 撤销操作(git restore)
git restore file.txt
丢弃工作区中file.txt
的未暂存修改。git restore --staged file.txt
将暂存区的file.txt
撤销回工作区。git restore --source=HEAD~1 file.txt
恢复文件到上一次提交的状态。
案例
小明误改了 readme.txt
,运行:
bash
git restore readme.txt
若已暂存,运行:
bash
git restore --staged readme.txt
三、远程仓库操作
远程仓库是团队协作的关键,常用平台包括 GitHub、GitLab 和 Bitbucket。
1. 初始化与克隆
git init
在当前目录创建新仓库。git clone https://github.com/user/repo.git
克隆远程仓库到本地,自动关联远程。
案例
小明克隆项目:
bash
git clone https://github.com/ming/project.git
cd project
2. 关联远程仓库
git remote add origin https://github.com/user/repo.git
添加远程仓库,命名为origin
。git remote -v
查看关联的远程地址。git remote remove origin
删除关联。
3. 推送与拉取
git push origin main
推送本地main
分支到远程。git push -u origin main
推送并设置上游分支,便于后续简化为git push
。git pull origin main
拉取远程main
分支并合并。
案例
小明提交后推送:
bash
git push origin main
若远程有更新:
bash
git pull origin main
4. 分支管理
git branch
列出本地分支,带*
表示当前分支。git branch -r
列出远程分支。git branch feature
创建分支feature
。git checkout feature
切换到feature
分支。git checkout -b feature
创建并切换。git push origin feature
推送分支到远程。
案例
小明开发新功能:
bash
git checkout -b login-feature
git add login.py
git commit -m "Add login validation"
git push origin login-feature
四、高级用法与技巧
1. 分支合并与冲突解决
-
git merge feature
将feature
分支合并到当前分支。 -
冲突解决 :若有冲突,Git 会标记冲突文件。手动编辑后:
bashgit add resolved_file.txt git commit
案例
小明合并分支:
bash
git checkout main
git merge login-feature
若冲突,编辑文件后提交。
2. 变基(git rebase)
git rebase main
将当前分支变基到main
,保持线性历史。git rebase -i HEAD~3
交互式变基,修改最近三次提交。
3. 回滚操作
git reset --soft HEAD~1
撤销最后一次提交,保留修改。git reset --hard HEAD~1
撤销提交并丢弃修改。
4. 忽略文件
创建 .gitignore
文件,内容如:
*.log
node_modules/
运行 git add .gitignore
并提交。
五、常见问题与解答
- 误删文件怎么办?
若未提交:git restore file.txt
。若已提交:git checkout HEAD file.txt
。 - 提交错了消息?
修改最后一次提交:git commit --amend -m "New message"
。 - 推送被拒绝?
先拉取更新:git pull --rebase
,再推送。
六、结语
Git 的强大在于其灵活性和分布式特性。从基础的 add
、commit
到远程协作的 push
、pull
,再到分支管理和冲突解决,本文涵盖了日常开发所需的核心操作。通过实践这些命令,您将能高效管理代码并与团队协作。继续探索 stash
、tag
等高级功能,Git 将成为您开发的得力助手!