有超过200条的现有回购到位桶一个。 我下载的代码(不git的文件)。 创建新的回购B带在第一次提交添加了所有现有的代码。 然后在回购回购B. A 150个更多的提交没有新的提交,我的工作只是回购B中。 现在的要求是所有的代码和历史记录(如果可能)或回购B中的变更在历史上单个条目单回购。 第三回购C的温度将被罚款堂妹不希望冒险A和B.
Answer 1:
如果我理解正确的,你现在有
- A的最新状态为第一B中提交
- 工作的许多最重要的是,还B中
你想获得下用
- A的全部历史
- B的所有历史上最重要的是(当然,除了第一次提交)。
假设是正确的,这是做,通过补丁的方式之一:
获得A的新副本:
$ git clone A C
检查一下最初的散列B是承诺(与来自东西):
$ cd B
$ git log --oneline|tail -1
1234beef Initial commit
还是在B,导出为补丁工作的所有的休息:
$ git format-patch 1234beef..HEAD
(这将产生一堆.patch
在乙文件)
进口的所有这些改变到你一个新鲜的克隆:
$ cd C
$ git am ../B/*.patch
就大功告成了。
Answer 2:
另一种解决方案是使用移植和过滤分支 。 见示例部分,该示例设置一个提交(通常是在一个新的历史的尖端)是当前初始的父提交正是你想做的事情。 这是因为它允许无论如何你喜欢改变所有分支机构一起,重新排序历史图表更可靠的方式。
首先,你需要git clone BC
,则cd C
和git 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
。
Answer 3:
git rebase -p --onto
可能是最简单的。 底垫中的-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
文章来源: Same code different git files, merging with keeping history