git - 分叉后历史记录中的重复提交
问题描述
我最初从 github 分叉了一个存储库并对其进行了许多更改。与此同时,原始存储库发生了变化,我想将这些更改合并到我当前的 fork 中。
我将原始 repo 添加为上游分支,并执行了 fetch。当我查看 git 日志时,似乎所有提交到我的 fork(我希望它是共同的祖先)都是重复的(同名但不同的提交 id)。
什么可能导致这种情况?我该如何合并?
解决方案
最可能的原因是:在原始存储库中,有人运行了历史重写命令(例如git rebase -i ...
or git filter-branch ...
),该命令创建了具有相同消息但不同提交 ID 的提交。
恕我直言,解决此问题的最简单方法是:在新提交之上重新设置您自己的提交。
然而,有了这个建议,您将重写您的分支的历史记录,因此您需要在push --force
之后将您的分支转到您的 fork。
我猜你的情况没问题,但如果这是一个阻止程序,请添加评论。
这是一个命名提交的图表:
*--*--*--*--A--B--C--X <- fork/master # the original commit from upstream,
\ \ # on which you started your branch
\ *--*--*--*--Y <- yourbranch
\
A'--B'--C'--X'--*--*--Z <- upstream/master
通过检查你的提交和upstream
' 提交的历史,你应该很容易地找出哪些提交是X
和X'
上图中的。
当您发现此提交时,您可以:
- 直接将您的分支重新设置在
Z
- 首先将您的分支重新设置在 之上
X'
,然后在之上Z
使用第二种方式:第一个 rebase 应该有更少的冲突,并且你将拥有这个中间状态,yourbranch
在upstream
.
要在另一点之上重新设置一系列提交:使用git rebase --onto
:
# to rebase X..yourbranch on top of X' :
git rebase --onto X' X yourbranch
# to rebase X'..yourbranch on top of Z :
git rebase --onto Z X' yourbranch
# obviously, if you want to go with 1. :
git rebase --onto Z X yourbranch
推荐阅读
- css - React NextJS CSS - 部分的高度设置为父高度的 100%,但给出页面高度的 100%
- android - 通知通道自定义声音仅在我在模拟器上运行应用程序进程时才有效
- python - 用户不能在 Flask (SQLAlchemy) 中关注组
- python - SQLite3 - 跨表 SELECT 查询
- reactjs - 如何从 Django(后端)向 React Native(移动)应用程序发送通知
- java - 服务器上有应用程序的三个实例。但我们想在应用程序的一个实例上执行 cronjob 调度逻辑
- javascript - 需要帮助使用 chrome.webRequest 来阻止使用 Chrome 扩展程序的网站
- css - 如何将 css 类转换为样式化组件
- java - 不接收来自数据库的更新数据(Spring OneToMany 关系)
- python-3.x - 如何将输出转换为带有索引的新表?蟒蛇3