重新组织推送提交,从分支中删除以应用于其他提交

时间:2016-08-02 09:58:54

标签: git

我有两个功能分支,我做错了提交推送一些提交到错误的分支就是这样的情况:< / p>

    $("#diagram").kendoDiagram({
            .......
            layout: false,
            .......
    });

所有提交都被推送到Branch1。

我想从本地和远程分支机构以及历史记录中删除Branch1: commit1 -> commit2 -> commit3 -> commit4 commit2。我不想触摸主人或任何其他分支,只需从特定分支中删除两个非连续的 PUSHED提交

4 个答案:

答案 0 :(得分: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,其他两个提交不在其中。

答案 1 :(得分:0)

试试这个:

git checkout branch1
git rebase -i commit2~

然后重新订购commit1-&gt; commit3-&gt; commit2-&gt; 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

答案 2 :(得分:0)

运行git rebase -i HEAD~5(其中5指定要在交互式rebase中包含的提交数)。

您将看到一个看起来像这样的屏幕

example

在您要删除的提交中使用pick更改drop。这将删除本地存储库中的提交。

此时剩下要做的就是运行

git push -f

这将强制将您的reconfigured分支推送到您的远程存储库

答案 3 :(得分: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,它们将在另一时间被垃圾收集清理。在那之前,它们是你的安全网,如果你在任何时候感到困惑,你可以再次检查它们并重新开始。