2016-08-02 39 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,他们会在另一次被垃圾收集清理。在此之前,他们是您的安全网,如果您在任何时候感到困惑,都可以再次检查并重新开始。

相关问题