我有两个功能分支,我做错了提交而推送一些提交到错误的分支就是这样的情况:< / p>
$("#diagram").kendoDiagram({
.......
layout: false,
.......
});
所有提交都被推送到Branch1。
我想从本地和远程分支机构以及历史记录中删除Branch1: commit1 -> commit2 -> commit3 -> commit4
和commit2
。我不想触摸主人或任何其他分支,只需从特定分支中删除两个非连续的 PUSHED提交
答案 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中包含的提交数)。
您将看到一个看起来像这样的屏幕
在您要删除的提交中使用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
,它们将在另一时间被垃圾收集清理。在那之前,它们是你的安全网,如果你在任何时候感到困惑,你可以再次检查它们并重新开始。