Git实战:多账户配置与高频命令
文章目录
- Git 实战指南:从多账户配置到日常高频命令
- 一、多 SSH 账户配置
- 1. 生成独立密钥对
- 2. 配置 `~/.ssh/config` 文件
- 配置字段说明
- 3. 验证连接
- 二、Git 基础常用命令
- 1. `git init` — 初始化本地仓库
- 2. `git clone` — 克隆远程仓库
- 3. `git add` — 添加文件到暂存区
- 4. `git commit` — 提交暂存区到本地仓库
- Commit Message 规范(推荐)
- 5. `git status` — 查看仓库状态
- 6. `git diff` — 查看文件修改差异
- 7. `git log` — 查看提交历史
- 8. `git reset` — 版本回退
- 9. `git reflog` — 查看所有操作历史
- 10. `git revert` — 安全撤销已推送的提交
- 11. `git restore` / `git checkout` — 撤销文件修改
- 12. `git rm` — 删除仓库内文件
- 三、分支管理
- 1. 查看分支
- 2. 创建和切换分支
- 3. 合并分支
- 4. 删除分支
- 四、远程仓库协作
- 1. 管理远程仓库
- 2. 推送和拉取
- 3. 处理冲突
- 五、实用进阶命令
- 1. `git stash` — 临时保存工作区
- 2. `git tag` — 版本标签
- 3. `git cherry-pick` — 摘取特定提交
- 4. `git blame` — 逐行追溯修改者
- 六、`.gitignore` 配置
- 七、实用技巧与避坑指南
- 1. 修改最近一次 commit 的信息
- 2. 配置常用别名
- 3. 查看漂亮的提交图
- 4. 行尾符号问题(CRLF vs LF)
- 5. 误删文件恢复
- 附录:命令速查表
Git 实战指南:从多账户配置到日常高频命令
本文覆盖 Git 多 SSH 账户配置、日常开发中最常用的命令,以及踩过坑之后总结的实战技巧。适合有一定基础、想要系统梳理 Git 工作流的开发者。
一、多 SSH 账户配置
日常开发中经常需要同时使用 GitHub、GitLab、Gitee 等多个代码托管平台,每个平台对应不同的 SSH 密钥。下面介绍如何在一台机器上配置多套 SSH 账户,实现无感切换。
1. 生成独立密钥对
为每个平台生成单独的密钥,注意用-f指定文件名来区分:
# GitHub 密钥ssh-keygen-trsa-C'your_github_email@example.com'-f~/.ssh/id_rsa_github# GitLab 密钥ssh-keygen-trsa-C'your_gitlab_email@example.com'-f~/.ssh/id_rsa_gitlab# Gitee 密钥ssh-keygen-trsa-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文件,为每个平台指定别名和对应的密钥:
# 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. 验证连接
# 测试 GitHub 连接ssh-Tgit@github.com# 成功时返回:Hi hello! You've successfully authenticated...# 测试 GitLab 连接ssh-Tgit@gitlab.com二、Git 基础常用命令
1.git init— 初始化本地仓库
mkdirmy-projectcdmy-projectgitinit执行后会在当前目录创建.git隐藏文件夹,存放版本控制的全部元数据。
2.git clone— 克隆远程仓库
# 基本克隆gitclone git@github.com:user/repo.git# 指定本地目录名gitclone git@github.com:user/repo.git my-folder# 只克隆最新一次提交(浅克隆,适合大仓库)gitclone--depth1git@github.com:user/repo.git3.git add— 添加文件到暂存区
# 添加单个文件gitaddREADME.md# 添加多个文件gitaddsb1.txt sb2.txt# 添加当前目录所有变更gitadd.4.git commit— 提交暂存区到本地仓库
# 基本提交(必须带 -m 参数)gitcommit-m"feat: XXXXX"# 会自动暂存所有已跟踪且被修改的文件,但不会包含新创建的未跟踪文件gitcommit-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— 查看仓库状态
gitstatus# 精简输出(只显示文件名和状态码)gitstatus-s输出会用颜色区分:绿色 = 已暂存,红色 = 未暂存的修改,未跟踪文件显示为Untracked。
6.git diff— 查看文件修改差异
# 工作区 vs 暂存区(还没 add 的修改)gitdiff# 暂存区 vs 最近一次提交(已 add 还没 commit 的内容)gitdiff--cached# 对比两个分支gitdiffmain..dev# 对比两个 commitgitdiffabc123 def4567.git log— 查看提交历史
# 默认完整日志gitlog# 单行精简格式gitlog--oneline# 带分支图谱gitlog--oneline--graph--all# 查看某个文件的提交历史gitlog--follow-pREADME.md# 查看某个作者的提交gitlog--author="hello"# 查看最近 5 次提交gitlog-58.git reset— 版本回退
HEAD代表当前版本;HEAD^上一版;HEAD^^上上版;HEAD~100往上 100 个版本。
# 回退到上一个版本,丢弃所有修改(慎用!)gitreset--hardHEAD^# 回退到上一个版本,回退提交历史 + 清空暂存区,但保留工作区的修改(即修改变成"未暂存"状态)gitreset--mixedHEAD^# 回退到上一个版本,保留修改在暂存区gitreset--softHEAD^# 根据 commit id 精准回退gitreset--hard3ba5cdb7cf87
--hard会丢弃未提交的修改,操作前请确认。如果误操作,可以用git reflog找回 commit id 后再次 reset。
9.git reflog— 查看所有操作历史
包含已回退、已删除分支的提交记录,是"后悔药"的关键工具:
gitreflog# 输出示例:# abc1234 HEAD@{0}: reset: moving to HEAD^# def5678 HEAD@{1}: commit: feat: 新增搜索功能# 通过 reflog 找到 def5678,即可恢复gitreset--harddef567810.git revert— 安全撤销已推送的提交
与 git reset 不同,git revert 不会改写历史,而是生成一个新的提交来"反向撤销"目标提交的变更。已经 push 到远程的提交,应该用 git revert 而非 git reset,避免改写团队共享的历史。
# 撤销某次提交(自动生成一条反向提交)gitrevert abc1234# 撤销最近一次提交gitrevert HEAD --no-edit# 撤销一个范围的提交(从旧到新,不包含旧的那个)gitrevert abc1234..def5678# 只撤销某次提交中的部分文件变更gitrevert abc1234 -- file.txtreset vs revert 怎么选?
- 提交还没 push → 用 git reset,干净利落
- 提交已经 push → 用 git revert,不影响其他人
- 简单理解:reset 是"假装没发生过",revert 是"承认发生过,再做一次反向操作"
11.git restore/git checkout— 撤销文件修改
# 撤销工作区的修改(恢复到暂存区或最近一次 commit 的状态)gitrestore file.txt# Git 2.23+ 推荐写法gitcheckout -- file.txt# 兼容旧版本的写法 -- 用于区分"分支名"和"文件名"。# 从暂存区移除文件(撤销 git add,但保留工作区修改)gitrestore--stagedfile.txtgitreset HEAD file.txt# 等价写法Git 2.23 起推荐用
git restore,语义更清晰。git checkout承担了太多职责(切换分支、撤销文件、合并冲突等),容易混淆。
12.git rm— 删除仓库内文件
# 从仓库和工作区同时删除gitrmfile.txt# 仅从仓库删除(保留本地文件,常用于误提交的文件)gitrm--cachedfile.txt# 批量删除gitrm-rsrc/deprecated/三、分支管理
分支是 Git 最强大的特性之一,掌握分支操作是团队协作的基础。
1. 查看分支
# 本地分支gitbranch# 远程分支gitbranch-r# 所有分支gitbranch-a2. 创建和切换分支
# 创建新分支gitbranch feature/login# 切换到该分支gitcheckout feature/login# 一步到位:创建并切换(推荐)gitcheckout-bfeature/login# Git 2.23+ 推荐写法gitswitch-cfeature/login3. 合并分支
# 切回主分支gitswitch main# 将 feature/login 合并到 maingitmerge feature/login# 始终创建合并提交,保留分支合并记录(推荐团队协作)gitmerge feature/login --no-ff# 如果想要线性提交历史(个人开发/小团队),使用 rebasegitswitch feature/logingitrebase maingitswitch maingitmerge feature/login4. 删除分支
# 删除已合并的本地分支gitbranch-dfeature/login# 强制删除未合并的本地分支gitbranch-Dfeature/login# 删除远程分支gitpush origin--deletefeature/login四、远程仓库协作
1. 管理远程仓库
# 查看已关联的远程仓库gitremote-v# 添加远程仓库gitremoteaddorigin git@github.com:user/repo.git# 修改远程仓库地址gitremote set-url origin git@github.com:user/new-repo.git2. 推送和拉取
# 推送当前分支到远程(首次推送需关联上游分支)gitpush-uorigin feature/login# 后续推送(已关联上游分支后可简写)gitpush# 拉取远程更新并合并gitpull# 等价于 fetch + merge(更安全的方式)gitfetch origingitmerge origin/<当前分支名>gitmerge origin/feature/login# 拉取指定分支gitpull origin dev3. 处理冲突
当pull或merge出现冲突时,Git 会在冲突文件中标记:
<<<<<<< HEAD 当前分支的内容 ======= 合并过来的内容 >>>>>>> feature/login手动编辑文件保留需要的内容,删除冲突标记后:
gitaddconflicted-file.txtgitcommit-m"fix: 解决合并冲突"五、实用进阶命令
1.git stash— 临时保存工作区
开发中经常遇到"代码改了一半,突然要切分支修 bug"的情况:
# 暂存当前修改gitstash# 暂存并附带说明gitstash push-m"开发到一半的搜索功能"# 查看暂存列表gitstash list# 恢复最近一次暂存(并从列表中移除)gitstash pop# 恢复暂存但保留在列表中gitstash apply# 恢复包含未跟踪文件的暂存gitstash --include-untracked2.git tag— 版本标签
# 创建轻量标签gittag v1.0.0# 创建附注标签(推荐,包含作者、日期、备注信息)gittag-av1.0.0-m"Release v1.0.0"# 对历史 commit 打标签gittag-av0.9.0 abc1234-m"Beta release"# 推送标签到远程gitpush origin v1.0.0# 推送所有本地标签gitpush origin--tags# 删除远程标签gitpush origin--deletev1.0.03.git cherry-pick— 摘取特定提交
将一个分支的某个 commit 应用到另一个分支:
gitswitch maingitcherry-pick abc12344.git blame— 逐行追溯修改者
# 查看文件每一行的最后修改者和对应 commitgitblame src/App.vue# 只看某个行范围gitblame-L10,30src/App.vue六、.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不会生效。需要先移除跟踪:gitrm--cached-rnode_modules/gitcommit-m"chore: 移除误提交的 node_modules"
七、实用技巧与避坑指南
1. 修改最近一次 commit 的信息
gitcommit--amend-m"feat: 修正提交信息"这会改变 commit hash。如果已经 push 到远程,需要
git push --force才能同步,团队开发中慎用。
2. 配置常用别名
在~/.gitconfig中添加别名,减少重复输入:
[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. 查看漂亮的提交图
# 安装 git-lg 别名,一键显示带分支图谱的提交历史gitconfig--globalalias.lg"log --oneline --graph --all --decorate"gitlg4. 行尾符号问题(CRLF vs LF)
Windows 和 Linux/macOS 使用不同的行尾符号,容易导致整个文件显示"已修改"。统一配置:
# 提交时自动转换为 LF,检出时根据系统决定gitconfig--globalcore.autocrlftrue# Windows 推荐gitconfig--globalcore.autocrlf input# macOS/Linux 推荐或者在项目根目录添加.gitattributes文件,确保团队一致:
* text=auto eol=lf *.bat text eol=crlf5. 误删文件恢复
# 恢复被 git rm 删除的文件gitcheckout HEAD -- deleted-file.txt# 如果已经 commit 了删除操作gitcheckout 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(需配置别名) |