1

导致问题的步骤

这是我在提出问题之前所做的:

  1. 在Github上 fork 一个项目并克隆到本地
  2. 向我的本地存储库提交了两次以修复错误
  3. 将这两个提交推送到我的分叉 Github 存储库
  4. 通过 Github 向原始仓库所有者发送拉取请求
  5. 原始所有者进行了不同的提交以解决错误

问题

如何合并原始所有者的提交,以便我的本地 master 与他的 master 相同(基本上我想做一个 Github 快进)并在​​新分支上进行两次提交?

想到问题后采取的步骤

以下是我到目前为止所做的事情(我认为我需要做这些事情来完成我想要的事情):

  1. 将原始存储库添加为远程:git remote add original-repo git://github.com/blah/blah.git
  2. 获取原始回购:git fetch original-repo
  3. 获取原始回购大师:git fetch original-repo master
  4. 在大灯模式下进入鹿,所以在谷歌搜索失败后向 Stackoverflow 发布了问题。Stackoverflow 上有一些类似的问题,但我没有看到任何试图完成同样事情的东西。
4

2 回答 2

2

这有点像“将我在当前分支上的所有更改并将它们移动到 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

然后你需要强制推送到你的 GitHub 分叉仓库(因为你已经重写了你的分支的历史)

 git push --force origin master 

警告:这不仅会破坏遥控器上的历史记录,还可能会向从同一遥控器更新的任何人发出错误消息(取决于您重写了多少历史记录)。仅将其用作最后的手段。

在这里,如果没有人克隆您的分叉存储库,这可能是一个可行的解决方案。

于 2009-09-23T16:54:49.787 回答
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 艺术图,显示了每个步骤中存储库中发生的情况:

  1. 在第一个命令之前:
    \*---\*---x---A <-- original-repo/master(远程跟踪分支)
                    \
                      \\--a---b <-- master <-- HEAD
    
  2. git checkout -b tmp original-repo/master”之后:
                                              <--原始回购/主,
    *---*---x---A <-- tmp <-- HEAD
                    \
                      \--a---b <-- 主
    
    其中“tmp”(本地分支)和“original-repo/master”(远程跟踪分支)都指向同一个提交。
  3. git merge -s ours master”之后:
                            /--------------- 原始回购/主
                          v
    *---*---x---A----A' <-- tmp <-- HEAD
                    \ /
                      \--a---b <-- 主
    
    其中提交 A' 是合并提交,但与提交 A 具有相同的内容(相同的树)
  4. 在 " git checkout master && git merge tmp" 之后(合并应该是快进的):
                              /--------------- 原始回购/主
                            v
    *---*---x---A----A' <-- tmp,
                    \ / <-- 主人 <-- HEAD
                      \---a---b
    
    'master' 和 'tmp' 都指向同一个提交。
  5. 在“ 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' 具有:
    • 提交 A 作为其第一个父级 ( A'^1 == A),
    • A'^2 == a将 b 作为第二个父级 ( )提交,
    • 其内容(其树)与提交 A ( A'^{tree} == A^{tree}) 中的相同。
于 2009-09-24T10:01:49.277 回答