在我的办公室,我发现我已将一个敏感文件提交给github。所以我用BFG Repo-Cleaner从过去的提交中删除了文件。所以它被删除了,我很高兴。我猜当时提交哈希值已更改。
我回到家,打开了一个github桌面。它说我需要从起源中撤出,我做到了。直到那时都没有问题。
但是随后github桌面说我必须推送3次提交。这很奇怪,但我很好奇,所以我同意推动。我不应该这样做现在所有提交都重复了。
就像这样(最近提交在上面):
5 min ago : Merge branch 'master' of https:....
3 hrs ago : commit 3
22 hrs ago : commit 2
22 hrs ago : commit 2
00 days ago : commit 1
00 days ago : commit 1
00 days ago : initial commit
“提交1”和“提交2”重复。 另外,“提交1”的一次提交,“提交2”的一次提交和“合并分支...”都有我删除的敏感文件。现在,它已从github桌面重新上传。
我需要删除三个提交而又不触及其他提交。
答案 0 :(得分:2)
我能想到的最好的方法是在这里使用rebase
来重写历史记录,然后执行push force
。以下是一些可以在此处提供帮助的步骤:
$> git rebase -i HEAD~6 // takes in 6 commits you want to edit
// Update the ones which you want to drop
drop xxxxxx initial commit
pick xxxxxx commit 1
drop xxxxxx commit 1
pick xxxxxx commit 2
drop xxxxxx commit 2
pick xxxxxx commit 3
drop xxxxxx Merge branch 'master' of https:....
注意:提交的列出顺序与通常相反 使用
log
命令查看它们。
更详细的说明here。
答案 1 :(得分:1)
我认为这可能正是您在这里寻找的内容:"recently made duplicate commits help"
编辑:我认为上面的链接对于您的情况更好,因为您的commit_ID可能相同。如果ID不在,我不明白为什么这行不通。
这也可能有用:Githubs help on undoing a commit
也许运行这里列出的提示,可能会撤消您想要删除的提交。
运行此命令:“ git revert {commit_id}”,并使用您想要删除的提交ID可能会起作用。霍夫
还有一个有关撤消上一次提交的部分,但这听起来像您需要撤消3。一定要进行备份以防万一!
答案 2 :(得分:1)
在这种情况下,您的本地分支很可能处于原始(预先清除)状态,而远程分支则处于更改状态。重写历史记录后,应删除任何本地副本,或将本地分支重置为远程分支。但是,现在您需要自己进行一些清理。
如果您清理了本地分支机构,则最终结果如下:
M─┐ eeeee Merge branch 'master' of ...
│ o ddddd Original Commit 2
│ o ccccc Original Commit 1
o │ bbbbb Commit 3
o │ aaaaa Cleaned Commit 2
o │ 99999 Cleaned Commit 1
o─┘ 88888 Previous Commit
在这里,您需要摆脱99999
和aaaaa
。您可以像使用nitishagar's answer那样通过交互式变基来完成此操作,也可以通过重置分支来完成此操作:
git reset --hard bbbbb
git push --force origin master
如果清理了遥控器,您的历史记录可能如下所示:
M─┐ eeeee Merge branch 'master' of ...
│ o ddddd Commit 3
│ o ccccc Original Commit 2
│ o bbbbb Original Commit 1
o │ aaaaa Cleaned Commit 2
o │ 99999 Cleaned Commit 1
o─┘ 88888 Previous Commit
在这种情况下,aaaaa
是前一个origin/master
,而ddddd
是您的本地分支。您最终想要得到的是:
o ddddd Commit 3
o─┘ aaaaa Cleaned Commit 2
o 99999 Cleaned Commit 1
o 88888 Previous Commit
您可以使用一个单一的基准即可做到这一点(甚至可以添加-i
来确认它正在按照您的期望进行操作):
git checkout master
git rebase --onto aaaaa ddddd^
git push --force origin master
无论您在本地分支上进行了多少次提交,都可以使用此方法。您可以直接引用ccccc
(要删除的最新本地提交)或ddddd^
(要保留的第一个提交的父提交)。
请注意,您将历史记录再次重写为master分支。鉴于您的原始提交包含敏感文件,并且您以前很乐意重写master的历史记录以摆脱此情况,因此可以再次执行此操作。只要确保让此存储库的任何其他用户知道这种情况即可。