我花了几个小时耗尽了我的google-foo技能,没有什么可展示的,所以这里有一个问题,来自git新手的git用户更多经验......
情景:
我有两个分支--B1和B2
B2从B1分支并具有以下提交--C5,C6,C7
提交C5有以下更改:
现在,如果可能的话,我只想将C5的一部分合并到B1,即“删除多个文件”的更改。
我应该直接在B1中删除这些相同的文件并提交,还是有更好的方法?
目的是最终将B1和B2合并在一起,所以如果在单独提交的两个分支中删除相同的文件,我不确定是否会出现问题。
我很感激您的任何意见。
答案 0 :(得分:1)
无法仅合并提交的一部分。
然而,您可以reset
(软或混合)在C5
之前提交,在两个单独的提交中提交更改和删除,并在其上应用您的其他提交。但是,这将改变您的分支历史记录,因此如果您将分支推送到远程和/或其他任何人正在您的提交之上工作,那么您应该不这样做。
第一个可取的步骤,就像你想弄乱你的分支机构的历史一样,就是创建一个备用分支,以防一切都在南方。 git branch backup_branch
这样做。如果你搞砸了所有事情,你可以git checkout backup_branch
并在你的旧舞台上。
然后,你可以做git reset --hard HEAD~2
。这会在您提交C5
后立即将所有文件设置回状态。我们现在丢失了提交C6
和C7
的更改,但稍后可以在我们的新提交之前cherry-pick
。
现在神奇的步骤是git reset HEAD~1
。这将执行混合重置,将分支重置为C5
之前的提交,但将您在C5
中所做的所有更改保留为工作目录中的非分段更改。现在,您可以暂存所有删除,执行提交,然后暂存所有更改并执行另一次提交。 Voilà,两个单独的提交,一个删除,一个有变化。
要获取其他提交C6
和C7
,您可以git checkout backup_branch
,git log -n2
向您显示有关这两个提交的信息及其SHA ID。回到原始分支,您可以git cherry-pick
一个接一个地提交,或者同时提交两个。
您的数据将处于旧状态,但您的C5
提交已由两个单独的提交替换。 Cherry选择其中一个到你的B1
分支,就是这样。
答案 1 :(得分:0)
假设C5更改了foo.c并删除了bar.c。
git checkout B1
git cherry-pick C5 -n
git reset HEAD -- foo.c
git commit
这是最简单的方案。但在您的情况下,更改了更多文件,因此您需要重置所有已更改的文件。这可能不比直接从B1删除bar.c文件更方便。