我想要解决几个高级场景,但我不知道如何解决。我希望你能提供帮助:
A - B - C - D - E
。我想将提交D
中的更改添加到提交B
并删除提交D
。怎么样?A - B - C
。提交B
包含一个不应提交的文件。如何从提交中删除它?A - B - C - D
。提交C
包含应该使用提交B
提交的文件。如何从提交C
中删除它并将其添加到提交B
?请注意:所有提交仅在我的工作副本中,尚未推送。
答案 0 :(得分:8)
我的答案使用git rebase
非常多。如果您不熟悉变基,be sure to read this chapter on git rebase first
git cherry-pick B
rebase -i A
并交换C / D版本,将B + D压在一起。 git rebase -i B
,将B标记为编辑并应用更改。
现在真的从对象数据库中删除对象,您可能需要在包含该对象的所有分支上使用filter-branch。之后,reflogs可能需要一段时间才能过期。如果对象是安全敏感对象,您可能需要
git gc --aggressive --prune=tomorrow
。 Pro Git book has a section on removing objects。{{3}}。
git-filter-branch
始终记得包含--tag-name-filter cat
,请参阅评论
如果所有C都在B中,只需
git rebase -i B
用壁球标记C
,它会将提交压缩在一起。
如果它涉及到更多(只有C中的一个文件需要进入B),我会将作业分成更小的步骤,可以按照上述步骤解决:
- 将提交C拆分为两部分:一部分(C.1)合并为提交B,另一部分(C.2)保持为新的“C”。例如。来自上面链接的Git Pro章节:
例如,如果要拆分提交,则应为该提交指定“编辑”:
pick fc62e55 added file_size pick 9824bf4 fixed little thing edit 21d80a5 added number to log pick 76b9da6 added the apply command pick c264051 Revert "added file_size"
然后当你到达命令行时,你恢复该提交并创建两个(或更多)新提交。让我们说21d80a5修改了两个文件,file1和file2,你想将它们拆分成单独的提交。您可以在rebase将您放到命令行后执行此操作:
$ git reset HEAD^ $ git add file1 $ git commit 'first part of split commit' $ git add file2 $ git commit 'second part of split commit' $ git rebase --continue
现在不是5次提交,而是6次。
- 重新合并提交B和C.1