申請我有兩個特徵分支,我做了犯和推一些提交到錯誤的分支這裏的錯誤是這種情況:重新組織被推送的提交,從分支刪除另一個
Branch1: commit1 -> commit2 -> commit3 -> commit4
所有提交到Branch1的提交。
我想從本地和遠程分支以及歷史記錄中刪除commit2
和commit4
。我不想碰主或任何其他分支,剛剛從特定分支
申請我有兩個特徵分支,我做了犯和推一些提交到錯誤的分支這裏的錯誤是這種情況:重新組織被推送的提交,從分支刪除另一個
Branch1: commit1 -> commit2 -> commit3 -> commit4
所有提交到Branch1的提交。
我想從本地和遠程分支以及歷史記錄中刪除commit2
和commit4
。我不想碰主或任何其他分支,剛剛從特定分支
除去兩個非連續推送的提交你不能從一個分支刪除提交。 但是你可以從選定的提交重新創建一個分支。
一個簡單的方法是在交互模式變基(感謝@Steve!):
git rebase -i SHA_commit1
這會給你提交的名單,像這樣:
pick SHA_commit2 log msg of commit 2
pick SHA_commit3 log msg of commit 3
pick SHA_commit4 log msg of commit 4
刪除提交你不不想要。 第一次移除後的提交將被重播。
另一種方法是重新創建沒有提交一個分支,你不想要的, 例如:現在
# switch to branch1 (if not already on it)
git checkout branch1
# rename it -> it will become the backup
git branch -m branch1-bak
# recreate branch1 from the good point, at commit1
git checkout -b branch1 commit1_SHA
# replay commit3
git cherry-pick commit3_SHA
,branch1
有commit1和commit3,其他兩個提交不在它。
試試這個:
git checkout branch1
git rebase -i commit2~
然後重新排序有commit1-> commit3-> commit2-> commit4
git format-patch commit2~
也許它可能是明智的文件複製走.patch
git reset --hard commit2~
git push -f origin branch1
git checkout feature2
git apply commit1.patch
git apply commit2.patch
這是容易實現。你開始用:
git checkout branch1
的情況是:
commit1 -> commit2 -> commit3 -> commit4
^
|
branch1, HEAD
可以忽略commit4
,因爲它是在年底晃來晃去,將反正丟失。但是,我們必須擺脫commit2
這樣的:
git checkout commit3 # set HEAD to commit3
git revert commit2 # create a "undo-commit2" commit
現在您有:
branch1
|
v
commit1 --> commit2 -> commit3 -> commit4
|
+----> commit5
^
|
HEAD
commit5
仍然包含的commit3
的變化,唯一變化的任何介紹commit2
現在都沒有了。
要清理歷史:
git reset --soft commit1 # set HEAD to commit1, put the diffs into the index
git commit # ... and create a new commit from them.
現在您有:
branch1
|
v
commit1 --> commit2 -> commit3 -> commit4
| |
+------> commit6 +----> commit5
^
|
HEAD
commit6
包含完全相同的文件內容commit5
沒有任何間歇的提交。現在
,讓你的分支點commit6
:
git branch -f branch1
你去那裏:
commit1 --> commit2 -> commit3 -> commit4
| |
+------> commit6 +----> commit5
^
|
HEAD, branch1
最後推送到遠程的:
git push origin branch1 -f
不理會commit2 ... commit5
,他們會在另一次被垃圾收集清理。在此之前,他們是您的安全網,如果您在任何時候感到困惑,都可以再次檢查並重新開始。
這種情況比我的例子更復雜,因爲我有4個以上的提交,所以還有另一種方法來刪除兩個提交(非連續) – iOSGeek
刪除,否。你可以恢復這些提交,但這不是一回事。請注意,'cherry-pick'接受一系列的提交,例如'cherry-pick A..B',所以你不必運行數以百計的櫻桃挑選命令,但只有幾個範圍。 – janos