2016-08-02 41 views
1

申請我有兩個特徵分支,我做了一些提交到錯誤的分支這裏的錯誤是這種情況:重新組織被推送的提交,從分支刪除另一個

Branch1: commit1 -> commit2 -> commit3 -> commit4 

所有提交到Branch1的提交。

我想從本地和遠程分支以及歷史記錄中刪除commit2commit4。我不想碰主或任何其他分支,剛剛從特定分支

回答

1

除去兩個非連續推送的提交你不能從一個分支刪除提交。 但是你可以從選定的提交重新創建一個分支。

一個簡單的方法是在交互模式變基(感謝@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,其他兩個提交不在它。

+0

這種情況比我的例子更復雜,因爲我有4個以上的提交,所以還有另一種方法來刪除兩個提交(非連續) – iOSGeek

+0

刪除,否。你可以恢復這些提交,但這不是一回事。請注意,'cherry-pick'接受一系列的提交,例如'cherry-pick A..B',所以你不必運行數以百計的櫻桃挑選命令,但只有幾個範圍。 – janos

0

試試這個:

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 
0

運行git rebase -i HEAD~5(其中5指定要在交互式底圖中包含多少個提交)。

你將屏幕看起來像這樣

example

變化pickdrop上承諾要刪除呈現。這將刪除本地存儲庫中的提交。

所有還剩下些什麼,在這一點上做的是運行

git push -f 

這將強制把你reconfigured分支到遠程倉庫

0

這是容易實現。你開始用:

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,他們會在另一次被垃圾收集清理。在此之前,他們是您的安全網,如果您在任何時候感到困惑,都可以再次檢查並重新開始。

相關問題