前方高能!Git命令终极宝典:从入门到精通的200+命令全解析
Git作为现代软件开发不可或缺的工具,其强大的命令集常常让新手望而生畏。本文将带你深入探索Git的命令世界,从最基本的初始化到高级的调试技巧,全面覆盖你在工作中可能遇到的各类Git操作,并提供常见错误的解决方案。无论你是Git新手还是有经验的开发者,这份详尽的指南都将帮助你更高效地管理代码版本,避免那些令人头疼的合并冲突和历史混乱问题!
一、Git基础操作:入门必备命令
1. 初始化与配置
git init
- 功能:初始化一个新的Git仓库
- 用法:
git init [目录名]
- 实例:
git init myproject
创建名为myproject的新仓库 - 错误解决方案:如果目录已存在,确保它是空的或先删除
git config
- 功能:配置Git的全局或仓库特定设置
- 常用配置:
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
git config --global core.editor "vim"
设置默认编辑器
- 错误解决方案:配置错误可通过
git config --unset <key>
删除特定配置
git clone
- 功能:克隆远程仓库到本地
- 常用用法:
git clone <url>
简单克隆git clone --depth 1 <url>
浅克隆(仅最近提交)git clone --branch <branch> <url>
克隆特定分支
- 错误解决方案:网络问题时尝试
git clone --filter=blob:none <url>
减少数据传输
2. 状态检查与差异查看
git status
- 功能:显示工作目录和暂存区的状态
- 常用选项:
git status -s
简洁输出git status -b
显示分支信息
- 错误解决方案:如果输出混乱,尝试
git status --short
获取更清晰的信息
git diff
- 功能:比较文件差异
- 常用用法:
git diff
比较工作目录与暂存区git diff --staged
比较暂存区与上次提交git diff HEAD
比较工作目录与上次提交git diff branch1 branch2
比较两个分支
- 错误解决方案:差异过大时用
git diff --stat
只看统计信息
git log
- 功能:显示提交历史
- 常用用法:
git log --oneline
简洁单行输出git log --graph
显示分支图git log -p
显示每次提交的差异git log --author="Your Name"
按作者筛选git log --since="2 weeks ago"
按时间筛选
- 错误解决方案:历史过长时用
git log --pretty=oneline
简化输出
二、代码提交与文件管理
1. 添加与提交
git add
- 功能:将文件添加到暂存区
- 常用用法:
git add <file>
添加特定文件git add .
添加所有修改git add -p
交互式添加(适合部分修改)git add -u
添加所有修改(不包括新文件)
- 错误解决方案:添加错误文件用
git reset <file>
撤销暂存
git commit
- 功能:提交暂存区的更改
- 常用用法:
git commit -m "Message"
直接提交git commit -a
跳过暂存直接提交(不包括新文件)git commit --amend
修改上次提交git commit --no-verify
跳过pre-commit钩子
- 错误解决方案:提交信息错误用
git commit --amend
修改
git rm
- 功能:删除文件并从版本控制中移除
- 常用用法:
git rm <file>
删除文件git rm --cached <file>
仅从版本控制中移除,保留文件git rm -r <dir>
递归删除目录
- 错误解决方案:误删文件用
git reset --hard HEAD
恢复
git mv
- 功能:移动或重命名文件
- 用法:
git mv <old-name> <new-name>
- 错误解决方案:重命名错误用
git reset --hard HEAD
恢复
2. 撤销与恢复
git reset
- 功能:重置当前HEAD到指定状态
- 常用用法:
git reset HEAD <file>
取消暂存git reset --soft HEAD^
保留工作区和暂存区,移动HEADgit reset --mixed HEAD^
默认选项,保留工作区,重置暂存区git reset --hard HEAD^
丢弃所有更改,回到指定提交
- 错误解决方案:误用hard选项导致数据丢失,可能需要从备份恢复
git restore
- 功能:恢复文件到指定状态
- 常用用法:
git restore <file>
恢复工作区文件到暂存区状态git restore --staged <file>
取消暂存git restore --source HEAD~1 <file>
恢复到指定提交状态
- 错误解决方案:误恢复用
git reflog
找到之前的提交再恢复
git checkout
- 功能:切换分支或恢复文件
- 常用用法:
git checkout <branch>
切换分支git checkout -- <file>
恢复文件到上次提交状态git checkout HEAD~1 -- <file>
恢复到指定提交
- 错误解决方案:在新版Git中,建议使用
git switch
和git restore
替代
三、分支与合并操作
1. 分支管理
git branch
- 功能:列出、创建或删除分支
- 常用用法:
git branch
列出所有分支git branch <branch-name>
创建新分支git branch -d <branch-name>
删除分支git branch -m <new-name>
重命名当前分支git branch -a
列出所有远程和本地分支
- 错误解决方案:删除错误分支用
git branch <branch-name>
重新创建
git switch
- 功能:切换分支(Git 2.23+)
- 用法:
git switch <branch>
切换到指定分支git switch -c <new-branch>
创建并切换到新分支git switch -
切换到上一个分支
- 错误解决方案:如果分支不存在,先创建分支再切换
2. 合并与变基
git merge
- 功能:将一个分支的更改合并到当前分支
- 常用用法:
git merge <branch>
简单合并git merge --no-ff <branch>
创建合并提交(即使可以快进)git merge --squash <branch>
合并但不创建合并提交git merge --abort
中止合并操作
- 错误解决方案:合并冲突时手动解决冲突后运行
git add
然后git merge --continue
git rebase
- 功能:将一系列提交重新应用到另一条基线上
- 常用用法:
git rebase <base-branch>
简单变基git rebase -i <base-branch>
交互式变基git rebase --continue
继续变基git rebase --abort
中止变基git rebase --skip
跳过当前提交
- 错误解决方案:变基冲突时解决冲突后运行
git add
然后git rebase --continue
git cherry-pick
- 功能:选择特定提交应用到当前分支
- 用法:
git cherry-pick <commit>
应用单个提交git cherry-pick A..B
应用范围提交git cherry-pick -x <commit>
添加提交来源注释
- 错误解决方案:冲突时解决冲突后运行
git cherry-pick --continue
git revert
- 功能:创建一个反转指定提交的新提交
- 用法:
git revert <commit>
反转单个提交git revert A..B
反转范围提交git revert --no-commit <commit>
准备反转但不提交
- 错误解决方案:反转错误提交用
git revert <revert-commit>
再次反转
四、远程仓库操作
1. 远程仓库管理
git remote
- 功能:管理远程仓库
- 常用用法:
git remote -v
查看远程仓库信息git remote add <name> <url>
添加远程仓库git remote rename <old> <new>
重命名远程仓库git remote remove <name>
删除远程仓库
- 错误解决方案:URL错误用
git remote set-url <name> <new-url>
更新
git fetch
- 功能:从远程仓库获取最新数据但不合并
- 常用用法:
git fetch <remote>
获取所有分支git fetch <remote> <branch>
获取特定分支git fetch --all
获取所有远程仓库git fetch --prune
删除已删除的远程分支
- 错误解决方案:网络问题时尝试
git fetch --depth=1
浅获取
git pull
- 功能:获取并合并远程仓库的更改
- 常用用法:
git pull <remote> <branch>
简单拉取git pull --rebase
拉取并变基git pull --no-rebase
强制使用合并(默认)git pull --ff-only
仅快进合并
- 错误解决方案:冲突时解决冲突后运行
git pull --continue
git push
- 功能:将本地提交推送到远程仓库
- 常用用法:
git push <remote> <branch>
简单推送git push --all <remote>
推送所有分支git push --force <remote>
强制推送git push --tags
推送所有标签
- 错误解决方案:认证问题时设置凭证助手:
git config credential.helper store
2. 子模块操作
git submodule
- 功能:管理子模块
- 常用用法:
git submodule add <url> <path>
添加子模块git submodule update --init --recursive
初始化所有子模块git submodule status
查看子模块状态git submodule sync
同步子模块URL
- 错误解决方案:子模块不同步用
git submodule update --force
五、历史查看与调试
1. 历史查看
git show
- 功能:显示各种对象的内容
- 常用用法:
git show <commit>
显示提交详情git show <branch>:<file>
显示分支上文件内容git show --name-only <commit>
显示提交更改的文件
- 错误解决方案:对象不存在时检查拼写或使用
git rev-parse
验证
git log
- 功能:显示提交历史(已在基础操作部分详细说明)
2. 调试工具
git bisect
- 功能:使用二分查找定位引入问题的提交
- 常用用法:
git bisect start
开始二分查找git bisect good <commit>
标记良好提交git bisect bad <commit>
标记问题提交git bisect reset
结束二分查找git bisect run <script>
自动执行二分查找
- 错误解决方案:错误标记用
git bisect visualize
查看历史重新标记
git blame
- 功能:显示每行代码的最后修改信息
- 常用用法:
git blame <file>
显示文件修改信息git blame -L 100,+20 <file>
显示100-120行git blame -w <file>
忽略空白变化git blame -C <file>
显示移动过的代码行
- 错误解决方案:性能问题用
git blame -w -M
优化
git grep
- 功能:在仓库中搜索内容
- 常用用法:
git grep "pattern"
搜索当前目录git grep -n "pattern"
显示行号git grep -i "pattern"
忽略大小写git grep -p "pattern"
显示匹配的函数
- 错误解决方案:复杂搜索用
--extended-regexp
使用正则表达式
六、临时存储与工作流
1. 临时保存
git stash
- 功能:临时保存未提交的更改
- 常用用法:
git stash save "message"
保存更改(旧语法)git stash push -m "message"
保存更改git stash list
查看保存列表git stash show stash@{0}
显示保存内容git stash pop stash@{0}
应用并删除保存git stash drop stash@{0}
删除保存
- 错误解决方案:恢复错误用
git stash branch <branch-name>
创建新分支
2. 工作目录管理
git worktree
- 功能:管理多个工作目录指向同一仓库
- 常用用法:
git worktree add <path> <branch>
添加工作目录git worktree list
列出所有工作目录git worktree remove <path>
移除工作目录git worktree prune
清理无用工作目录
- 错误解决方案:工作目录混乱时用
git worktree list
查看然后清理
七、高级操作与维护
1. 历史重写
git filter-branch
- 功能:重写历史记录
- 常用用法:
git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
从历史中删除文件git filter-branch --subdirectory-filter docs HEAD
提取子目录为新仓库git filter-branch --commit-filter '...' HEAD
修改提交信息
- 错误解决方案:操作前备份仓库,复杂操作考虑使用BFG Repo-Cleaner
git rebase -i
- 功能:交互式变基(已在分支操作部分详细说明)
2. 仓库维护
git gc
- 功能:垃圾回收,优化仓库
- 常用用法:
git gc --auto
自动垃圾回收git gc --aggressive
更积极的垃圾回收git gc --prune=now
立即清理对象
- 错误解决方案:仓库损坏时尝试
git fsck
检查
git fsck
- 功能:检查仓库完整性
- 常用用法:
git fsck
全面检查git fsck --lost-found
查找孤立对象git fsck --full
深度检查
- 错误解决方案:发现问题用
git reflog
恢复丢失的提交
git reflog
- 功能:记录引用变化
- 常用用法:
git reflog
查看引用历史git reflog show HEAD
查看HEAD历史git checkout @{1}
检出历史状态git reset --hard HEAD@{1}
重置到历史状态
- 错误解决方案:丢失提交时用
git cherry-pick $(git reflog show HEAD | grep 'commit:' | awk '{print $1}')
3. 归档与导出
git archive
- 功能:创建归档文件
- 常用用法:
git archive --format=zip HEAD > archive.zip
创建ZIP归档git archive --format=tar HEAD > archive.tar
创建TAR归档git archive --prefix='project/' HEAD > archive.tar
添加前缀
- 错误解决方案:包含子模块用
--format=zip --add-to-archive
git bundle
- 功能:创建可分发的仓库包
- 常用用法:
git bundle create bundle.git HEAD~10..HEAD
创建10次提交的包git bundle verify bundle.git
验证包git clone bundle.git
从包克隆
- 错误解决方案:包损坏时用
git bundle verify
检查
八、常见问题解决方案
1. 远程推送失败
错误:! [rejected] master -> master (fetch first)
原因:远程仓库有更新,本地需要先获取
解决方案:
git fetch origin
git pull origin master
git push origin master
2. 合并冲突无法解决
错误:CONFLICT (content): Merge conflict in file.txt
解决方案:
# 编辑冲突文件解决冲突
git add file.txt
git pull origin master
3. 提交历史混乱
错误:提交历史不连续或包含敏感信息
解决方案:
# 使用交互式变基清理历史
git checkout -b temp-rebase
git rebase -i HEAD~10
# 标记要删除或修改的提交
git push --force-with-lease origin master
4. 分支删除失败
错误:error: The branch 'feature' is not fully merged.
解决方案:
# 确认分支已合并
git branch --merged
# 强制删除
git branch -D feature
# 或先合并再删除
git checkout master
git merge feature
git branch -d feature
5. 子模块不同步
错误:fatal: reference isn't a tree: <hash>
解决方案:
git submodule update --init --recursive
# 或重置子模块
git submodule deinit -f .
git submodule update --init --recursive
九、Git工作流建议
1. 个人开发工作流
# 初始化项目
git init
git add .
git commit -m "Initial commit"
# 创建开发分支
git checkout -b feature/new-feature
# 开发过程中
git add .
git commit -m "Add feature X"
# 定期同步
git fetch origin
git rebase origin/master
# 完成后合并
git checkout master
git merge --no-ff feature/new-feature
git push origin master
2. 团队协作工作流
# 获取最新代码
git fetch origin
git checkout master
git pull origin master
# 创建新分支
git checkout -b feature/new-feature
# 开发完成后
git push -u origin feature/new-feature
# 创建Pull Request
# 在代码审查后
git pull origin feature/new-feature
git checkout master
git merge feature/new-feature
git push origin master