1. Git 命令行操作的必要性与基础准备
作为一个从业十年的开发者,我必须说:Git 命令行是每个程序员必须掌握的生存技能。虽然现在有各种图形化工具(如 SourceTree、GitHub Desktop),但当你遇到复杂场景、需要自动化处理或服务器环境时,命令行永远是最高效可靠的选择。
我见过太多同事在图形界面里点来点去解决不了问题,最后还是要靠命令行救场。更不用说在 CI/CD 流水线、服务器维护等场景,命令行几乎是唯一选择。
1.1 安装与环境配置
首先确保你的系统已安装 Git。以 Windows 为例(其他系统类似):
bash复制# 检查是否已安装
git --version
# 如果未安装,从官网下载:https://git-scm.com/downloads
# 安装时建议勾选"Add to PATH"选项
安装完成后,第一件事是配置用户信息:
bash复制git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
注意:这里的邮箱最好与你的代码托管平台(GitHub/GitLab等)账号一致,否则提交记录可能无法正确关联到你的账号。
我推荐做以下额外配置,能显著提升使用体验:
bash复制# 设置默认编辑器为VSCode(也可以换成你熟悉的编辑器)
git config --global core.editor "code --wait"
# 启用彩色输出
git config --global color.ui auto
# 设置默认分支名为main(符合现代规范)
git config --global init.defaultBranch main
1.2 命令行环境选择
不同系统下的命令行体验差异很大:
- Windows:建议使用 Git Bash(安装Git时自带)或 Windows Terminal
- Mac/Linux:系统自带的终端就很好用
我强烈推荐所有开发者都学会基本的命令行操作,比如:
cd切换目录ls查看文件列表pwd显示当前路径mkdir创建目录
这些命令在和 Git 配合使用时非常有用。比如当你想在特定目录初始化仓库时:
bash复制cd /path/to/your/project
git init
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 日常开发中的核心 Git 工作流
2.1 仓库初始化与克隆
开始一个新项目:
bash复制mkdir my-project
cd my-project
git init
克隆现有仓库(最常用):
bash复制git clone https://github.com/user/repo.git
专业提示:克隆时可以通过
--depth 1参数只克隆最新版本,节省时间和空间,适合大型仓库:bash复制git clone --depth 1 https://github.com/user/repo.git
2.2 基础文件操作
查看仓库状态(使用频率最高的命令):
bash复制git status
添加文件到暂存区:
bash复制git add filename.txt # 添加单个文件
git add . # 添加所有修改
git add *.js # 添加所有js文件
提交更改:
bash复制git commit -m "描述性的提交信息"
提交信息规范:我推荐使用 Conventional Commits 规范,格式为:
<type>(<scope>): <description>
例如:feat(auth): add login functionality
2.3 分支管理
创建并切换分支:
bash复制git checkout -b feature/new-login
查看分支:
bash复制git branch # 本地分支
git branch -a # 所有分支(包括远程)
切换分支:
bash复制git checkout main
合并分支(先切换到目标分支):
bash复制git checkout main
git merge feature/new-login
删除分支:
bash复制git branch -d feature/old-login # 安全删除(已合并)
git branch -D feature/broken # 强制删除(未合并)
3. 团队协作必备的高级技巧
3.1 远程仓库操作
添加远程仓库:
bash复制git remote add origin https://github.com/user/repo.git
查看远程仓库:
bash复制git remote -v
推送分支:
bash复制git push -u origin main # 第一次推送需要-u参数
git push # 之后可以简写
拉取更新:
bash复制git pull # 相当于 git fetch + git merge
注意:
git pull有时会产生意外的合并提交。更安全的方式是:bash复制git fetch git rebase origin/main
3.2 解决合并冲突
冲突是团队协作中不可避免的。当出现冲突时:
- 运行
git status查看冲突文件 - 打开冲突文件,会看到类似这样的标记:
text复制
<<<<<<< HEAD 你的代码 ======= 别人的代码 >>>>>>> branch-name - 手动编辑文件,保留需要的部分,删除冲突标记
- 标记冲突已解决:
bash复制
git add conflicted-file.txt git commit
3.3 储藏(Stash)临时更改
当你需要切换分支但当前修改还没准备好提交:
bash复制git stash # 储藏当前修改
git stash list # 查看储藏列表
git stash pop # 恢复最近一次储藏
更高级的用法:
bash复制git stash save "描述信息" # 带描述的储藏
git stash apply stash@{1} # 恢复特定储藏
git stash drop stash@{1} # 删除特定储藏
4. 高效问题排查与版本控制
4.1 查看历史记录
基本查看:
bash复制git log
更实用的格式:
bash复制git log --oneline --graph --decorate --all
我通常会给这个命令设置别名:
bash复制git config --global alias.lg "log --oneline --graph --decorate --all"
之后就可以用 git lg 查看漂亮的提交历史了。
4.2 比较差异
比较工作区和暂存区:
bash复制git diff
比较暂存区和最新提交:
bash复制git diff --cached
比较两个分支:
bash复制git diff branch1..branch2
4.3 撤销操作
撤销工作区修改(危险!不可恢复):
bash复制git checkout -- filename.txt
撤销暂存区修改(取消add):
bash复制git reset HEAD filename.txt
修改最后一次提交:
bash复制git commit --amend
注意:如果已经推送了提交,修改后需要使用
git push --force,但请谨慎使用,可能会影响其他协作者。
4.4 回退版本
软回退(保留更改在工作区):
bash复制git reset --soft HEAD~1
硬回退(彻底删除更改):
bash复制git reset --hard HEAD~1
回退到特定提交:
bash复制git reset --hard a1b2c3d
5. 高级场景与性能优化
5.1 子模块管理
添加子模块:
bash复制git submodule add https://github.com/user/repo.git path/to/submodule
克隆包含子模块的仓库:
bash复制git clone --recurse-submodules https://github.com/user/repo.git
更新子模块:
bash复制git submodule update --init --recursive
5.2 大文件存储(Git LFS)
安装Git LFS:
bash复制git lfs install
跟踪大文件:
bash复制git lfs track "*.psd"
git lfs track "*.zip"
之后像普通文件一样add和commit即可。
5.3 清理仓库
删除历史中的大文件(使用BFG Repo Cleaner):
bash复制java -jar bfg.jar --strip-blobs-bigger-than 100M my-repo.git
清理本地仓库:
bash复制git gc --aggressive --prune=now
5.4 二分查找问题提交
当出现bug但不确定是哪次提交引入时:
bash复制git bisect start
git bisect bad # 当前版本有问题
git bisect good v1.0 # v1.0版本是好的
# Git会自动切换到中间版本,你测试后标记good或bad
git bisect reset # 结束
6. 我的实战经验与避坑指南
6.1 必须遵守的黄金法则
- 频繁提交:小步快跑,每个提交只做一件事
- 写好提交信息:让同事(和未来的你)能理解每次更改的目的
- 先pull再push:避免冲突
- 不要强制推送到共享分支(main/develop等)
- 备份重要分支:在本地和远程都有副本
6.2 常见问题解决方案
问题1:fatal: not a git repository (or any of the parent directories): .git
解决方案:
bash复制cd /path/to/your/repo
# 或
git init
问题2:error: failed to push some refs
通常是因为远程有本地没有的提交,先pull:
bash复制git pull --rebase
git push
问题3:误删了未提交的代码
如果有git stash:
bash复制git stash list
git stash apply stash@{n}
如果没有,可以尝试:
bash复制git fsck --lost-found
6.3 我的效率技巧
-
使用别名:在
~/.gitconfig中添加:ini复制[alias] co = checkout br = branch ci = commit st = status unstage = reset HEAD -- last = log -1 HEAD -
交互式rebase:整理提交历史
bash复制
git rebase -i HEAD~5 -
重用提交信息:
bash复制
git commit -C HEAD@{1} -
查找引入某行代码的提交:
bash复制
git blame filename.txt -
搜索提交内容:
bash复制git log -S "search term"
6.4 推荐的工作流程
基于我的经验,推荐以下流程:
-
从最新main分支创建特性分支
bash复制
git checkout main git pull git checkout -b feature/xxx -
小步提交
bash复制git add . git commit -m "feat(xxx): implement core function" -
定期rebase到main分支
bash复制
git fetch origin git rebase origin/main -
解决可能的冲突
-
推送并创建合并请求
bash复制
git push -u origin feature/xxx -
代码审查后合并到main分支
这套流程保持了历史的整洁,减少了冲突,非常适合团队协作。
