Как удалить некоторые прошлые дубликаты Git? - PullRequest
1 голос
/ 08 июля 2019

В моем офисе я обнаружил, что передал секретный файл в 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

'commit 1' и 'commit 2' имеют дубликаты.Также один коммит 'commit 1's, один коммит' commit 2's и 'Merge branch ...' содержит конфиденциальный файл, который я удалил.Он был перезагружен с рабочего стола github прямо сейчас.

Мне нужно удалить три коммита, не касаясь других коммитов.

Ответы [ 3 ]

2 голосов
/ 08 июля 2019

Лучшее, что я могу придумать, - это использовать 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.

Более подробные инструкции здесь .

1 голос
/ 08 июля 2019

В этом случае ваша локальная ветвь, скорее всего, находилась в исходном (предварительно очищенном) состоянии, а удаленная ветвь была в измененном состоянии.После переписывания истории вы должны удалить все локальные копии или сбросить локальную ветвь на удаленную.Однако теперь вам нужно выполнить некоторую очистку самостоятельно.

Мой локальный сервер был чистым, пульт не был

Если вы очистили свою локальную ветку, вы в конечном итоге получили следующее:

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.Вы можете сделать это с интерактивной перебазировкой, как с ответом нитишагара , или вы можете сделать это, сбросив ветку:

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

Имейте в виду, что вы переписываете историю снова в основную ветку.Учитывая, что ваши исходные коммиты содержат конфиденциальный файл, и вы ранее были рады переписать историю мастера, чтобы избавиться от этого, вероятно, вы можете сделать это снова.Просто убедитесь, что другие пользователи этого хранилища знают ситуацию.

1 голос
/ 08 июля 2019

Я думаю, что это именно то, что вы ищете здесь: "Справка по недавно сделанным дублирующим коммитам"

РЕДАКТИРОВАНИЕ: Я думаю, что приведенная выше ссылка лучше подходит для вашей ситуации, поскольку ваши commit_ID могут быть одинаковыми. Но если идентификационные данные не указаны, я не понимаю, почему это не сработает.

также это может быть полезным: Помощь Github при отмене коммита

возможно, выполнение перечисленных здесь подсказок может отменить коммиты, от которых вы хотели бы избавиться.

Выполнение этого: "git revert {commit_id}" и использование идентификатора коммитов, от которого вы хотели бы избавиться, может работать. Howeve

Существует также раздел об отмене вашего последнего коммита, но похоже, что вам нужно отменить 3. Убедитесь, что у вас есть резервная копия на всякий случай!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...