Git在合并期间忽略已删除的文件夹?

时间:2017-11-15 16:33:25

标签: git modularization

开发人员一直致力于从f1分支出来的某个功能分支master

由于回购的模块化程度较低(系统是模块化的,但生活在一个整体的回购中)和其他原因,开发人员决定删除一堆不相关的东西" ({1}}分支中的(与其功能无关的其他模块)。功能单元测试成功,但分支现在包含系统的所有其他模块的所有这些删除。

f1合并回f1而忽略文件夹删除的最简单,最轻松的方法是什么?假设master中修改的一些文件也在f1的演变中被修改。

附加要求 合并后master分支上的工作可能需要持续一段时间。我不太确定到目前为止提出的答案会如何影响。

2 个答案:

答案 0 :(得分:1)

我希望我的git-fu符合标准 假设MERGE_SOURCE是您要合并的分支,此处F1PRESERVED_PATHS是需要恢复的路径列表:

# Find out the commit from which F1 forked
MERGE_SPLIT_POINT=`git merge-base HEAD ${MERGE_SOURCE}`

# Rewrite the branch's history to unstage all changes
# (including removals) of the preserved paths
git filter-branch \
    --index-filter 'git reset ${MERGE_SPLIT_POINT} -- ${PRESERVED_PATHS}' \
    -- ${MERGE_SPLIT_POINT}..${MERGE_SOURCE}

# Regular merge with the resulting new branch
git merge ${MERGE_SOURCE}

答案 1 :(得分:0)

假设您的源历史记录质量优先,我建议您重写F1的历史记录以排除删除。任何"无痛的解决方案"将会留下奇怪的删除和添加,这将使项目演变的未来分析变得复杂。

(顺便说一句,删除"我没有工作的项目部分"的做法客观上是不正确的。请参阅"稀疏结账"对于潜在的解决方案不客观地不正确。)

拥有F1分支副本的开发人员越多,并且基于F1分支的任何人拥有的更改(如果有的话)越多,历史重写就越繁琐。但是,如果这是一个仅由一个开发人员处理的功能分支,并且没有将该功能的合并推送到原点,那么它可能相当简单。

如果F1本身是线性的,则可以使用rebase。例如

x -- x -- x -- x <--(master)
      \
       A -- B -- C <--(F1)

因为master..F1(可以从F1到达的提交集但无法从master; ABC进入这个例子)不包含任何合并,并且没有其他分支基于master..F1中的任何提交,这是rebase的一个简单案例。

git rebase -i master f1

你会看到一个&#34; TODO&#34;包含F1上每个提交的条目的列表。将第一个提交的命令从pick更改为edit。退出编辑器,开始使用rebase。

在暂定接受A&#34;&#34;后,rebase暂停并给出提示。现在您需要放回已删除的文件。您可以使用git show --name-status之类的内容来识别已删除的文件,并使用git checkout HEAD^ -- path/to/deleted/file/or/directory来恢复已删除的内容。

恢复完所有文件后git commit --amend。然后继续改造。

还有其他程序可行;这是最简单的案例之一。

在rebase之后,如果之前曾经推过F1,那么你可能需要强制推动它。 git push -f此时,在本地仓库中拥有F1副本的任何人都需要恢复(请参阅&#34;从git rebase文档中的上游rebase&#34;恢复)。如果有人根据F1工作,他们就必须将其重新绑定到新的F1

您应该可以针对新的F1完成合并,而不会发生删除问题。