Git 常用操作完全指南
·
Git 常用操作完全指南
目录
一、Git 基础概念
1.1 Git 工作区域
- 工作区 (Working Directory): 你正在编辑的文件
- 暂存区 (Staging Area/Index): 准备提交的文件快照
- 本地仓库 (Local Repository): 已提交的版本历史
- 远程仓库 (Remote Repository): 服务器上的代码仓库
1.2 文件状态
- 未跟踪 (Untracked): 新文件,未被 Git 管理
- 已修改 (Modified): 文件被修改但未暂存
- 已暂存 (Staged): 文件已添加到暂存区
- 已提交 (Committed): 文件已保存到本地仓库
二、初始化与上传仓库
2.1 初始化本地仓库
# 在当前目录初始化 Git 仓库
git init
# 查看当前仓库状态
git status
# 配置用户信息(全局配置)
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 查看配置
git config --list
2.2 添加文件到暂存区
# 添加单个文件
git add filename.js
# 添加所有修改的文件
git add .
# 添加指定类型的文件
git add *.js
# 交互式添加(可以选择性地添加部分修改)
git add -i
2.3 提交到本地仓库
# 提交并添加消息
git commit -m "feat: 添加用户登录功能"
# 提交时跳过暂存区(仅适用于已跟踪的文件)
git commit -a -m "fix: 修复登录bug"
# 修改最后一次提交的消息
git commit --amend -m "新的提交消息"
# 修改最后一次提交(添加遗漏的文件)
git add forgotten-file.js
git commit --amend --no-edit
2.4 关联远程仓库并推送
# 添加远程仓库
git remote add origin https://github.com/username/repository.git
# 查看远程仓库
git remote -v
# 推送到远程仓库(首次推送需要设置上游分支)
git push -u origin main
# 后续推送
git push origin main
2.5 克隆远程仓库
# 克隆仓库
git clone https://github.com/username/repository.git
# 克隆到指定目录
git clone https://github.com/username/repository.git my-project
# 克隆指定分支
git clone -b develop https://github.com/username/repository.git
三、分支管理
3.1 查看分支
# 查看本地分支
git branch
# 查看所有分支(包括远程分支)
git branch -a
# 查看远程分支
git branch -r
# 查看分支的详细信息(最后提交等)
git branch -v
# 查看已合并的分支
git branch --merged
# 查看未合并的分支
git branch --no-merged
3.2 创建分支
# 创建新分支
git branch feature-login
# 创建并切换到新分支
git checkout -b feature-login
# 基于特定提交创建分支
git branch feature-login abc1234
# 基于远程分支创建本地分支
git checkout -b feature-login origin/feature-login
3.3 切换分支
# 切换到已有分支
git checkout feature-login
# 或使用新命令
git switch feature-login
# 切换回上一个分支
git checkout -
# 创建并切换(同上)
git switch -c feature-login
3.4 删除分支
# 删除本地分支(必须先切换到其他分支)
git branch -d feature-login
# 强制删除本地分支(即使未合并)
git branch -D feature-login
# 删除远程分支
git push origin --delete feature-login
# 清理已删除的远程分支引用
git fetch --prune
3.5 合并分支
# 切换到目标分支
git checkout main
# 合并 feature 分支到当前分支
git merge feature-login
# 合并不创建合并提交(快进合并)
git merge --ff-only feature-login
# 合并时创建合并提交(即使可以快进)
git merge --no-ff feature-login -m "merge: 合并登录功能"
# 解决冲突后继续合并
git add .
git commit
3.6 变基(Rebase)
# 将当前分支变基到 main
git rebase main
# 交互式变基(可以压缩、修改提交)
git rebase -i HEAD~3
# 中止变基
git rebase --abort
# 继续变基(解决冲突后)
git rebase --continue
3.7 分支保护策略
# 查看分支保护规则(需要在 GitHub/GitLab 等平台设置)
# 通常保护主分支,禁止直接推送
git push origin main # 会被拒绝
# 正确做法:通过 Pull Request/Merge Request
四、暂存区操作
4.1 查看暂存状态
# 查看详细状态
git status
# 简洁状态
git status -s
# 查看暂存区的文件
git diff --cached
# 查看暂存区与仓库的差异
git diff --staged
4.2 从暂存区移除文件
# 从暂存区移除(保留工作区文件)
git reset HEAD filename.js
# 从暂存区移除所有文件
git reset HEAD .
# 停止跟踪文件但保留在磁盘
git rm --cached filename.js
4.3 Git Stash(临时保存)
# 保存当前工作进度
git stash
# 保存并添加消息
git stash save "WIP: 未完成的功能"
# 包含未跟踪的文件
git stash -u
# 包含忽略的文件
git stash -a
# 查看所有暂存的进度
git stash list
# 应用最新的暂存(不删除)
git stash apply
# 应用指定的暂存
git stash apply stash@{2}
# 应用并删除暂存
git stash pop
# 删除指定的暂存
git stash drop stash@{1}
# 清空所有暂存
git stash clear
# 查看暂存的详细内容
git stash show -p stash@{0}
# 从暂存创建分支
git stash branch new-branch stash@{0}
4.4 部分暂存
# 交互式选择要暂存的代码块
git add -p
# 或
git add --patch
# 会显示每个修改的代码块,可以选择:
# y - 暂存这个代码块
# n - 不暂存
# s - 分割成更小的代码块
# e - 手动编辑
# q - 退出
五、撤销与回滚
5.1 撤销工作区的修改
# 撤销单个文件的修改
git checkout -- filename.js
# 或使用新命令
git restore filename.js
# 撤销所有文件的修改
git checkout -- .
# 注意:这会永久丢失未提交的修改!
5.2 撤销暂存区的文件
# 从暂存区撤销(保留工作区修改)
git reset HEAD filename.js
# 或使用新命令
git restore --staged filename.js
# 撤销所有暂存的文件
git reset HEAD .
5.3 修改最后一次提交
# 修改提交消息
git commit --amend -m "新的提交消息"
# 添加遗漏的文件到上次提交
git add forgotten-file.js
git commit --amend --no-edit
# 修改作者信息
git commit --amend --author="New Author <email@example.com>"
5.4 撤销提交(Reset)
# 软重置:撤销提交,保留暂存区和工作区
git reset --soft HEAD~1
# 混合重置(默认):撤销提交和暂存,保留工作区
git reset --mixed HEAD~1
git reset HEAD~1 # 等同于 mixed
# 硬重置:撤销提交、暂存和工作区(危险!)
git reset --hard HEAD~1
# 重置到特定提交
git reset --hard abc1234
# 重置到远程分支状态
git reset --hard origin/main
5.5 还原提交(Revert)
# 创建一个新的提交来撤销之前的提交(安全,推荐用于已推送的提交)
git revert HEAD
# 撤销特定的提交
git revert abc1234
# 撤销多个提交
git revert HEAD~3..HEAD
# 撤销合并提交
git revert -m 1 abc1234
# 中止还原
git revert --abort
5.6 清理未跟踪的文件
# 预览将要删除的文件
git clean -n
# 删除未跟踪的文件
git clean -f
# 删除未跟踪的文件和目录
git clean -fd
# 删除未跟踪的文件、目录和忽略的文件
git clean -fdx
# ⚠️ 警告:这些操作不可逆!
5.7 恢复丢失的提交
# 查看 reflog(引用日志)
git reflog
# 找到丢失的提交哈希后恢复
git reset --hard abc1234
# 或创建新分支指向该提交
git branch recovered-branch abc1234
# 查找悬空的提交
git fsck --lost-found
六、远程仓库操作
6.1 管理远程仓库
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add origin https://github.com/user/repo.git
# 重命名远程仓库
git remote rename origin upstream
# 删除远程仓库
git remote remove origin
# 修改远程仓库 URL
git remote set-url origin https://github.com/user/new-repo.git
6.2 拉取和获取
# 从远程仓库获取最新代码(不合并)
git fetch origin
# 获取所有远程仓库
git fetch --all
# 获取并合并(等于 fetch + merge)
git pull origin main
# 获取并变基(等于 fetch + rebase)
git pull --rebase origin main
# 拉取特定分支
git pull origin feature-login
6.3 推送代码
# 推送到远程分支
git push origin main
# 推送并设置上游分支
git push -u origin main
# 强制推送(危险!会覆盖远程历史)
git push --force origin main
# 更安全的强制推送(如果远程有新提交则拒绝)
git push --force-with-lease origin main
# 推送标签
git push origin --tags
# 删除远程分支
git push origin --delete feature-login
6.4 跟踪远程分支
# 查看跟踪关系
git branch -vv
# 设置上游分支
git branch --set-upstream-to=origin/main main
# 或简写
git branch -u origin/main
# 创建并跟踪远程分支
git checkout -b feature origin/feature
七、标签管理
7.1 创建标签
# 创建轻量标签
git tag v1.0.0
# 创建附注标签(推荐)
git tag -a v1.0.0 -m "Release version 1.0.0"
# 给特定提交打标签
git tag -a v1.0.0 abc1234 -m "Release version 1.0.0"
7.2 查看和管理标签
# 查看所有标签
git tag
# 查看匹配模式的标签
git tag -l "v1.*"
# 查看标签详情
git show v1.0.0
# 删除本地标签
git tag -d v1.0.0
# 推送标签到远程
git push origin v1.0.0
# 推送所有标签
git push origin --tags
# 删除远程标签
git push origin --delete v1.0.0
八、实用技巧
8.1 查看历史记录
# 查看提交历史
git log
# 简洁的单行显示
git log --oneline
# 图形化显示分支合并
git log --graph --oneline --all
# 查看最近 n 条提交
git log -n 5
# 查看某个作者的提交
git log --author="John Doe"
# 查看某个文件的修改历史
git log --follow -- filename.js
# 查看每次提交的改动统计
git log --stat
# 搜索提交消息
git log --grep="bug fix"
# 查看两个提交之间的差异
git log v1.0.0..v2.0.0
8.2 查看差异
# 查看工作区和暂存区的差异
git diff
# 查看暂存区和仓库的差异
git diff --cached
git diff --staged
# 查看两个提交之间的差异
git diff abc1234 def5678
# 查看某个文件的差异
git diff filename.js
# 查看统计信息
git diff --stat
# 只查看文件名变化
git diff --name-only
8.3 cherry-pick(拣选提交)
# 将其他分支的某个提交应用到当前分支
git cherry-pick abc1234
# 拣选多个提交
git cherry-pick abc1234 def5678
# 拣选连续范围的提交
git cherry-pick abc1234^..def5678
# 中止 cherry-pick
git cherry-pick --abort
# 继续 cherry-pick(解决冲突后)
git cherry-pick --continue
8.4 子模块(Submodule)
# 添加子模块
git submodule add https://github.com/user/repo.git libs/repo
# 初始化子模块
git submodule init
# 更新子模块
git submodule update
# 克隆包含子模块的仓库
git clone --recursive https://github.com/user/repo.git
# 更新所有子模块
git submodule update --remote --merge
8.5 Git Hooks
# Git Hooks 位于 .git/hooks/ 目录
# 常见的 hooks:
# - pre-commit: 提交前执行
# - commit-msg: 验证提交消息
# - pre-push: 推送前执行
# - post-merge: 合并后执行
# 示例:创建 pre-commit hook
echo '#!/bin/sh
echo "Running tests..."
npm test' > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
8.6 忽略文件(.gitignore)
# 创建 .gitignore 文件
touch .gitignore
# 常见忽略规则
echo "# Dependencies
node_modules/
dist/
# Environment variables
.env
.env.local
# IDE
.vscode/
.idea/
# OS files
.DS_Store
Thumbs.db
# Logs
*.log
npm-debug.log*
# Build output
build/
out/" > .gitignore
# 对已经跟踪的文件生效,需要先清除缓存
git rm -r --cached .
git add .
git commit -m "chore: update .gitignore"
8.7 别名配置
# 配置常用别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.last 'log -1 HEAD'
git config --global alias.visual '!gitk'
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
# 使用别名
git co main # 等同于 git checkout main
git st # 等同于 git status
git lg # 漂亮的日志显示
8.8 常见问题解决
# 1. 合并冲突解决
git status # 查看冲突文件
# 手动编辑解决冲突
git add resolved-file.js # 标记为已解决
git commit # 完成合并
# 2. 放弃合并
git merge --abort
# 3. 放弃变基
git rebase --abort
# 4. 修复错误的提交作者
git commit --amend --author="Correct Name <email@example.com>"
# 5. 分离 HEAD 状态
git checkout -b new-branch # 创建新分支保存工作
# 6. 大文件处理
git lfs install # 安装 Git LFS
git lfs track "*.psd" # 跟踪大文件类型
8.9 Git 工作流建议
Git Flow 工作流
# 主要分支
main/master # 生产环境代码
develop # 开发环境代码
# 临时分支
feature/* # 功能分支
release/* # 发布分支
hotfix/* # 热修复分支
GitHub Flow 工作流
# 简化版
main # 主分支
feature/* # 功能分支,通过 PR 合并
8.10 性能优化
# 清理无效的远程追踪分支
git remote prune origin
# 垃圾回收
git gc --prune=now
# 压缩仓库
git repack -a -d --depth=250 --window=250
# 查看仓库大小
git count-objects -vH
九、最佳实践
9.1 提交规范
遵循 Conventional Commits 规范:
<type>(<scope>): <subject>
<body>
<footer>
Type 类型:
feat: 新功能fix: 修复 bugdocs: 文档变更style: 代码格式(不影响功能)refactor: 重构test: 测试相关chore: 构建过程或辅助工具变动
示例:
git commit -m "feat(auth): 添加用户登录功能
- 实现用户名密码登录
- 添加 JWT token 验证
- 支持记住登录状态
Closes #123"
9.2 分支命名规范
feature/user-authentication # 功能分支
fix/login-bug # 修复分支
release/v1.0.0 # 发布分支
hotfix/critical-security # 热修复分支
9.3 提交频率
- 小而频繁的提交
- 每个提交完成一个独立的功能点
- 确保每次提交后代码可运行
- 提交前运行测试
9.4 协作建议
- 推送前先拉取:
git pull --rebase - 避免强制推送: 使用
--force-with-lease - 及时同步: 定期 fetch 远程更新
- 代码审查: 使用 Pull Request
- 清晰的提交消息: 说明为什么改,而不是改了什么
十、速查表
常用命令速查
# 日常工作流程
git status # 查看状态
git add . # 添加所有修改
git commit -m "message" # 提交
git pull --rebase # 拉取并变基
git push # 推送
# 分支操作
git branch # 查看分支
git checkout -b feature # 创建并切换分支
git merge feature # 合并分支
git branch -d feature # 删除分支
# 查看历史
git log --oneline --graph # 图形化日志
git diff # 查看差异
git show abc1234 # 查看提交详情
# 撤销操作
git restore file # 撤销工作区修改
git restore --staged file # 撤销暂存
git reset --hard HEAD~1 # 回退一次提交(谨慎)
git revert abc1234 # 安全地撤销提交
# 临时保存
git stash # 保存进度
git stash pop # 恢复进度
结语
Git 是一个强大的版本控制工具,掌握其常用操作能显著提高开发效率。建议:
- 多练习: 在个人项目中尝试各种操作
- 理解原理: 不仅记住命令,更要理解背后的概念
- 善用帮助:
git help <command>查看详细文档 - 保持整洁: 定期清理无用分支和提交
- 备份重要数据: 特别是使用
--hard等危险操作时
记住:Git 很强大,但也很容易出错。不确定时,先备份!
更多推荐
所有评论(0)