申请我有两个特征分支,我做了犯和推一些提交到错误的分支这里的错误是这种情况:重新组织被推送的提交,从分支删除另一个
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