Git

一、基础命令

命令 功能说明
git init 初始化一个新的 Git 仓库
git log 查看提交历史
git add [文件名] 将文件添加到暂存区(git add . 添加所有修改)
git commit -m "提交信息" 提交暂存区的更改到本地仓库
git status 查看当前仓库状态(修改、暂存、提交情况)
git branch 查看本地所有分支(git branch -a 查看本地+远程所有分支)
git branch [分支名] 创建本地新分支(基于当前分支)
git checkout [分支名] 切换到指定本地分支
git checkout -b [分支名] 创建并切换到新分支(等价于 git branch + git checkout
git checkout -b [本地分支名] origin/[远程分支名] 基于远程分支创建并切换本地分支
git branch -d [分支名] 安全删除本地分支(已合并)
git branch -D [分支名] 强制删除本地分支(未合并)

二、远程仓库管理

1. 添加/管理远程仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 添加远程仓库
git remote add origin [仓库地址]

# HTTPS 方式
git remote add origin https://github.com/用户名/仓库.git

# SSH 方式
git remote add origin git@github.com:用户名/仓库.git

# 修改远程仓库地址
git remote set-url origin [新地址]

# 查看已配置的远程仓库
git remote -v

2. 克隆仓库(含指定非主分支)

1
2
3
4
5
6
7
8
9
10
11
12
# 克隆默认分支(通常是main/master)
git clone https://github.com/你的GitHub用户名/仓库名.git # HTTPS
git clone git@github.com:你的GitHub用户名/仓库名.git # SSH

# 克隆指定非主分支(方式1:先克隆仓库,再切换分支)
git clone git@github.com:用户名/仓库.git
cd 仓库名
git checkout -b 目标分支名 origin/目标分支名 # 基于远程非主分支创建本地分支

# 克隆指定非主分支(方式2:直接克隆指定分支)
git clone -b 目标分支名 --single-branch git@github.com:用户名/仓库.git
# -b:指定分支;--single-branch:仅克隆该分支(减少体积)

三、分支核心操作(非主分支专属)

1. 非主分支的本地-远程同步

(1)非主分支的提交与推送

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 切换到目标非主分支
git checkout dev # 示例:dev为非主分支

# 2. 添加修改到暂存区
git add .

# 3. 提交到本地仓库
git commit -m "feat: 非主分支dev添加XX功能"

# 4. 推送到远程非主分支(首次推送需关联本地与远程分支)
git push -u origin dev # -u:建立本地dev与远程dev的关联,后续可直接git push
# 非首次推送(已关联)
git push origin dev

(2)非主分支的拉取同步

1
2
3
4
5
6
7
8
# 方式1:直接拉取远程非主分支到本地对应分支
git checkout dev # 先切换到本地dev分支
git pull origin dev # 拉取远程dev分支并合并到本地dev

# 方式2:先获取远程分支更新,再合并(更可控)
git fetch origin # 获取所有远程分支最新更新
git checkout dev
git merge origin/dev # 合并远程dev到本地dev

2. 分支切换常见问题与解决

(1)切换分支提示“未提交的更改会被覆盖”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 场景:当前分支有未提交修改,切换分支时被阻止
# 解决方式1:暂存未提交修改
git stash # 暂存修改
git checkout dev # 切换分支
# 回到原分支后恢复暂存:git stash pop

# 解决方式2:放弃未提交修改(谨慎!不可逆)
git checkout -- . # 撤销所有工作区修改
git checkout dev

# 解决方式3:提交当前修改后再切换
git add .
git commit -m "temp: 暂存当前修改"
git checkout dev

(2)切换分支后代码未更新(detached HEAD 状态)

1
2
3
# 场景:误切到提交ID而非分支名,出现“detached HEAD”提示
# 解决:切换到正确的分支名
git checkout dev # 切回dev分支即可恢复正常

(3)本地无对应远程非主分支

1
2
3
4
# 场景:远程新增了dev分支,本地看不到
# 解决:先拉取远程分支列表,再创建本地分支
git fetch origin # 拉取远程所有分支信息
git checkout -b dev origin/dev # 基于远程dev创建本地dev分支

四、多设备同步工作流(含非主分支)

核心逻辑

多台电脑共享远程仓库 → 非主分支修改后 git push 推送 → 其他设备 git pull 拉取非主分支最新内容

操作步骤

1. 新设备拉取远程非主分支

1
2
3
4
5
6
7
# 克隆仓库(或已克隆则跳过)
git clone git@github.com:用户名/仓库.git
cd 仓库名

# 拉取远程非主分支并创建本地分支
git fetch origin
git checkout -b dev origin/dev # 示例:同步dev分支

2. 修改并推送非主分支代码

1
2
3
4
5
6
7
8
9
# 切换到目标非主分支
git checkout dev

# 编辑代码后提交
git add .
git commit -m "fix: dev分支修复XX问题"

# 推送到远程非主分支
git push origin dev

3. 同步远程非主分支最新代码

1
2
3
4
5
# 切换到本地非主分支
git checkout dev

# 拉取远程最新修改
git pull origin dev

五、SSH 配置与问题解决

核心步骤

确认密钥添加正确 → 配置 SSH 识别密钥 → 修复文件权限

1. 确认公钥添加到 GitHub

1
2
3
4
# 查看公钥内容
cat ~/.ssh/id_rsa.pub # 默认密钥
# 或
cat ~/.ssh/自定义密钥名.pub # 自定义密钥
  • 复制完整文本(从 ssh-rsa 开头到邮箱结尾)
  • GitHub → Settings → SSH and GPG keys → 添加新 Key

2. 配置 SSH 识别密钥

1
notepad ~/.ssh/config

粘贴配置(根据实际情况修改):

1
2
3
4
Host github.com
HostName github.com
User git
IdentityFile C:/Users/你的用户名/.ssh/密钥文件名

路径使用 /\\,例如:C:/Users/张三/.ssh/id_rsa

3. 修复密钥文件权限

1
2
3
cd ~/.ssh
chmod 600 密钥文件名 # 私钥权限
chmod 644 密钥文件名.pub # 公钥权限

4. 测试连接

1
2
ssh -T git@github.com
# 成功显示:Hi 用户名! You've successfully authenticated...

六、提交历史管理

1. 撤销错误提交

方法一:直接回退历史(个人仓库适用)

1
2
3
4
5
6
7
8
# 1. 切换到目标分支(示例:dev分支)
git checkout dev

# 2. 回退到正确提交(92d433f 为正确提交ID)
git reset --hard 92d433f

# 3. 强制推送到远程非主分支
git push origin dev --force

方法二:创建撤销提交(多人协作适用)

1
2
3
4
5
6
7
8
# 1. 切换到目标分支
git checkout dev

# 2. 生成撤销提交(0dec4f6 为错误提交ID)
git revert 0dec4f6

# 3. 推送撤销提交到远程非主分支
git push origin dev

后续操作

1
2
3
git add .
git commit -m "正确的提交信息"
git push origin dev # 推送到非主分支

2. 修复本地分支与远程分支偏离问题

问题原因

本地分支历史与远程分支历史不一致(本地包含远程已移除的提交)

解决步骤(非主分支)

1
2
3
4
5
6
7
8
9
10
11
# 1. 切换到目标非主分支
git checkout dev

# 2. 保存未提交的修改(如有)
git stash

# 3. 强制同步本地分支与远程分支
git reset --hard origin/dev

# 4. 确认同步完成
git pull origin dev

七、高级分支同步技巧

1. 同步特定远程非主分支

1
2
3
4
5
6
7
8
9
# 先获取所有远程分支更新
git fetch origin

# 方式1:创建本地分支跟踪远程非主分支
git checkout -b dev origin/dev

# 方式2:重置当前非主分支到远程分支
git checkout dev
git reset --hard origin/dev

2. 同步多个特定非主分支

1
2
3
4
5
# 批量同步dev、feature/user、hotfix/order分支
git fetch origin
git checkout dev && git reset --hard origin/dev
git checkout feature/user && git reset --hard origin/feature/user
git checkout hotfix/order && git reset --hard origin/hotfix/order

3. 同步远程仓库的所有分支(含非主分支)

1
2
3
4
5
6
7
8
9
10
# 获取所有远程分支
git fetch --all

# 为每个远程分支创建本地分支
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

# 或删除所有本地分支后重新创建(谨慎!)
git branch | grep -v "main" | xargs git branch -D # 保留main,删除其他本地分支
git fetch --all
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

4. 重置远程非主分支到特定提交

1
2
# 需有仓库权限,示例:重置远程dev分支到0dec4f6提交
git push origin --force 0dec4f6:dev

5. 查看非主分支差异

1
2
3
4
5
# 查看本地dev比远程dev多出的提交
git log origin/dev..dev

# 查看远程dev比本地dev多出的提交
git log dev..origin/dev

八、其他实用技巧

1. 暂存与恢复

1
2
3
4
5
git stash  # 暂存未提交修改
git stash list # 查看所有暂存
git stash pop # 恢复最新暂存
git stash pop stash@{n} # 恢复指定暂存
git stash drop stash@{n} # 删除指定暂存

2. 撤销修改

1
2
git checkout -- 文件名  # 撤销工作区修改
git checkout . # 撤销所有工作区修改

3. 提交历史查看

1
2
3
4
5
git log -p  # 显示每次提交的详细变化
git log --stat # 显示每次提交的统计信息
git log --graph --oneline --all # 图形化显示所有分支历史
git show 提交ID # 查看某次提交的详细内容
git add -p # 交互式选择要添加的修改

4. 从远程非主分支拉取特定文件

1
2
# 从远程dev分支拉取src/utils.js文件到本地
git checkout origin/dev -- src/utils.js

九、多仓库协作

1. 添加多个远程仓库

1
2
3
4
5
6
7
8
# 添加上游仓库(原始项目)
git remote add upstream https://github.com/原作者/仓库.git

# 添加自己的fork
git remote add fork https://github.com/你的用户名/仓库.git

# 查看所有远程仓库
git remote -v

2. 从上游仓库拉取非主分支更新

1
2
3
4
5
6
7
8
9
# 获取上游仓库更新
git fetch upstream

# 切换到本地dev分支,合并上游dev
git checkout dev
git merge upstream/dev

# 或使用rebase保持提交历史线性
git rebase upstream/dev

3. 同步fork与上游仓库(非主分支)

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 添加上游仓库
git remote add upstream https://github.com/原作者/仓库.git

# 2. 获取上游更新
git fetch upstream

# 3. 切换到本地dev分支,合并上游dev
git checkout dev
git merge upstream/dev

# 4. 推送到自己的fork的dev分支
git push fork dev