如何将git存储库与来自不同上游的更改合并

时间:2014-11-29 22:38:27

标签: git github merge

多年前,我在Github上创建了一个SourceForge项目的公共存储库。那时候,项目只支持CVS,所以我使用git cvs定期将我的存储库与原始存储库同步。

很长一段时间没有对CVS存储库进行任何提交,现在我发现他们也转移到了git(虽然在Sourceforge上,而不是Github)。

我现在的问题是:如何将SF git存储库中的更改合并到我的存储库中?

到目前为止我尝试了什么:

  1. 添加新的远程存储库'上游'指向SF git repo
  2. git fetch upstream
  3. git checkout master
  4. git merge upstream/master
  5. 最后一步没有错误,但git status告诉我主人和他起源/主人有分歧。现在执行git pull会导致很多冲突(" CONFLICT(添加/添加)")。

2 个答案:

答案 0 :(得分:2)

如果您只是简单地将修改重新定位到从cvs导入的分支上,这可能非常简单。我的第一次尝试是通过提交消息中的可识别文本匹配提交,然后尝试匹配patch-id

设置:找到您工作的当前基本提交:

currentbase=$(git merge-base master master@{u})
git show -s $currentbase

现在在upstream/master中找到相应的提交:

git checkout upstream/master
git show -s :/"some regex for unique-looking text in the $currentbase message"
# and if that's right
newbase=`git rev-parse !git:$`  # !git:$ is last arg to previous git command

如果这不起作用,请尝试查找应用相同补丁的提交:

patchids=`mktemp`
git rev-list upstream/master \
| while read; do 
        git diff-tree -p $REPLY | git patch-id
  done >> $patchids

# hunt up a commit that makes the same changes as $currentbase
set -- `git diff-tree -p $currentbase | git patch-id`
grep $2 $patchids
# and if it finds one
set -- $(!grep)  # !grep is whole of last grep command
newbase=$2

然而,当你找到合适的

时,你会发现它
git rebase --onto $newbase master@{u} master
git branch -u upstream/master

从那里开始,你可以像往常一样,普通git rebase默认为当前的上游。

答案 1 :(得分:0)

问题是上游/主服务器和主服务器的历史完全不同(每个提交都有不同的SHA1)

您需要查看上游/主数据库的历史记录,并确定Sourceforge Git存储库中与您自己的master历史记录相比较新的提交内容。

然后,你可以:

  • master分支
  • 上的最后一次常规提交创建分支
  • git cherry-pickupstream/master到新分支的所有提交(从master开始)
    (注意:你可以cherry-pick a range of commits
  • 然后将新分支合并到master