相同的代码不同的git的文件,以保持历史合并(Same code different git fil

2019-10-18 18:11发布

有超过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 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



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