Git 双仓库同步与提交压缩实战指南
AI内容警告本文使用了AI润色,更多内容请看文章内容说明
初始化
-
首先使用
git init进行初始化(这里假设是全新私有仓库,如果需要在现有仓库则跳过此步) -
git commit --allow-empty -m "Initial commit"创建一个空提交 -
git remote add origin https://github.com/your-username/my-awesome-project.git添加你的远程私有仓库(替换链接)
设置上游并合并
NOTE下文的所有
upstream均可自定义为你想要的上游仓库的名称,master修改为实际你需要同步的上游仓库分支的名称(一般主分支名称为main或master)
-
使用
git remote add upstream https://github.com/your-username/my-awesome-project.git添加上游公开仓库 -
git fetch upstream获取上游仓库最新内容 -
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参数会把文件变更应用到你当前的工作区和暂存区。如果是在已有仓库上合并,可能会出现大量文件冲突,需要手动解决冲突。
git tag last-sync-point upstream/master在上游的提交添加标签用于后续增量同步内容
后续同步
-
git fetch upstream -
git diff last-sync-point upstream/master > upstream.patch -
git apply --3way upstream.patch然后解决冲突(如果有),删除upstream.patch文件并提交
TIP推荐使用
--3way选项,它可以在发生冲突时,尝试进行三方合并,比普通的 apply 更智能。
- 更新标签
# 先删除旧的标签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-
找到
A提交的哈希值,复制它哈希值的前 7 位以上(假设是a1b2c3d) -
使用交互式变基
git rebase -i a1b2c3d- 执行命令后,Git 会打开一个文本编辑器,里面是这样的内容:
pick b1b2b3b Commit message of Bpick c1c2c3c Commit message of Cpick d1d2d3d Commit message of D
# Rebase ...# ... (注释说明)需要修改这个文件来告诉 Git 如何压缩。把第二行及以后的 pick 改成 s (squash) 或者 f (fixup)。
-
s(squash): 会把这个提交和上一个提交合并,并且让你重新编辑合并后的提交信息。 -
f(fixup): 和s一样,但会直接丢弃这个提交的信息,使用上一个的。
修改成这样:
pick b1b2b3b Commit message of Bs c1c2c3c Commit message of Cs d1d2d3d Commit message of D保存并关闭。
- 编写新的提交信息
因为你使用了 squash,Git 会再次打开编辑器,让你为这个合并后的新提交(BCD)写一个新的、总结性的提交信息。比如 “Feature: Add user login and profile page”。写好后保存退出。推送到远程仓库即可(需要使用 -f 强制推送)。
赞助支持
如果这篇文章对你有帮助,欢迎赞助支持!