Friday, June 21, 2013

How to remove file and commit from history

This post is from here.


假设我们的 commit tree 如下:
R-A-B-C-D-E-HEAD

接下来要移除 B 和 C 的 commit tree, 变成,
R-A-D'-E-HEAD

有两种方式可以移除 B & C
# detach head and move to D commit 
git checkout   < SHA1-for-D > 
# move HEAD to A, but leave the index and working tree as for D 
git reset   --soft   < SHA1-for-A > 
# Redo the D commit re-using the commit message, but now on top of A 
git commit   -C   < SHA1-for-D > 
# Re-apply everything from the old D onwards onto this new place  
git rebase   --onto  HEAD  < SHA1-for-D >  master 
# push it

git push   --force

另一种方法是利用 cherry-pick 方式
git rebase   --hard   < SHA1 of A > 
git cherry-pick   < SHA1 of D > 
git cherry-pick   < SHA1 of E > 

這會直接忽略 B 跟 C 的 history,詳細資料可以查詢 git help cherry-pick 或者是 git help rebase 

No comments:

Post a Comment