我有两个分支branch_a
和branch_b
。
branch_a
:
dir_1/a lot of files
branch_b
:
dir_1/a lot of changes
我现在认为最好不要合并,而是保留两个目录。
所需结果:
dir_1/a lot of files
dir_2/a lot of changes
当然,我可以将所有文件从branch_b
复制到dir_2
,但这会丢失历史记录。有没有解决的办法?
我有两个分支branch_a
和branch_b
。
branch_a
:
dir_1/a lot of files
branch_b
:
dir_1/a lot of changes
我现在认为最好不要合并,而是保留两个目录。
所需结果:
dir_1/a lot of files
dir_2/a lot of changes
当然,我可以将所有文件从branch_b
复制到dir_2
,但这会丢失历史记录。有没有解决的办法?
如果可能的话,我将避免完全并排放置两份您的内容。这将使两者的合并更加复杂。但是,如果没有更多信息,我无法建议其他方法,所以请按此处。
我假设User.where('created_at > ?',Time.zone.now).order(created_at: :asc).limit(1)
和branch_a
有一些共同的祖先提交,但彼此之间并不简单。如果是这样,这很可能行不通,因为任何合并尝试都会导致快进,包括重命名步骤。
在包含“旧版”版本的branch_b
中,将branch_a
移至其预期路径:
dir_1
我建议为合并结果创建一个单独的分支,以便您可以执行类似的操作
$ git checkout branch_a
$ git mv dir_1 dir_1-legacy
$ git commit -m 'Created separate folder'
如果您只想用结果更新$ git checkout -b branch_transition branch_b
,请这样做
branch_b
无论哪种情况,您现在都可以在两个文件夹中合并,保留每个文件夹的历史记录:
$ git checkout branch_b
对于失败的自动合并,必须执行步骤$ git merge branch_a
CONFLICT (modify/delete): dir_1/XXX deleted in a and modified in HEAD. Version HEAD of dir_1/XXX left in tree.
...
Automatic merge failed; fix conflicts and then commit the result.
$ git add dir_1
$ git commit -m 'Merged divergent paths'
,这恰好是您在这种情况下想要的。
我还建议将git add dir_1
退回一次提交,以使以后的任何更改都不会在branch_a
文件夹上起作用:
dir_1-legacy
重新合并
转换完成后,您可以使用类似的技术重新合并两个文件夹。假设您在git checkout branch_a
git reset --hard HEAD~
上,并且希望将两个文件夹合并在一起。为此,您可以创建一个新的临时分支,在每个分支中删除该文件夹的一个版本,重命名一个版本,然后合并:
branch_transition
根据我的实验,您将需要使用git checkout branch_transition
# Create temp branch to hold the legacy code
git checkout -b temp_transition
git rm dir_1
git mv dir_1-legacy dir_1
git commit -m 'Converted legacy to baseline'
# Set up merge on the transition branch
git checkout branch_transition
git rm dir_1-legacy
# Do the merge
git merge --strategy ours temp_transition
git branch -d temp_transition
来获得非传统版本,以胜过传统版本。这与--strategy ours
的操作不同,后者无法正常工作。