Git 总结(十五)

15.总结

一、基础配置与仓库创建

1.1 用户信息(必须配置)

git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
  • --global 表示全局配置,去掉则只对当前仓库生效。

1.2 其他常用配置

git config --global core.editor "code --wait"   # 设置编辑器为 VS Code
git config --global merge.tool vimdiff          # 设置差异分析工具
git config --list                                # 查看所有配置

1.3 创建/克隆仓库

命令 说明
git init 在当前目录初始化新仓库
git init <dir> 在指定目录初始化
git clone <url> 克隆远程仓库到本地
git clone <url> <dir> 克隆到指定目录

初始化后会自动生成 .git 目录(版本库),不要手动修改其中内容。

二、基本操作(工作区 ↔ 暂存区 ↔ 版本库)

2.1 查看状态

git status           # 查看工作区和暂存区状态
git status -s        # 简洁模式

2.2 添加与提交

git add <file>          # 将文件添加到暂存区
git add .               # 添加所有更改(包括新文件、修改、删除)
git add -p              # 交互式暂存(按块选择)
git commit -m "msg"     # 将暂存区内容提交到本地仓库
git commit -a -m "msg"  # 跳过暂存区,直接提交所有已跟踪文件的修改

2.3 比较差异

git diff             # 工作区 vs 暂存区
git diff --cached    # 暂存区 vs 最近一次提交(HEAD)
git diff HEAD        # 工作区 vs 最近一次提交

2.4 删除与移动

git rm <file>           # 删除工作区文件并移除出暂存区
git rm --cached <file>  # 仅从暂存区删除,保留工作区文件
git mv <old> <new>      # 移动或重命名文件(等效于 rm + add)

三、分支管理

3.1 查看分支

git branch           # 列出本地分支(* 表示当前分支)
git branch -r        # 列出远程分支
git branch -a        # 列出所有(本地+远程)

3.2 创建与切换

git branch <name>        # 创建分支(不切换)
git checkout <name>      # 切换分支
git checkout -b <name>   # 创建并切换
# Git 2.23+ 推荐
git switch <name>        # 切换分支
git switch -c <name>     # 创建并切换

3.3 合并分支

git checkout target      # 切换到目标分支(如 main)
git merge source         # 将 source 分支合并到当前分支
  • 合并冲突处理:手动编辑冲突文件(删除 <<<<<<<​、=======​、>>>>>>>​ 标记) → git add​ → git commit

3.4 删除分支

git branch -d <name>     # 删除已合并的本地分支
git branch -D <name>     # 强制删除未合并分支
git push origin --delete <name>  # 删除远程分支

3.5 分支合并模式

  • git merge --no-ff:禁用快进合并,生成合并提交(保留分支历史)。
  • 默认快进合并(--ff)仅移动指针,不产生新提交。

四、查看提交历史

4.1 git log

git log                               # 完整历史
git log --oneline                     # 一行显示
git log --graph --oneline --decorate  # 图形化显示分支结构
git log -n 5                          # 最近5次
git log --author="name"               # 按作者过滤
git log --since="2024-01-01" --until="2024-12-31"
git log --grep="fix"                  # 按提交信息过滤
git log --no-merges                   # 不显示合并提交

4.2 git blame

git blame <file>           # 逐行显示文件的修改者、提交哈希、时间
git blame -L 10,20 <file>  # 只显示第10-20行

五、远程仓库

5.1 管理远程

git remote -v                    # 查看远程仓库地址
git remote add <name> <url>      # 添加远程仓库(通常 name=origin)
git remote rm <name>             # 删除远程仓库关联
git remote rename <old> <new>    # 重命名

5.2 拉取与推送

git fetch <remote>               # 下载远程更新,不自动合并
git merge <remote>/<branch>      # 合并远程分支到当前分支
git pull <remote> <branch>       # fetch + merge 一步完成
git push <remote> <branch>       # 推送本地分支到远程
git push -u <remote> <branch>    # 推送并建立追踪关系(上游)
git push --all <remote>          # 推送所有分支
git push --tags                  # 推送所有标签

注意git push​ 默认只推送当前分支,需设置 push.default​ 或使用 --all

六、标签(Tag)

6.1 创建标签

git tag <tagname>                  # 轻量标签
git tag -a <tagname> -m "message"  # 附注标签(推荐)
git tag -a <tagname> <commit>      # 为历史提交打标签

6.2 查看与推送

git tag                          # 列出所有标签
git show <tagname>               # 查看标签详情
git push origin <tagname>        # 推送单个标签
git push origin --tags           # 推送所有标签

6.3 删除标签

git tag -d <tagname>                # 删除本地标签
git push origin --delete <tagname>  # 删除远程标签

七、进阶操作

7.1 临时保存工作现场(stash)

git stash                        # 保存当前修改(包括暂存区)
git stash save "message"         # 带说明保存
git stash list                   # 列出所有 stash
git stash apply                  # 应用最近的 stash(不删除)
git stash pop                    # 应用并删除最近的 stash
git stash drop stash@{n}         # 删除指定 stash
git stash clear                  # 清空所有 stash

7.2 变基(rebase)

git rebase <base>                # 将当前分支的提交变基到 base 分支之上
git rebase -i <commit>           # 交互式变基(可编辑、合并、删除提交)
# 交互式常用指令:pick, reword, edit, squash, fixup, drop

警告:不要对已推送到公共仓库的分支执行 rebase,会改写历史导致团队混乱。

7.3 拣选提交(cherry-pick)

git cherry-pick <commit>              # 将指定提交应用到当前分支
git cherry-pick <commit1> <commit2>   # 拣选多个
git cherry-pick -n <commit>           # 拣选但不自动提交(暂存到工作区)

7.4 交互式暂存(git add -p

  • 逐块选择要暂存的更改,可拆分块、手动编辑。

八、撤销与恢复

8.1 工作区/暂存区撤销

场景 命令
丢弃工作区中某个文件的修改 git checkout -- <file>​ 或 git restore <file>
将文件从暂存区撤出(但保留工作区修改) git reset HEAD <file>​ 或 git restore --staged <file>
同时丢弃工作区和暂存区的修改(危险) git checkout HEAD -- <file>

8.2 提交撤销

# 撤销最近一次提交,但保留修改在工作区(--soft 保留在暂存区,--mixed 默认保留在工作区)
git reset --soft HEAD~1
git reset --mixed HEAD~1   # 默认,保留工作区修改
git reset --hard HEAD~1    # ⚠️ 彻底丢弃修改,无法找回

# 创建新提交来撤销某次提交(安全,适合已推送的提交)
git revert <commit>

8.3 找回丢失的提交(reflog)

git reflog                  # 查看所有 HEAD 移动历史
git reset --hard HEAD@{n}   # 恢复到某个历史状态

九、注意事项与最佳实践

9.1 提交规范

  • 提交信息应简洁明了,通常使用 <类型>: <描述>​(如 feat: 添加登录功能)。
  • 每个提交应是一个逻辑单元,避免把多个不相关的修改混在一起。
  • 提交前使用 git status​ 和 git diff 确认修改内容。

9.2 分支策略

  • 主分支main​/master)应保持稳定,仅通过合并(而非直接提交)更新。
  • 开发新功能使用功能分支feature/xxx),完成后合并回开发分支。
  • 紧急修复使用修复分支hotfix/xxx​),从 main​ 分出,修复后合并回 main 和开发分支。
  • 不要向已推送的公共分支执行 rebase

9.3 远程协作

  • 推送前先 git pull 拉取最新更改,避免覆盖他人提交。
  • 解决冲突后务必 git add​ 标记为已解决,再 git commit​(合并提交)或 git rebase --continue
  • 不要强制推送(git push --force),除非你完全清楚后果(会覆盖远程历史)。

9.4 安全性

  • .git 目录包含完整历史,不要直接删除或修改其中的文件。
  • 敏感信息(密码、密钥)绝不要提交到仓库,应使用 .gitignore 忽略或环境变量/Secrets 管理。
  • 定期执行 git gc 优化本地仓库(Git 会自动执行,一般无需手动)。

9.5 其他实用技巧

  • .gitignore​:忽略不需要版本控制的文件(如 node_modules/​、.env)。
  • git config --global alias.<alias> '<command>'​:自定义命令别名,如 git config --global alias.co checkout
  • 使用 git help <command> 查看命令帮助。

十、常用命令速查表(按功能分类)

操作类别 常用命令
配置 git config --global user.name/email​,git config --list
初始化/克隆 git init​,git clone <url>
基本提交 git add .​,git commit -m "msg"​,git status​,git diff
分支 git branch​,git checkout -b <branch>​,git merge <branch>​,git branch -d <branch>
远程 git remote -v​,git push origin <branch>​,git pull origin <branch>
历史查看 git log --oneline --graph​,git blame <file>
标签 git tag -a <tag> -m "msg"​,git push --tags
暂存 git stash​,git stash pop
撤销 git reset HEAD <file>​,git checkout -- <file>​,git revert <commit>
变基/拣选 git rebase <base>​,git cherry-pick <commit>