Git 常用操作指南:从入门到日常
Git 是现代软件开发中不可或缺的版本控制系统。它强大而灵活,但也可能因为命令繁多而让初学者望而生畏。本指南旨在总结 Git 的常用操作,帮助你快速上手并高效地在日常工作中使用它,作为笔记使用。
一、初始配置 (Global Setup)
在你开始使用 Git 之前,进行一些全局配置是很重要的,这样你的提交就会有正确的身份信息。
# 设置你的用户名 (会被记录在提交历史中)
git config --global user.name "你的名字或昵称"
# 设置你的邮箱 (同样会被记录)
git config --global user.email "你的邮箱@example.com"
# (可选) 设置默认的文本编辑器,用于编辑提交信息等
# 例如使用 VS Code: git config --global core.editor "code --wait"
# 例如使用 Vim: git config --global core.editor "vim"
# 查看当前配置
git config --list
二、创建与克隆仓库 (Repositories)
1. 初始化新仓库
在现有项目目录中创建一个新的 Git 仓库:
cd /path/to/your/project
git init
2. 克隆现有仓库
从远程服务器(如 GitHub, GitLab, Gogs)复制一个项目到本地:
git clone <repository_url>
# 例如: git clone https://github.com/user/repo.git
# 克隆到指定名称的本地目录
git clone <repository_url> <custom_directory_name>
三、核心工作流程:修改、暂存、提交 (The Basic Workflow)
这是 Git 日常使用中最核心的循环。
1. 查看状态
检查工作目录和暂存区的状态,了解哪些文件被修改、新增或待提交:
git status
2. 添加文件到暂存区 (Staging)
将文件的更改“暂存”起来,准备下一次提交。
# 添加指定文件
git add <file_name>
# 例如: git add README.md
# 添加多个文件
git add <file1> <file2>
# 添加当前目录下所有已修改或新创建的文件 (不包括被 .gitignore 忽略的文件)
git add .
# 添加所有已跟踪文件的修改 (包括删除) 以及新文件
git add -A
3. 提交更改 (Committing)
将暂存区的内容永久记录到本地仓库的历史中。
git commit -m "你的提交信息,清晰描述本次更改的内容"
# 例如: git commit -m "Add initial project files"
# 跳过暂存步骤,直接提交所有已跟踪文件的修改 (对新文件无效)
git commit -a -m "快速提交已跟踪文件的修改"
4. 其他快照操作
# 从暂存区移除文件,但保留工作目录的修改
git reset <file_name>
# 或
git reset HEAD <file_name>
# 删除工作目录和暂存区的文件,并记录删除操作
git rm <file_name>
# 停止追踪文件 (从暂存区移除),但保留在本地工作目录
# (常用于将已追踪文件加入 .gitignore)
git rm --cached <file_name>
# 重命名或移动文件,并让 Git 知道
git mv <old_filename> <new_filename>
四、分支管理 (Branching)
分支是 Git 的核心特性,允许多人并行开发或尝试新功能而不影响主线代码。
1. 查看与创建分支
# 列出所有本地分支,当前分支会用 * 标记
git branch
# 列出所有远程分支
git branch -r
# 列出所有本地和远程分支
git branch -a
# 创建一个新分支 (但不切换)
git branch <new_branch_name>
# 例如: git branch feature/user-login
2. 切换分支
# 切换到已存在的分支 (Git 2.23 之前)
git checkout <branch_name>
# 例如: git checkout feature/user-login
# 切换到已存在的分支 (Git 2.23+ 推荐)
git switch <branch_name>
# 创建并立即切换到新分支 (Git 2.23 之前)
git checkout -b <new_branch_name>
# 例如: git checkout -b hotfix/critical-bug
# 创建并立即切换到新分支 (Git 2.23+ 推荐)
git switch -c <new_branch_name>
3. 删除分支
# 删除已合并到当前分支的本地分支
git branch -d <branch_name>
# 强制删除本地分支 (即使未合并,慎用!)
git branch -D <branch_name>
4. 重命名分支
# 如果当前在要重命名的分支上
git branch -m <new_branch_name>
# 如果当前不在要重命名的分支上
git branch -m <old_branch_name> <new_branch_name>
五、合并与变基 (Merging & Rebasing)
将不同分支的工作整合到一起。
1. 合并 (Merge)
将指定分支的历史合并到当前分支,通常会创建一个新的“合并提交”。
# 切换到接收更改的分支 (例如 main 或 master)
git switch main
# 合并 feature 分支到 main
git merge <feature_branch_name>
# 例如: git merge feature/user-login
如果出现冲突,你需要手动解决冲突文件,然后 git add <resolved_file>
,最后 git commit
。
如果想中止合并:git merge --abort
。
2. 变基 (Rebase)
将当前分支的提交“重新播放”在目标分支的最新提交之上,使提交历史更线性、更整洁。
# 切换到要变基的分支 (例如 feature 分支)
git switch feature/user-login
# 将 feature/user-login 变基到 main 分支上
git rebase main
变基也可能产生冲突,解决方式类似合并,但解决后使用 git rebase --continue
。
如果想中止变基:git rebase --abort
。
注意: 不要在已经推送到公共远程仓库并被他人使用的分支上执行 rebase
,因为它会改写历史。
六、与远程仓库协作 (Remotes)
1. 查看与管理远程仓库
# 列出所有配置的远程仓库及其 URL
git remote -v
# 添加一个新的远程仓库 (通常命名为 origin)
git remote add <remote_name> <repository_url>
# 例如: git remote add origin https://github.com/your_username/your_project.git
# 移除指定的远程仓库
git remote rm <remote_name>
# 重命名远程仓库
git remote rename <old_name> <new_name>
2. 从远程仓库获取更新
# 下载远程仓库的所有分支和对象的最新信息,但不会自动合并到本地分支
git fetch <remote_name>
# 例如: git fetch origin
# 下载所有远程仓库的更新
git fetch --all
3. 拉取并合并更新 (Pull)
git pull
实际上是 git fetch
紧跟着一个 git merge
(或 git rebase
,取决于配置)。
# 从远程仓库的指定分支拉取更新并合并到当前本地分支
git pull <remote_name> <branch_name>
# 例如: git pull origin main
# 如果当前本地分支已设置了上游跟踪分支,可以简化为:
git pull
4. 推送本地更改到远程仓库 (Push)
# 将本地指定分支的提交推送到远程仓库的对应分支
git push <remote_name> <local_branch_name>:<remote_branch_name>
# 例如: git push origin main:main (如果本地和远程分支名相同,可简写)
git push origin main
# 推送并设置上游跟踪分支 (下次可直接用 git push)
git push -u <remote_name> <branch_name>
# 例如: git push -u origin feature/new-feature
# 删除远程分支 (两种方式)
git push <remote_name> --delete <remote_branch_name>
git push <remote_name> :<remote_branch_name> # 冒号前为空
# 强制推送 (会覆盖远程历史,非常危险,仅在确知后果时使用!)
git push --force <remote_name> <branch_name>
七、查看历史与状态 (Inspecting History)
1. 查看提交历史 (Log)
# 显示当前分支的提交历史
git log
# 单行简洁显示
git log --oneline
# 图形化显示分支和合并历史
git log --graph
# 自定义格式
git log --pretty=format:"%h - %an, %ar : %s"
# 查看特定文件的提交历史
git log <file_name>
# 查看特定文件的详细修改历史 (包括 diff)
git log -p <file_name>
2. 查看更改详情 (Diff)
# 显示工作目录中相对于暂存区的更改
git diff
# 显示暂存区相对于上次提交的更改
git diff --staged
# 或
git diff --cached
# 显示两次提交之间的差异
git diff <commit_hash1> <commit_hash2>
# 显示两个分支之间的差异
git diff <branch1>..<branch2>
3. 显示单次提交详情
git show <commit_hash_or_branch_name>
八、撤销操作 (Undoing Changes)
Git 提供了多种撤销操作的方式,务必小心使用。
1. 撤销工作目录的修改
# 丢弃工作目录中对指定文件的修改 (恢复到上次提交或暂存的状态)
# 注意:此操作不可逆,会丢失未保存的修改!
git checkout -- <file_name>
2. 取消暂存
见上文 git reset <file_name>
。
3. 重置提交 (Reset)
git reset
可以将 HEAD(当前分支的顶端)移动到不同的提交。
# --soft: 移动 HEAD,保留暂存区和工作目录的更改。之前的提交会变成未暂存。
git reset --soft <commit_hash_or_HEAD~N>
# 例如回退到上一个提交: git reset --soft HEAD~1
# --mixed (默认): 移动 HEAD,重置暂存区,保留工作目录的更改。
git reset <commit_hash_or_HEAD~N>
# 例如回退到上一个提交,并将更改放入工作目录: git reset HEAD~1
# --hard: 移动 HEAD,重置暂存区和工作目录到指定提交的状态。
# 注意:此操作会丢失目标提交之后的所有提交以及未提交的本地更改,非常危险!
git reset --hard <commit_hash_or_HEAD~N>
# 例如彻底回退到上一个提交: git reset --hard HEAD~1
4. 反转提交 (Revert)
git revert
会创建一个新的提交,其内容是指定提交的“反向”操作。这是一种安全的撤销方式,因为它不改变现有历史。
git revert <commit_hash_to_revert>
# 例如: git revert abc1234
5. 清理未追踪文件
# 预览将要删除的未追踪文件和目录
git clean -fdn
# 实际删除工作目录中未被追踪的文件和目录
# 注意:此操作会删除文件,不可逆!
git clean -fd
九、标签 (Tagging)
标签用于标记项目历史中的重要节点,如版本发布。
# 列出所有标签
git tag
# 创建一个轻量标签 (指向当前提交)
git tag <tag_name>
# 例如: git tag v1.0.0
# 创建一个附注标签 (包含作者、日期、消息等信息)
git tag -a <tag_name> -m "标签描述信息"
# 例如: git tag -a v1.0.1 -m "Version 1.0.1 release"
# 查看特定标签的信息
git show <tag_name>
# 删除本地标签
git tag -d <tag_name>
# 推送指定标签到远程仓库
git push <remote_name> <tag_name>
# 例如: git push origin v1.0.1
# 推送所有本地标签到远程仓库
git push <remote_name> --tags
十、其他实用技巧
1. .gitignore
文件
在项目根目录创建一个名为 .gitignore
的文件,列出你希望 Git 忽略(不追踪)的文件或目录模式。例如:
# 编译产物
*.o
*.class
target/
# 日志文件
*.log
# 操作系统生成的文件
.DS_Store
Thumbs.db
# 依赖目录
node_modules/
vendor/
# IDE 配置文件
.idea/
*.iml
.vscode/
2. 储藏 (Stash)
当你正在一个分支上工作,但需要临时切换到另一个分支处理紧急事务,又不想提交当前未完成的工作时,git stash
非常有用。
# 保存当前工作目录和暂存区的更改,并将工作目录恢复到干净状态
git stash
# 或带描述信息
git stash save "My temporary work on feature X"
# 列出所有保存的储藏
git stash list
# 应用最新的储藏 (但不从储藏列表中删除)
git stash apply
# 应用指定的储藏: git stash apply stash@{N}
# 应用最新的储藏并从储藏列表中删除
git stash pop
# 应用指定的储藏并删除: git stash pop stash@{N}
# 删除指定的储藏
git stash drop stash@{N}
# 清空所有储藏
git stash clear
3. 追溯文件修改 (Blame)
查看文件中每一行是谁在哪个提交中最后修改的:
git blame <file_name>