vik*_*dat 8 git github git-commit
我想摆脱远程分支上的一些提交.例如,如果历史记录如下:
A->B->C->D
Run Code Online (Sandbox Code Playgroud)
我想删除C和D给我:
A->B
Run Code Online (Sandbox Code Playgroud)
哪个B现在是HEAD?
Dan*_*her 14
我将列出为您删除提交的所有不同方法以及何时应该使用它们. 在你做任何这些之前,我强烈建议你将你的分支机构复制到另一个分支机构,以确保安全.
通过执行此操作git checkout -b copy_branch
然后切换回原始分支git checkout the_branch_i_want_to_delete_from_again
如果你已经推动了,就像在你的情况下,你可以跳到#3,但如果你没有推,你可以看看1和2.
1)我还没有推或没有单独工作,我想删除的提交是最近的提交:
如果我有:A --- B --- C --- D.
我想删除C和D.
然后做 git reset --hard sha_of_B
结果是:A --- B.
如果你已经推动了,就像在你的情况下,你仍然可以这样做,然后做一个git push --force origin the_branch
,但不建议这样做,因为你可能会弄乱其他人在这个项目上工作.你应该遵循#3.
2)我还没有推或我独自工作,我要删除的提交是在我的分支中间:
如果我有:A --- B --- C --- D.
我想删除C.
git rebase -i sha_of_B_the_commit_before_the_one_i_want_to_delete
Run Code Online (Sandbox Code Playgroud)
这打开了非常有用的交互式rebase屏幕:
pick sha_of_C C
pick sha_of_D D
Run Code Online (Sandbox Code Playgroud)
当git提示你"#如果你在这里删除一行,那么COMMIT将会丢失." 这就是我们要做的.
我删除了这行pick sha_of_C C
,这让我:
pick sha_of_D D
Run Code Online (Sandbox Code Playgroud)
我用vq将其保存在vi中,结果是:
A --- ---乙d
如果你已经推动了,就像在你的情况下,你仍然可以这样做,然后做一个git push --force origin the_branch
,但不建议这样做,因为你可能会弄乱其他人在这个项目上工作.你应该遵循#3.
3)我已经推了,我正和其他人一起工作:
如果我有:A --- B --- C --- D我想删除C和D.
然后做
git revert sha_of_D
Run Code Online (Sandbox Code Playgroud)
请注意,您可能必须在此处解决冲突然后提交.然后做
git revert sha_of_C
Run Code Online (Sandbox Code Playgroud)
请注意,您可能必须在此处解决冲突然后提交.
这导致:
A --- ---乙Ç--- --- d --- Reverted_D Reverted_C
这是可以安全推送的,因为你实际上只是添加一个提交来反转所有C和D的更改,实际上是删除它.
git push --force
除非绝对必要,否则通常应该避免不惜一切代价.但是如果你要做一个推力,使用保护,你应该在这之前复制你的分支.如果你已经完全按下,那么坚持#3通常是一个很好的规则.
希望这很有帮助.
担
归档时间: |
|
查看次数: |
1478 次 |
最近记录: |