使用git rebase——interactive <commit>,你可以把任意数量的提交压缩成一个单独的提交。
这一切都很好,除非您想将提交压缩到初始提交中。这似乎是不可能的。
有什么方法可以实现吗?
适度相关:
在一个相关的问题中,我设法提出了一种不同的方法来满足压缩第一次提交的需要,也就是将其作为第二次提交。
如果你感兴趣:git:如何插入一个提交作为第一个,转移所有其他?
使用git rebase——interactive <commit>,你可以把任意数量的提交压缩成一个单独的提交。
这一切都很好,除非您想将提交压缩到初始提交中。这似乎是不可能的。
有什么方法可以实现吗?
适度相关:
在一个相关的问题中,我设法提出了一种不同的方法来满足压缩第一次提交的需要,也就是将其作为第二次提交。
如果你感兴趣:git:如何插入一个提交作为第一个,转移所有其他?
当前回答
你可以使用git filter-branch。如。
git filter-branch --parent-filter \
'if test $GIT_COMMIT != <sha1ofB>; then cat; fi'
这将导致AB-C丢弃A的提交日志。
其他回答
在最后两次提交被推送到远程服务器之前,可以使用rebase交互来修改它们
git rebase HEAD^^ -i
有一种更简单的方法。假设您在主分支上
创建一个新的孤立分支,它将删除所有的提交历史:
$ git checkout --orphan new_branch
添加你的初始提交消息:
$ git commit -a
摆脱旧的未合并的主分支:
$ git branch -D master
将当前分支new_branch重命名为master:
$ git branch -m master
你可以使用git filter-branch。如。
git filter-branch --parent-filter \
'if test $GIT_COMMIT != <sha1ofB>; then cat; fi'
这将导致AB-C丢弃A的提交日志。
这将把第二次提交压缩到第一次提交中:
a - b - c -…- > AB-C -…
git filter-branch --commit-filter '
if [ "$GIT_COMMIT" = <sha1ofA> ];
then
skip_commit "$@";
else
git commit-tree "$@";
fi
' HEAD
AB的提交消息将从B获取(尽管我更喜欢从A)。
与Uwe Kleine-König的答案具有相同的效果,但也适用于非首字母A。
如果你只是想把所有的提交压缩成一个单独的初始提交,只需要重置存储库并修改第一次提交:
git reset hash-of-first-commit
git add -A
git commit --amend
Git重置将保持工作树的完整性,因此所有内容仍然在那里。因此,只需使用git add命令添加文件,并使用这些更改修改第一次提交。与rebase -i相比,你将失去合并git注释的能力。