文章目录
-
- [Git 实战指南:从多账户配置到日常高频命令](#Git 实战指南:从多账户配置到日常高频命令)
- [一、多 SSH 账户配置](#一、多 SSH 账户配置)
-
- [1. 生成独立密钥对](#1. 生成独立密钥对)
- [2. 配置 `~/.ssh/config` 文件](#2. 配置
~/.ssh/config文件) - [3. 验证连接](#3. 验证连接)
- [二、Git 基础常用命令](#二、Git 基础常用命令)
-
- [1. `git init` --- 初始化本地仓库](#1.
git init— 初始化本地仓库) - [2. `git clone` --- 克隆远程仓库](#2.
git clone— 克隆远程仓库) - [3. `git add` --- 添加文件到暂存区](#3.
git add— 添加文件到暂存区) - [4. `git commit` --- 提交暂存区到本地仓库](#4.
git commit— 提交暂存区到本地仓库) -
- [Commit Message 规范(推荐)](#Commit Message 规范(推荐))
- [5. `git status` --- 查看仓库状态](#5.
git status— 查看仓库状态) - [6. `git diff` --- 查看文件修改差异](#6.
git diff— 查看文件修改差异) - [7. `git log` --- 查看提交历史](#7.
git log— 查看提交历史) - [8. `git reset` --- 版本回退](#8.
git reset— 版本回退) - [9. `git reflog` --- 查看所有操作历史](#9.
git reflog— 查看所有操作历史) - [10. `git revert` --- 安全撤销已推送的提交](#10.
git revert— 安全撤销已推送的提交) - [11. `git restore` / `git checkout` --- 撤销文件修改](#11.
git restore/git checkout— 撤销文件修改) - [12. `git rm` --- 删除仓库内文件](#12.
git rm— 删除仓库内文件)
- [1. `git init` --- 初始化本地仓库](#1.
- 三、分支管理
-
- [1. 查看分支](#1. 查看分支)
- [2. 创建和切换分支](#2. 创建和切换分支)
- [3. 合并分支](#3. 合并分支)
- [4. 删除分支](#4. 删除分支)
- 四、远程仓库协作
-
- [1. 管理远程仓库](#1. 管理远程仓库)
- [2. 推送和拉取](#2. 推送和拉取)
- [3. 处理冲突](#3. 处理冲突)
- 五、实用进阶命令
-
- [1. `git stash` --- 临时保存工作区](#1.
git stash— 临时保存工作区) - [2. `git tag` --- 版本标签](#2.
git tag— 版本标签) - [3. `git cherry-pick` --- 摘取特定提交](#3.
git cherry-pick— 摘取特定提交) - [4. `git blame` --- 逐行追溯修改者](#4.
git blame— 逐行追溯修改者)
- [1. `git stash` --- 临时保存工作区](#1.
- [六、`.gitignore` 配置](#六、
.gitignore配置) - 七、实用技巧与避坑指南
-
- [1. 修改最近一次 commit 的信息](#1. 修改最近一次 commit 的信息)
- [2. 配置常用别名](#2. 配置常用别名)
- [3. 查看漂亮的提交图](#3. 查看漂亮的提交图)
- [4. 行尾符号问题(CRLF vs LF)](#4. 行尾符号问题(CRLF vs LF))
- [5. 误删文件恢复](#5. 误删文件恢复)
- 附录:命令速查表
Git 实战指南:从多账户配置到日常高频命令
本文覆盖 Git 多 SSH 账户配置、日常开发中最常用的命令,以及踩过坑之后总结的实战技巧。适合有一定基础、想要系统梳理 Git 工作流的开发者。
一、多 SSH 账户配置
日常开发中经常需要同时使用 GitHub、GitLab、Gitee 等多个代码托管平台,每个平台对应不同的 SSH 密钥。下面介绍如何在一台机器上配置多套 SSH 账户,实现无感切换。
1. 生成独立密钥对
为每个平台生成单独的密钥,注意用 -f 指定文件名来区分:
bash
# GitHub 密钥
ssh-keygen -t rsa -C 'your_github_email@example.com' -f ~/.ssh/id_rsa_github
# GitLab 密钥
ssh-keygen -t rsa -C 'your_gitlab_email@example.com' -f ~/.ssh/id_rsa_gitlab
# Gitee 密钥
ssh-keygen -t rsa -C 'your_gitee_email@example.com' -f ~/.ssh/id_rsa_gitee
生成后会得到对应的公钥文件(.pub),将公钥内容复制到各平台的 SSH Keys 设置页面即可。
Windows 用户提示 :如果你使用的是 Git Bash,路径写法与 Linux/macOS 一致(
~/.ssh/)。如果使用 PowerShell 或 CMD,实际路径为C:\Users\<用户名>\.ssh\。
2. 配置 ~/.ssh/config 文件
在 ~/.ssh 目录下创建(或编辑)config 文件,为每个平台指定别名和对应的密钥:
ssh-config
# GitHub
Host github
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_github
IdentitiesOnly yes
# GitLab
Host gitlab
HostName gitlab.mygitlab.com
User git
IdentityFile ~/.ssh/id_rsa_gitlab
IdentitiesOnly yes
# Gitee
Host gitee
HostName gitee.com
User git
IdentityFile ~/.ssh/id_rsa_gitee
IdentitiesOnly yes
配置字段说明
| 字段 | 含义 |
|---|---|
Host |
自定义别名,后续 clone/push 时使用该别名替换域名 |
HostName |
代码托管平台的真实域名 |
User |
SSH 用户名,Git 平台统一使用 git(不是平台登录用户名) |
IdentityFile |
对应平台私钥文件的路径 |
IdentitiesOnly yes |
强制只使用指定密钥,避免 SSH Agent 干扰 |
3. 验证连接
bash
# 测试 GitHub 连接
ssh -T git@github.com
# 成功时返回:Hi hello! You've successfully authenticated...
# 测试 GitLab 连接
ssh -T git@gitlab.com
二、Git 基础常用命令
1. git init --- 初始化本地仓库
bash
mkdir my-project
cd my-project
git init
执行后会在当前目录创建 .git 隐藏文件夹,存放版本控制的全部元数据。
2. git clone --- 克隆远程仓库
bash
# 基本克隆
git clone git@github.com:user/repo.git
# 指定本地目录名
git clone git@github.com:user/repo.git my-folder
# 只克隆最新一次提交(浅克隆,适合大仓库)
git clone --depth 1 git@github.com:user/repo.git
3. git add --- 添加文件到暂存区
bash
# 添加单个文件
git add README.md
# 添加多个文件
git add sb1.txt sb2.txt
# 添加当前目录所有变更
git add .
4. git commit --- 提交暂存区到本地仓库
bash
# 基本提交(必须带 -m 参数)
git commit -m "feat: XXXXX"
# 会自动暂存所有已跟踪且被修改的文件,但不会包含新创建的未跟踪文件
git commit -am "fix: XXXXX"
注意 :
git commit不直接接文件名。流程是先git add再git commit,或者用-a标志自动暂存已跟踪的文件变更。
Commit Message 规范(推荐)
采用 Conventional Commits 格式,方便生成 Changelog 和团队协作:
feat: 新功能
fix: 修复 bug
docs: 文档变更
style: 代码格式(不影响逻辑)
refactor: 重构(非新功能、非修复)
perf: 性能优化
test: 测试相关
chore: 构建/工具/依赖变更
5. git status --- 查看仓库状态
bash
git status
# 精简输出(只显示文件名和状态码)
git status -s
输出会用颜色区分:绿色 = 已暂存,红色 = 未暂存的修改,未跟踪文件显示为 Untracked。
6. git diff --- 查看文件修改差异
bash
# 工作区 vs 暂存区(还没 add 的修改)
git diff
# 暂存区 vs 最近一次提交(已 add 还没 commit 的内容)
git diff --cached
# 对比两个分支
git diff main..dev
# 对比两个 commit
git diff abc123 def456
7. git log --- 查看提交历史
bash
# 默认完整日志
git log
# 单行精简格式
git log --oneline
# 带分支图谱
git log --oneline --graph --all
# 查看某个文件的提交历史
git log --follow -p README.md
# 查看某个作者的提交
git log --author="hello"
# 查看最近 5 次提交
git log -5
8. git reset --- 版本回退
HEAD 代表当前版本;HEAD^ 上一版;HEAD^^ 上上版;HEAD~100 往上 100 个版本。
bash
# 回退到上一个版本,丢弃所有修改(慎用!)
git reset --hard HEAD^
# 回退到上一个版本,回退提交历史 + 清空暂存区,但保留工作区的修改(即修改变成"未暂存"状态)
git reset --mixed HEAD^
# 回退到上一个版本,保留修改在暂存区
git reset --soft HEAD^
# 根据 commit id 精准回退
git reset --hard 3ba5cdb7cf87
--hard会丢弃未提交的修改,操作前请确认。 如果误操作,可以用git reflog找回 commit id 后再次 reset。
9. git reflog --- 查看所有操作历史
包含已回退、已删除分支的提交记录,是"后悔药"的关键工具:
bash
git reflog
# 输出示例:
# abc1234 HEAD@{0}: reset: moving to HEAD^
# def5678 HEAD@{1}: commit: feat: 新增搜索功能
# 通过 reflog 找到 def5678,即可恢复
git reset --hard def5678
10. git revert --- 安全撤销已推送的提交
与 git reset 不同,git revert 不会改写历史,而是生成一个新的提交来"反向撤销"目标提交的变更。已经 push 到远程的提交,应该用 git revert 而非 git reset,避免改写团队共享的历史。
bash
# 撤销某次提交(自动生成一条反向提交)
git revert abc1234
# 撤销最近一次提交
git revert HEAD --no-edit
# 撤销一个范围的提交(从旧到新,不包含旧的那个)
git revert abc1234..def5678
# 只撤销某次提交中的部分文件变更
git revert abc1234 -- file.txt
reset vs revert 怎么选?
- 提交还没 push → 用 git reset,干净利落
- 提交已经 push → 用 git revert,不影响其他人
- 简单理解:reset 是"假装没发生过",revert 是"承认发生过,再做一次反向操作"
11. git restore / git checkout --- 撤销文件修改
bash
# 撤销工作区的修改(恢复到暂存区或最近一次 commit 的状态)
git restore file.txt # Git 2.23+ 推荐写法
git checkout -- file.txt # 兼容旧版本的写法 -- 用于区分"分支名"和"文件名"。
# 从暂存区移除文件(撤销 git add,但保留工作区修改)
git restore --staged file.txt
git reset HEAD file.txt # 等价写法
Git 2.23 起推荐用
git restore,语义更清晰。git checkout承担了太多职责(切换分支、撤销文件、合并冲突等),容易混淆。
12. git rm --- 删除仓库内文件
bash
# 从仓库和工作区同时删除
git rm file.txt
# 仅从仓库删除(保留本地文件,常用于误提交的文件)
git rm --cached file.txt
# 批量删除
git rm -r src/deprecated/
三、分支管理
分支是 Git 最强大的特性之一,掌握分支操作是团队协作的基础。
1. 查看分支
bash
# 本地分支
git branch
# 远程分支
git branch -r
# 所有分支
git branch -a
2. 创建和切换分支
bash
# 创建新分支
git branch feature/login
# 切换到该分支
git checkout feature/login
# 一步到位:创建并切换(推荐)
git checkout -b feature/login
# Git 2.23+ 推荐写法
git switch -c feature/login
3. 合并分支
bash
# 切回主分支
git switch main
# 将 feature/login 合并到 main
git merge feature/login
# 始终创建合并提交,保留分支合并记录(推荐团队协作)
git merge feature/login --no-ff
# 如果想要线性提交历史(个人开发/小团队),使用 rebase
git switch feature/login
git rebase main
git switch main
git merge feature/login
4. 删除分支
bash
# 删除已合并的本地分支
git branch -d feature/login
# 强制删除未合并的本地分支
git branch -D feature/login
# 删除远程分支
git push origin --delete feature/login
四、远程仓库协作
1. 管理远程仓库
bash
# 查看已关联的远程仓库
git remote -v
# 添加远程仓库
git remote add origin git@github.com:user/repo.git
# 修改远程仓库地址
git remote set-url origin git@github.com:user/new-repo.git
2. 推送和拉取
bash
# 推送当前分支到远程(首次推送需关联上游分支)
git push -u origin feature/login
# 后续推送(已关联上游分支后可简写)
git push
# 拉取远程更新并合并
git pull
# 等价于 fetch + merge(更安全的方式)
git fetch origin
git merge origin/<当前分支名>
git merge origin/feature/login
# 拉取指定分支
git pull origin dev
3. 处理冲突
当 pull 或 merge 出现冲突时,Git 会在冲突文件中标记:
<<<<<<< HEAD
当前分支的内容
=======
合并过来的内容
>>>>>>> feature/login
手动编辑文件保留需要的内容,删除冲突标记后:
bash
git add conflicted-file.txt
git commit -m "fix: 解决合并冲突"
五、实用进阶命令
1. git stash --- 临时保存工作区
开发中经常遇到"代码改了一半,突然要切分支修 bug"的情况:
bash
# 暂存当前修改
git stash
# 暂存并附带说明
git stash push -m "开发到一半的搜索功能"
# 查看暂存列表
git stash list
# 恢复最近一次暂存(并从列表中移除)
git stash pop
# 恢复暂存但保留在列表中
git stash apply
# 恢复包含未跟踪文件的暂存
git stash --include-untracked
2. git tag --- 版本标签
bash
# 创建轻量标签
git tag v1.0.0
# 创建附注标签(推荐,包含作者、日期、备注信息)
git tag -a v1.0.0 -m "Release v1.0.0"
# 对历史 commit 打标签
git tag -a v0.9.0 abc1234 -m "Beta release"
# 推送标签到远程
git push origin v1.0.0
# 推送所有本地标签
git push origin --tags
# 删除远程标签
git push origin --delete v1.0.0
3. git cherry-pick --- 摘取特定提交
将一个分支的某个 commit 应用到另一个分支:
bash
git switch main
git cherry-pick abc1234
4. git blame --- 逐行追溯修改者
bash
# 查看文件每一行的最后修改者和对应 commit
git blame src/App.vue
# 只看某个行范围
git blame -L 10,30 src/App.vue
六、.gitignore 配置
在项目根目录创建 .gitignore 文件,声明不需要纳入版本控制的文件和目录:
gitignore
# 依赖
node_modules/
vendor/
# 构建产物
dist/
build/
*.min.js
# 编辑器和系统文件
.vscode/
.idea/
.DS_Store
Thumbs.db
# 环境变量(千万不要提交敏感信息)
.env
.env.local
.env.*.local
# 日志
*.log
logs/
# 临时文件
*.tmp
*.swp
如果文件已经被 Git 跟踪,
.gitignore不会生效。 需要先移除跟踪:
bashgit rm --cached -r node_modules/ git commit -m "chore: 移除误提交的 node_modules"
七、实用技巧与避坑指南
1. 修改最近一次 commit 的信息
bash
git commit --amend -m "feat: 修正提交信息"
这会改变 commit hash。如果已经 push 到远程,需要
git push --force才能同步,团队开发中慎用。
2. 配置常用别名
在 ~/.gitconfig 中添加别名,减少重复输入:
ini
[alias]
st = status
co = checkout
br = branch
ci = commit
lg = log --oneline --graph --all --decorate
unstage = reset HEAD --
last = log -1 HEAD
配置后就可以使用 git st、git co、git lg 等简写命令。
3. 查看漂亮的提交图
bash
# 安装 git-lg 别名,一键显示带分支图谱的提交历史
git config --global alias.lg "log --oneline --graph --all --decorate"
git lg
4. 行尾符号问题(CRLF vs LF)
Windows 和 Linux/macOS 使用不同的行尾符号,容易导致整个文件显示"已修改"。统一配置:
bash
# 提交时自动转换为 LF,检出时根据系统决定
git config --global core.autocrlf true # Windows 推荐
git config --global core.autocrlf input # macOS/Linux 推荐
或者在项目根目录添加 .gitattributes 文件,确保团队一致:
* text=auto eol=lf
*.bat text eol=crlf
5. 误删文件恢复
bash
# 恢复被 git rm 删除的文件
git checkout HEAD -- deleted-file.txt
# 如果已经 commit 了删除操作
git checkout HEAD^ -- deleted-file.txt
附录:命令速查表
| 场景 | 命令 |
|---|---|
| 初始化仓库 | git init |
| 克隆仓库 | git clone <url> |
| 查看状态 | git status -s |
| 添加所有变更 | git add . |
| 提交 | git commit -m "msg" |
| 创建并切换分支 | git switch -c <branch> |
| 合并分支 | git merge <branch> |
| 首次推送并关联上游 | git push -u origin <branch> |
| 拉取远程更新 | git pull |
| 暂存工作区 | git stash / git stash pop |
| 版本回退 | git reset --hard <commit> |
| 找回误操作 | git reflog |
| 撤销文件修改 | git restore <file> |
| 打标签 | git tag -a v1.0 -m "msg" |
| 查看提交图 | git lg(需配置别名) |