Git Fork项目同步与维护手册

一、仓库角色理解

假设:

上游仓库:

HKUDS/nanobot

你的 Fork:

leeyorke/nanobot

本地仓库:

~/workspace/nanobot

对应关系:

upstream
    ↓
HKUDS/nanobot

origin
    ↓
leeyorke/nanobot

local
    ↓
本地工作目录

查看远程:

git remote -v

理想结果:

origin    git@github.com:leeyorke/nanobot.git
upstream  git@github.com:HKUDS/nanobot.git

如果缺少 upstream:

git remote add upstream git@github.com:HKUDS/nanobot.git

二、日常检查命令

查看当前状态:

git status

查看分支:

git branch -vv

查看最近提交:

git log --oneline --decorate -10

查看远程:

git remote -v

三、同步 Upstream 最新代码

获取最新数据:

git fetch upstream

查看 Upstream 默认分支:

git remote show upstream

通常:

HEAD branch: main

四、推荐同步方式:Rebase

执行:

git rebase upstream/main

效果:

同步前:

A---B---C upstream

     \
      D---E local

同步后:

A---B---C---D'---E'

优点:

  • 历史干净
  • 没有多余 Merge Commit
  • 便于后续 PR

五、发生冲突怎么办

例如:

git rebase upstream/main

出现:

CONFLICT (content)

查看状态:

git status

编辑冲突文件:

<<<<<<< HEAD
upstream内容
=======
我的内容
>>>>>>> commit

手动修改为最终版本。

添加到暂存区:

git add 文件名

继续:

git rebase --continue

重复直到完成。


六、放弃 Rebase

完全撤销:

git rebase --abort

恢复到 Rebase 之前。


七、查看与 Upstream 的差异

查看本地独有提交:

git log upstream/main..HEAD --oneline

查看 Upstream 独有提交:

git log HEAD..upstream/main --oneline

查看双方差异:

git log --left-right --graph --oneline HEAD...upstream/main

符号说明:

< 本地独有
> upstream独有

八、查看代码差异

查看所有变更:

git diff upstream/main..HEAD

仅查看文件:

git diff --name-status upstream/main..HEAD

输出:

M 修改
A 新增
D 删除

九、为什么 Rebase 后 Push 失败

错误:

non-fast-forward

原因:

Rebase 会重写 Commit Hash。

原来:

A---B---C

Rebase后:

A---X---Y---C'

虽然内容一样:

C ≠ C'

Hash已经改变。

Git认为历史不连续。

所以普通 Push 会失败:

git push origin main

报:

non-fast-forward

十、Force Push

普通 Push:

git push origin main

要求:

远程历史必须包含于本地历史

否则拒绝。


十一、Force Push 与 Force-With-Lease

危险方式:

git push --force origin main

作用:

无条件覆盖远程历史

风险:

可能删除别人提交。


推荐方式:

git push --force-with-lease origin main

作用:

覆盖远程历史

但先检查:
远程是否被别人改过

如果别人提交了新代码:

push被拒绝

更安全。


十二、Fork项目标准同步流程

每次同步上游:

git fetch upstream

git rebase upstream/main

git push --force-with-lease origin main

这是 Fork 项目最常见流程。


十三、查看 Fork 与 Upstream 差异

查看 Fork 落后多少:

git fetch origin
git fetch upstream

git log --left-right --graph --oneline origin/main...upstream/main

查看领先落后数量:

git rev-list --left-right --count origin/main...upstream/main

结果:

3 10

表示:

Fork领先3个commit
Fork落后10个commit

十四、SSH Push 失败排查

测试认证:

ssh -T git@github.com

成功:

Hi <username>!
You've successfully authenticated

测试端口:

nc -vz github.com 22

成功:

Connection succeeded

查看详细日志:

ssh -vT git@github.com

十五、重要原则

原则1: 不要在 Rebase 后执行 git pull,尤其出现 non-fast-forward 时,因为可能产生额外 Merge Commit。

原则2: 同步 Upstream 推荐 rebase,而非 merge

原则3: 个人 Fork 仓库中 git push --force-with-lease 是正常操作。

原则4: 任何危险操作前先看 git statusgit log --oneline --decorate -10git branch -vv,先确认当前状态。