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

文章目录

    • [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. 查看分支](#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 — 逐行追溯修改者)
    • [六、`.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 addgit 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. 处理冲突

pullmerge 出现冲突时,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 不会生效。 需要先移除跟踪:

bash 复制代码
git 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 stgit cogit 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(需配置别名)