Git实战:多账户配置与高频命令

📅 发布时间:2026/7/2 19:26:40 👁️ 浏览次数:
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 LF5. 误删文件恢复附录命令速查表Git 实战指南从多账户配置到日常高频命令本文覆盖 Git 多 SSH 账户配置、日常开发中最常用的命令以及踩过坑之后总结的实战技巧。适合有一定基础、想要系统梳理 Git 工作流的开发者。一、多 SSH 账户配置日常开发中经常需要同时使用 GitHub、GitLab、Gitee 等多个代码托管平台每个平台对应不同的 SSH 密钥。下面介绍如何在一台机器上配置多套 SSH 账户实现无感切换。1. 生成独立密钥对为每个平台生成单独的密钥注意用-f指定文件名来区分# GitHub 密钥ssh-keygen-trsa-Cyour_github_emailexample.com-f~/.ssh/id_rsa_github# GitLab 密钥ssh-keygen-trsa-Cyour_gitlab_emailexample.com-f~/.ssh/id_rsa_gitlab# Gitee 密钥ssh-keygen-trsa-Cyour_gitee_emailexample.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代码托管平台的真实域名UserSSH 用户名Git 平台统一使用git不是平台登录用户名IdentityFile对应平台私钥文件的路径IdentitiesOnly yes强制只使用指定密钥避免 SSH Agent 干扰3. 验证连接# 测试 GitHub 连接ssh-Tgitgithub.com# 成功时返回Hi hello! Youve successfully authenticated...# 测试 GitLab 连接ssh-Tgitgitlab.com二、Git 基础常用命令1.git init— 初始化本地仓库mkdirmy-projectcdmy-projectgitinit执行后会在当前目录创建.git隐藏文件夹存放版本控制的全部元数据。2.git clone— 克隆远程仓库# 基本克隆gitclone gitgithub.com:user/repo.git# 指定本地目录名gitclone gitgithub.com:user/repo.git my-folder# 只克隆最新一次提交浅克隆适合大仓库gitclone--depth1gitgithub.com:user/repo.git3.git add— 添加文件到暂存区# 添加单个文件gitaddREADME.md# 添加多个文件gitaddsb1.txt sb2.txt# 添加当前目录所有变更gitadd.4.git commit— 提交暂存区到本地仓库# 基本提交必须带 -m 参数gitcommit-mfeat: XXXXX# 会自动暂存所有已跟踪且被修改的文件但不会包含新创建的未跟踪文件gitcommit-amfix: 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--authorhello# 查看最近 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 gitgithub.com:user/repo.git# 修改远程仓库地址gitremote set-url origin gitgithub.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-mfix: 解决合并冲突五、实用进阶命令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-mRelease v1.0.0# 对历史 commit 打标签gittag-av0.9.0 abc1234-mBeta 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-mchore: 移除误提交的 node_modules七、实用技巧与避坑指南1. 修改最近一次 commit 的信息gitcommit--amend-mfeat: 修正提交信息这会改变 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.lglog --oneline --graph --all --decorategitlg4. 行尾符号问题CRLF vs LFWindows 和 Linux/macOS 使用不同的行尾符号容易导致整个文件显示已修改。统一配置# 提交时自动转换为 LF检出时根据系统决定gitconfig--globalcore.autocrlftrue# Windows 推荐gitconfig--globalcore.autocrlf input# macOS/Linux 推荐或者在项目根目录添加.gitattributes文件确保团队一致* textauto eollf *.bat text eolcrlf5. 误删文件恢复# 恢复被 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需配置别名