Mobile wallpaper
876 字
4 分钟

Git 双仓库同步与提交压缩实战指南

2025-11-16
2025-11-17
浏览量 加载中...
AI内容警告

本文使用了AI润色,更多内容请看文章内容说明

初始化#

  1. 首先使用git init进行初始化(这里假设是全新私有仓库,如果需要在现有仓库则跳过此步)

  2. git commit --allow-empty -m "Initial commit"创建一个空提交

  3. git remote add origin https://github.com/your-username/my-awesome-project.git添加你的远程私有仓库(替换链接)

设置上游并合并#

NOTE

下文的所有upstream均可自定义为你想要的上游仓库的名称,master修改为实际你需要同步的上游仓库分支的名称(一般主分支名称为mainmaster)

  1. 使用git remote add upstream https://github.com/your-username/my-awesome-project.git添加上游公开仓库

  2. git fetch upstream获取上游仓库最新内容

  3. git merge upstream/master合并上游仓库(注意主分支名称)

TIP

如果出现fatal: refusing to merge unrelated histories报错是正常的,因为提交历史不同,添加--allow-unrelated-histories参数强制合并即可:

Terminal window
git merge --allow-unrelated-histories upstream/master

如果不希望合并立即被提交可以使用git merge --squash upstream/main--squash 参数会把文件变更应用到你当前的工作区和暂存区。

如果是在已有仓库上合并,可能会出现大量文件冲突,需要手动解决冲突。

  1. git tag last-sync-point upstream/master在上游的提交添加标签用于后续增量同步内容

后续同步#

  1. git fetch upstream

  2. git diff last-sync-point upstream/master > upstream.patch

  3. git apply --3way upstream.patch 然后解决冲突(如果有),删除upstream.patch文件并提交

TIP

推荐使用 --3way 选项,它可以在发生冲突时,尝试进行三方合并,比普通的 apply 更智能。

  1. 更新标签
Terminal window
# 先删除旧的标签
git tag -d last-sync-point
# 获取 upstream/master 最新的哈希值,并创建同名新标签
git tag last-sync-point upstream/master

压缩提交#

CAUTION

重要警告git rebase重写历史。这意味着你需要使用 git push --force(强制推送)。请确保这个分支只有你一个人在用,或者你的所有协作者都清楚你在重写历史,并知道如何同步

假设当前 Git 历史如下:

A --- B --- C --- D <-- main, origin/main
  • A 是你上次从 upstream 同步后得到的那个“大”提交。

  • B, C, D 是你在这段时间内自己做的三个新提交。

目标把 B, C, D 压缩成一个提交 BCD:

A --- BCD <-- main
  1. 找到 A 提交的哈希值,复制它哈希值的前 7 位以上(假设是 a1b2c3d)

  2. 使用交互式变基

Terminal window
git rebase -i a1b2c3d
  1. 执行命令后,Git 会打开一个文本编辑器,里面是这样的内容:
pick b1b2b3b Commit message of B
pick c1c2c3c Commit message of C
pick d1d2d3d Commit message of D
# Rebase ...
# ... (注释说明)

需要修改这个文件来告诉 Git 如何压缩。把第二行及以后的 pick 改成 s (squash) 或者 f (fixup)。

  • s (squash): 会把这个提交和上一个提交合并,并且让你重新编辑合并后的提交信息。

  • f (fixup): 和 s 一样,但会直接丢弃这个提交的信息,使用上一个的。

修改成这样:

pick b1b2b3b Commit message of B
s c1c2c3c Commit message of C
s d1d2d3d Commit message of D

保存并关闭。

  1. 编写新的提交信息

因为你使用了 squash,Git 会再次打开编辑器,让你为这个合并后的新提交(BCD)写一个新的、总结性的提交信息。比如 “Feature: Add user login and profile page”。写好后保存退出。推送到远程仓库即可(需要使用 -f 强制推送)。

赞助支持

如果这篇文章对你有帮助,欢迎赞助支持!

赞助
Git 双仓库同步与提交压缩实战指南
https://blog.cmtyx.top/posts/github-repo-sync-rebase/
作者
璨梦踏月
发布于
2025-11-16
许可协议
CC BY-NC-SA 4.0
最后更新于 2025-11-17

评论区

目录