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代码托管平台的真实域名
UserSSH 用户名,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.git

3.git add— 添加文件到暂存区

# 添加单个文件gitaddREADME.md# 添加多个文件gitaddsb1.txt sb2.txt# 添加当前目录所有变更gitadd.

4.git commit— 提交暂存区到本地仓库

# 基本提交(必须带 -m 参数)gitcommit-m"feat: XXXXX"# 会自动暂存所有已跟踪且被修改的文件,但不会包含新创建的未跟踪文件gitcommit-am"fix: XXXXX"

注意git commit不直接接文件名。流程是先git addgit 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 def456

7.git log— 查看提交历史

# 默认完整日志gitlog# 单行精简格式gitlog--oneline# 带分支图谱gitlog--oneline--graph--all# 查看某个文件的提交历史gitlog--follow-pREADME.md# 查看某个作者的提交gitlog--author="hello"# 查看最近 5 次提交gitlog-5

8.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--harddef5678

10.git revert— 安全撤销已推送的提交

与 git reset 不同,git revert 不会改写历史,而是生成一个新的提交来"反向撤销"目标提交的变更。已经 push 到远程的提交,应该用 git revert 而非 git reset,避免改写团队共享的历史。

# 撤销某次提交(自动生成一条反向提交)gitrevert abc1234# 撤销最近一次提交gitrevert HEAD --no-edit# 撤销一个范围的提交(从旧到新,不包含旧的那个)gitrevert abc1234..def5678# 只撤销某次提交中的部分文件变更gitrevert abc1234 -- file.txt

reset 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-a

2. 创建和切换分支

# 创建新分支gitbranch feature/login# 切换到该分支gitcheckout feature/login# 一步到位:创建并切换(推荐)gitcheckout-bfeature/login# Git 2.23+ 推荐写法gitswitch-cfeature/login

3. 合并分支

# 切回主分支gitswitch main# 将 feature/login 合并到 maingitmerge feature/login# 始终创建合并提交,保留分支合并记录(推荐团队协作)gitmerge feature/login --no-ff# 如果想要线性提交历史(个人开发/小团队),使用 rebasegitswitch feature/logingitrebase maingitswitch maingitmerge feature/login

4. 删除分支

# 删除已合并的本地分支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.git

2. 推送和拉取

# 推送当前分支到远程(首次推送需关联上游分支)gitpush-uorigin feature/login# 后续推送(已关联上游分支后可简写)gitpush# 拉取远程更新并合并gitpull# 等价于 fetch + merge(更安全的方式)gitfetch origingitmerge origin/<当前分支名>gitmerge origin/feature/login# 拉取指定分支gitpull origin dev

3. 处理冲突

pullmerge出现冲突时,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-untracked

2.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.0

3.git cherry-pick— 摘取特定提交

将一个分支的某个 commit 应用到另一个分支:

gitswitch maingitcherry-pick abc1234

4.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 stgit cogit lg等简写命令。

3. 查看漂亮的提交图

# 安装 git-lg 别名,一键显示带分支图谱的提交历史gitconfig--globalalias.lg"log --oneline --graph --all --decorate"gitlg

4. 行尾符号问题(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=crlf

5. 误删文件恢复

# 恢复被 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(需配置别名)