相同的代码不同的git文件,与保持历史记录合并

时间:2013-10-04 13:32:54

标签: git github bitbucket

现有bitbucket repo A超过200次提交。 我下载了代码(没有.git文件)。 在第一次提交中添加了所有现有代码,创建了新的repo B. 回购B再提交150多个提交。 repo A没有新的提交,我只在repo B上工作。 现在要求是包含所有代码和历史记录的单个仓库(如果可能的话) 或Repo B在历史记录中作为单个条目更改。 第三个回购C将很好,因为不想冒A和B的风险。

3 个答案:

答案 0 :(得分:4)

如果我理解正确,你现在有

  • A的最新状态为B
  • 中的第一个提交
  • 除了B
  • 之外,还有很多工作要做

你希望用

获得C.
  • A
  • 的所有历史
  • B的所有历史记录(当然除了第一次提交之外)。

假设这是正确的,这是通过补丁来实现的一种方式:

获得A:

的新答案
$ git clone A C

检查B中初始提交的哈希值(用A中的东西)是:

$ cd B
$ git log --oneline|tail -1
1234beef Initial commit

仍在B中,将所有剩余工作导出为补丁:

$ git format-patch 1234beef..HEAD

(这将在B)中生成一堆.patch个文件

将所有这些更改导入到A:

的新克隆中
$ cd C
$ git am ../B/*.patch

你已经完成了。

答案 1 :(得分:1)

另一种解决方案是使用graftsfilter-branch。请参阅示例部分,示例将提交(通常位于另一个历史记录的最前端)设置为当前初始提交的父级正是您要执行的操作。这是更可靠的方式,因为它允许将所有分支一起更改并重新排序历史图表,无论如何。

首先,您需要git clone B C,然后cd Cgit fetch A master。所以,你的C将从两个存储库中提交。然后将<initial commit id from B> <last commit id from A>添加到.git/info/grafts文件中。然后运行git filter-branch <initial commit id from B>..HEAD

答案 2 :(得分:0)

git rebase -p --onto可能是最简单的。 Rebase的-p选项尝试保留合并结构,其--onto允许明确指定新基数和切割基数。

所以,

A=/path/to/original/repo
B=/path/to/your/work

git clone $B C
cd C

root=$(git rev-list --max-parents=0 master)
echo $root                                    # this should spit a single id

git fetch $A

git rev-parse $root^{tree}                    # the two outputs here 
git rev-parse FETCH_HEAD^{tree}               # ... should be equal

git rebase -p --onto FETCH_HEAD $root master  # if both the above are true, bingo