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: 修复 bug
  • docs: 文档变更
  • 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 协作建议

  1. 推送前先拉取: git pull --rebase
  2. 避免强制推送: 使用 --force-with-lease
  3. 及时同步: 定期 fetch 远程更新
  4. 代码审查: 使用 Pull Request
  5. 清晰的提交消息: 说明为什么改,而不是改了什么

十、速查表

常用命令速查

# 日常工作流程
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 是一个强大的版本控制工具,掌握其常用操作能显著提高开发效率。建议:

  1. 多练习: 在个人项目中尝试各种操作
  2. 理解原理: 不仅记住命令,更要理解背后的概念
  3. 善用帮助: git help <command> 查看详细文档
  4. 保持整洁: 定期清理无用分支和提交
  5. 备份重要数据: 特别是使用 --hard 等危险操作时

记住:Git 很强大,但也很容易出错。不确定时,先备份!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐