背景:我有一个很大的仓库,里面有很多不同目录下的小创意编码项目。有时我修改了分支上的一个目录,它变成了我想要保留的新目录。
在我的repo中,我有一个目录Dir
,其中包含一个项目。
在Experiment
分支上,Dir
偏离master
。实际上我现在想保留Dir
的两个变体,master
上的原始版本和Experiment
上的版本。
我怎么能在master
上结束它现有的Dir
和目录ExperimentDir
,Dir
的版本目前位于分支Experiment
上?
实际上,我在单个repo中分叉一个目录。我可以只是复制和粘贴,但是我想保留两个分支对这些文件的更改历史.
我尝试了分支Experiment
到git mv Dir ExperimentDir
,然后合并到master
。但是我留下了一个复杂的合并冲突,因为git试图在重命名中合并以避免重复。
我通过改编jthill的答案https://stackoverflow.com/a/66609162找到了一个解决方案。这个问题和答案解决了一个更普遍的问题,这就是我找不到它的原因。感觉有必要回答这个特定的场景:将单个目录合并到一个重命名的目录中,而不将其与原始目录合并。
-
在分支
Experiment
上,删除除了发散目录之外的所有内容。将该目录的内容移动到根目录,并删除现在为空的目录。提交。 在git:
git checkout master
git merge --no-commit -s ours Experiment
Automatic merge went well; stopped before committing as requested
git read-tree -u --prefix=ExperimentDir/ Experiment
git commit -m "Merge Experiment subtree into ExperimentDir"
git checkout master
git merge -s subtree Experiment
Merge made by the 'subtree' strategy.
注意,当记录ExperimentDir
目录时,我需要使用--follow
来查找历史记录,但是当记录Dir
时,我需要使用而不是使用-follow
来避免同时包含ExperimentDir
的历史记录。