开发人员一直致力于从f1
分支出来的某个功能分支master
。
由于回购的模块化程度较低(系统是模块化的,但生活在一个整体的回购中)和其他原因,开发人员决定删除一堆不相关的东西" ({1}}分支中的(与其功能无关的其他模块)。功能单元测试成功,但分支现在包含系统的所有其他模块的所有这些删除。
将f1
合并回f1
而忽略文件夹删除的最简单,最轻松的方法是什么?假设master
中修改的一些文件也在f1
的演变中被修改。
附加要求
合并后master
分支上的工作可能需要持续一段时间。我不太确定到目前为止提出的答案会如何影响。
答案 0 :(得分:1)
我希望我的git-fu符合标准
假设MERGE_SOURCE
是您要合并的分支,此处F1
和PRESERVED_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
; A
,B
和C
进入这个例子)不包含任何合并,并且没有其他分支基于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
完成合并,而不会发生删除问题。