我想把一个非常凌乱的分支清理成一个新的分支,我只希望得到一些状态。
最初的解决方案是复制粘贴方法:
$ git checkout 1234567
$ cp -r . /tmp/git
$ git checkout -b new old
$ git ls-files | xargs rm
$ cp -r /tmp/git .
$ git commit -a -m "Step 1"
...
我认为git merge --squash -X theirs
会产生同样的效果,但即使是Automating merge went well
,当我git diff --stat 1234567
时,我仍然会看到差异。
我显然错过了关于--squash -X theirs
的一些事情。
如何使用native git命令重现我的复制粘贴方法。我们的想法是将提交状态压缩到另一个分支,而不仅仅是正常rebase所做的差异。
另一种方法是使用此命令:
$ git ls-files | xargs rm && git checkout 1234567 $(git ls-tree --name-only -r 1234567)
$ git commit -a -m "New commit name"
实际上我已将此别名添加到我的.gitconfig
:
[alias]
import = "!sh -c 'git cat-file -e $0 && \
git ls-files | xargs rm -f && \
git checkout $0 $(git ls-tree --name-only -r $0)'"