Git 命令操作完全指南

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 checkoutgit 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 会标记冲突文件。手动编辑后:

    bash 复制代码
    git 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 并提交。


五、常见问题与解答

  1. 误删文件怎么办?
    若未提交:git restore file.txt。若已提交:git checkout HEAD file.txt
  2. 提交错了消息?
    修改最后一次提交:git commit --amend -m "New message"
  3. 推送被拒绝?
    先拉取更新:git pull --rebase,再推送。

六、结语

Git 的强大在于其灵活性和分布式特性。从基础的 addcommit 到远程协作的 pushpull,再到分支管理和冲突解决,本文涵盖了日常开发所需的核心操作。通过实践这些命令,您将能高效管理代码并与团队协作。继续探索 stashtag 等高级功能,Git 将成为您开发的得力助手!

相关推荐
夜晓码农5 分钟前
Windows .gitignore文件不生效的情况排查
windows·git
程序猿chen1 小时前
第二重·腾挪篇:云原生轻功身法要诀
java·git·后端·程序人生·云原生·java-ee·github
lakernote1 小时前
Windows下在IntelliJ IDEA 使用 Git 拉取、提交脚本出现换行符问题
windows·git·intellij-idea
uhakadotcom3 小时前
解锁 Google Cloud Pub/Sub 的强大功能
后端·面试·github
2301_793086873 小时前
设置github 代理
github
Yvsanf4 小时前
github使用
github
uhakadotcom4 小时前
Vulkan API 入门指南:跨平台、高性能的图形和计算解决方案
后端·面试·github
uhakadotcom4 小时前
Rust中的reqwest库:轻松实现HTTP请求
后端·面试·github
uhakadotcom5 小时前
Apache APISIX 简介与实践
后端·面试·github
uhakadotcom5 小时前
Kong Gateway 简介与实践
后端·面试·github