以下是我在提出问题时所做的事情:
如何合并原始所有者的提交,以便我的本地主人与他的主人相同(基本上我想做一个Github快进)并且我在新分支上做了两次提交?
以下是我迄今为止所做的事情(我认为我需要做的就是完成我想要的事情):
git remote add original-repo git://github.com/blah/blah.git
git fetch original-repo
git fetch original-repo master
答案 0 :(得分:2)
有点像问题“Take all my changes on the current branch and move them to a new branch in Git”
基本上,您需要将主分支重置为提交前的状态,并将它们放在新分支“myBranch”(或您想要的任何其他名称)中:
$ git checkout -b myBranch SHA1_before_your_commits
$ git rebase master # to replay all your commits on top of this new branch
$ git checkout master
$ git reset --hard SHA1_before_your_commits
然后从原始仓库中添加提交:
$ git pull original-repo master
然后您将需要force the push到您的GitHub分叉回购(因为您已经重写了分支的历史记录)
git push --force origin master
警告:这不仅会破坏遥控器上的历史记录,还可能会向从同一遥控器更新的任何人发出错误消息(取决于您重写的历史记录)。仅将此作为最后的手段。
在这里,如果没有人克隆你的分叉存储库,这可能是一个可行的解决方案。
答案 1 :(得分:1)
VonC提供的解决方案的替代解决方案是使用“我们的”合并策略来加入历史记录,但是要采用一个版本:
$ git checkout -b tmp original-repo/master
$ git merge -s ours master # take version from 'tmp', i.e. from 'original-repo/master'
$ git checkout master
$ git merge tmp # should be fast forward
$ git branch -d tmp # 'tmp' branch is no longer needed
上面你要做的就是“他们”合并。
警告: 此解决方案解决原始问题仅如果自上次合并(上次更新)后本地分支上没有其他提交,那么将被原始存储库中的版本替换!!!
因此,此解决方案可以保留您解决历史问题的版本,但在应用程序中更受限制。
下面是一组ASCII艺术图表,显示了每个步骤中存储库中发生的情况:
\*---\*---x---A <-- original-repo/master (remote-tracking branch) \ \\--a---b <-- master <-- HEAD
git checkout -b tmp original-repo/master
”之后:
<-- original-repo/master, *---*---x---A <-- tmp <-- HEAD \ \--a---b <-- master其中'tmp'(本地分支)和'original-repo / master'(远程跟踪分支)指向同一个提交。
git merge -s ours master
”之后:
/-------------- original-repo/master v *---*---x---A----A' <-- tmp <-- HEAD \ / \--a---b <-- master其中,提交A'是合并提交,但具有与提交A相同的内容(相同的树)
git checkout master && git merge tmp
”之后(合并应该快进):
/-------------- original-repo/master v *---*---x---A----A' <-- tmp, \ / <-- master <-- HEAD \--a---b'master'和'tmp'都指向同一个提交。
git branch -d tmp
”之后,以及一些图表的重新组织
\*---\*---x---A-----\ <-- original-repo/master \ \ \\--a---b---A' <-- master <-- HEAD
最后:
original-repo/master
”(即“refs/remotes/original-repo/master
”)指向提交A,master
”(即“refs/heads/master
”),即当前分支,指向提交A'。A'^1 == A
),A'^2 == a
),A'^{tree} == A^{tree}
)相同。