Как навсегда удалить несколько коммитов из удаленной ветки

Я знаю, что переписывание истории — это плохо, yada yada.

Но как навсегда удалить несколько коммитов из удаленной ветки?


Вы git reset --hard свою локальную ветку, чтобы удалить изменения из рабочего дерева и индекса, и вы git push --force свою измененную локальную ветвь в удаленный. (здесь другое решение, включающее удаление удаленной ветки и ее повторное нажатие)

Этот ответ SO иллюстрирует опасность такой команды, особенно если люди зависят от удаленной истории для своих собственных локальных репозиториев .
Вы должны быть готовы указать людей на раздел ВОССТАНОВЛЕНИЕ ИЗ UPSTREAM REBASE на странице руководства git rebase


В Git 2.23 (август 2019 г., девять лет спустя) вы должны использовать новую команду git switch .
То есть: git switch -C mybranch origin/mybranch ~ n
(замените n на количество удаляемых коммитов)

Это восстановит индекс и рабочее дерево, как это сделал бы git reset --hard .
В документации добавлено:

  -C  --force-create  

Аналогично - create за исключением того, что если уже существует, он будет сброшен на .
Это удобный ярлык для:

  $ git branch -f  $ git switch   

313

Просто обратите внимание на использование last_working_commit_id , при откате нерабочей фиксации

  git reset --hard  

Таким образом, мы не должны сбрасывать до commit_id , который нам не нужен.

Тогда, конечно, мы должны нажать на удаленную ветку:

  git push --force  

Улучшите этот ответ
ответил 18 января ’17 в 17:49
  • 11
    Идеальный, элегантный, простой -й ответ. Я только что вернулся к последнему коммиту, который мне нужен как на удаленном, так и локальном уровне — lauWM, 13 дек. ’17 в 15:13
  • 3
    Это заставило меня потерять и мои локальные изменения. Я этого не ожидал. Но лучше, чем использовать свой личный пароль для работы репо. — Airwavezx, 23 мая ’18, в 8:47
  • 5
    вы можете сохранить свои локальные изменения с помощью git stash …. сделайте кое-что …. и git stash pop (ваши локальные изменения вернулись) — MonTea 29 июля ’18, 13:55
  • Это дает мне ошибку как «удаленный: ошибка: запрещение не-быстрой перемотки вперед refs/Heads/master (вы должны вытащить первым)» — Saurabhcdt 14 ноября ’18 в 9:30
  • @ Airwavezx — это то, что должен делать git reset --hard . — Люк, 31 янв., 20:36
| показать 4 дополнительных комментария

Просто обратите внимание на использование last_working_commit_id , при откате неработающей фиксации

  git reset --hard  

Поэтому мы не должны сбрасывать commit_id , который нам не нужен.

Тогда, конечно, мы должны нажать на удаленную ветку:

   git push --force  

152

Важно: убедитесь, что вы указали, какие ветви в «git push -f», иначе вы можете случайно изменить другие ветки! [*]

Есть три варианта показано в этом руководстве. Если ссылка разрывается, я оставлю основные шаги здесь.

  1. Отменить полную фиксацию
  2. Удалить последнюю фиксацию
  3. Удалить фиксацию из списка

1 Отменить полную фиксацию

   git revert dd61ab23  

2 Удалить последнюю фиксацию

  git push   > + dd61ab23 ^: >  

или, если ветка доступна локально

  git reset HEAD ^ -  -hardgit push > -f  

где + dd61 … — хеш вашего коммита, а git интерпретирует x ^ как родительский элемент x, а + — как принудительное не -fastforwared push.

3 Удалить фиксацию из списка

  git rebase -i dd61ab23 ^  

Откроется редактор со списком всех коммитов. Удалите тот, от которого хотите избавиться. Завершите перебазирование и нажмите принудительно для репо.

  git rebase --continuegit push   -f  

Улучшить этот ответ
отредактировал 16 июля ’18 в 14:56
Элиас Дорнелес
18.6k99 золотых знаков6161 серебряный знак9494 бронзовых знака
ответ дан 17 ноя. : 03
  • 5
    Убедитесь, что вы указали, какие ветки в «git push -f» или вы можете непреднамеренно изменить другие ветки! — Найджел Шеридан-Смит, 30 апр. ’14 в 2:45
  • Только шаги 1 и 2 выполнили задание и ответили на исходный вопрос (не выполняйте шаг 3) — Саад Бенбузид, 11 марта ’16 в 10:01
  • Это варианты для различных сценариев, а не шаги, которые необходимо предпринять. В моем случае интерактивная перебазировка (вариант 3) сделала то, что я искал. — Стив Блэквелл, 5 августа 2016 г., 0: 37
  • Мне пришлось сделать шаг 3. Почему бы вам не запустить этот @Saad? К счастью, мой > был просто «origin» по умолчанию, а — «ma» по умолчанию ster ‘- Барт, 31 окт., в 20:16
  • Мне нравится этот учебник, в котором рассматриваются и четко описаны методы возврата к reset v. — robhem 4 нояб., 20:13
добавить комментарий |

Важно: убедитесь, что вы указали, какие ветви в «git push -f», иначе вы можете случайно изменить другие ветки! [*]

В этом руководстве показаны три варианта. Если ссылка разрывается, я оставлю основные шаги здесь.

  1. Отменить полную фиксацию
  2. Удалить последнюю фиксацию
  3. Удалить фиксацию из списка

1 Отменить полную фиксацию

   git revert dd61ab23  

2 Удалить последнюю фиксацию

  git push   > + dd61ab23 ^: >  

или, если ветка доступна локально

  git reset HEAD ^ -  -hardgit push > -f  

где + dd61 … — хеш вашего коммита, а git интерпретирует x ^ как родительский элемент x, а + — как принудительное не -fastforwared push.

3 Удалить фиксацию из списка

  git rebase -i dd61ab23 ^  

Откроется редактор со списком всех коммитов. Удалите тот, от которого хотите избавиться. Завершите перебазирование и нажмите принудительно для репо.

  git rebase --continuegit push   -f  

56

Если вы хотите удалить, например, последние 3 выполняет фиксацию, выполните следующую команду, чтобы удалить изменения из файловой системы (рабочее дерево) и историю фиксации (индекс) в вашей локальной ветке:

  git reset -  hard HEAD ~ 3  

Затем выполните следующую команду (на вашем локальном компьютере), чтобы заставить удаленную ветвь перезаписать свою историю:

  git push --force  

Поздравляем! Все ГОТОВО!

Некоторые примечания:

Вы можете получить желаемый идентификатор фиксации, запустив

  git log  

Затем вы можете заменить HEAD ~ N на вот так:

  git reset --hard  

Если вы хотите сохранить изменения в файловой системе и просто изменить индекс (историю фиксации), используйте флаг - soft , например git reset --soft HEAD ~ 3 . Тогда у вас будет возможность проверить свои последние изменения и оставить или удалить все или часть из них. В последнем случае runnig git status показывает файлы, измененные с момента . Если вы используете опцию - hard , git status сообщит вам, что ваша локальная ветвь точно такая же, как и удаленная. Если вы не используете - hard или - soft , используется режим по умолчанию: - смешанный . В этом режиме git help reset сообщает:

Сбрасывает индекс, но не рабочее дерево (т.е. измененные файлы сохраняются, но не помечены для фиксации) и сообщает о том, что не было обновлено.

Улучшите этот ответ
отредактировано 11 декабря ’19 в 7:37
ответил 31 августа 2019 в 12:19
добавить комментарий |

Если вы хотите удалить, например, последний 3 , выполните следующую команду, чтобы удалить изменения из файловой системы (рабочее дерево) и зафиксировать историю (индекс) в вашей локальной ветке:

  git reset --hard HEAD ~ 3  

Затем выполните следующую команду (на вашем локальном компьютере), чтобы заставить удаленную ветвь перезаписать свою историю:

  git push --force  

Поздравляем! Все готово!

Некоторые примечания:

Вы можете получить желаемый идентификатор фиксации, запустив

  git log  

Затем вы можете заменить HEAD ~ N на следующим образом:

  git reset --hard  

Если вы хотите сохранить изменения в файловой системе и просто изменить индекс (комм it history) используйте флаг - soft , например git reset --soft HEAD ~ 3 . Тогда у вас будет возможность проверить свои последние изменения и оставить или удалить все или часть из них. В последнем случае runnig git status показывает файлы, измененные с момента . Если вы используете опцию - hard , git status сообщит вам, что ваша локальная ветвь точно такая же, как и удаленная. Если вы не используете - hard или - soft , используется режим по умолчанию: - смешанный . В этом режиме git help reset сообщает:

Сбрасывает индекс, но не рабочее дерево (т.е. измененные файлы сохраняются, но не отмечены для фиксации) и сообщает о том, что не было обновлено.


11

Упрощение из ответа pctroll, аналогично на основе этого сообщения в блоге.

  # ищите идентификатор фиксации в журнале git или на github, например  42480f3, затем dogit checkout mastergit checkout your_branchgit revert 42480f3 # откроется текстовый редактор, закройте его с помощью ctrl + x (зависит от редактора) git push origin your_branch # или замените origin вашим удаленным  

Улучшить этот ответ
отредактировал 23 апреля 2015 в 16:07
23 апр. ’15 в 15:04
  • 2
    У меня работает, спасибо. И я хочу навсегда удалить одну фиксацию (например,. содержит pwd) из истории удаленных веток, как это сделать? — Улыбается 01 февраля ’19 в 3:53
  • 1
    У меня тоже работает, но у меня тот же вопрос, что и у Smiles, я не хочу, чтобы кто-нибудь видел мою фиксацию/откат в истории … как мне это удалить? — Роберто Родригес 06 марта ’19 в 15:09
  • У меня работает. Спасибо — Venky 07 авг., 20:55
добавить комментарий |

Упрощение из ответа pctroll, аналогично на основе этого сообщения в блоге.

  # посмотрите  вверх по идентификатору фиксации в журнале git или на github, например  42480f3, затем dogit checkout mastergit checkout your_branchgit revert 42480f3 # откроется текстовый редактор, закройте его с помощью ctrl + x (зависит от редактора) git push origin your_branch # или замените origin вашим удаленным  

11

Это может быть слишком поздно, но мне помогло крутое звучание «ядерный» вариант. Обычно с помощью команды filter-branch вы можете удалять файлы или что-то менять в большом количестве файлов на протяжении всей истории git.

Это лучше всего объясняется здесь.

Улучшите этот ответ
отредактировано 10 апр ’19 в 20:18
cmaher
4,32311 золотых знаков1818 серебряных знаков3232 бронзовых знака
ответил 13 марта ’14 в 8:50
  • 9
    Еще не поздно. Может оказаться полезным для странников с подобными проблемами 🙂 — Арнис Лапса 13 мар. ’14 в 11:44
добавить комментарий |

Возможно, это слишком поздно, но мне помогло круто звучащее «ядерное» решение. Обычно с помощью команды filter-branch вы можете удалять файлы или что-то менять в большом количестве файлов на протяжении всей истории git.

Это лучше всего объясняется здесь.


4

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

Из вашей локальной ошибочной ветки:

  git log  

скопируйте хеш фиксации, который вы хотел, чтобы ветка находилась и выходила из журнала git

  git checkout theHashYouJustCopiedgit checkout -b your_new_awesome_branch  

Теперь у вас есть новый ветвь так, как вы этого хотите.

Если вам также нужно сохранить конкретную фиксацию из ошибочной ветки, которой нет в вашей новой ветке, вы можете просто выбрать нужную конкретную фиксацию:

  git checkout the_errant_branchgit log  

Скопируйте хэш одного коммита, который вам нужно перетащить, в хорошую ветку и выйдите из git log.

  git checkout your_new_awesome_branchgit cherry-pick theHashYouJustCopied  

Похлопайте себя по спине.

Улучшите этот ответ
ответил 5 ноября ’16 в 14: 19
  • очень просто, и кого это волнует, если у вас ветка с мертвыми ногами? сделайте новую ветку и покончим с этим! — Эндрю Фокс, 27 фев., В 16:31
  • 1
    Это действительно отличный ответ. Я рад, что сделал это вместо того, чтобы собирать вишни или манипулировать удаленной веткой. — Magnilex 05 июн., 20:35
добавить комментарий |

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

Из вашей локальной ошибочной ветки:

  git log  

скопируйте хэш фиксации, в котором должна была находиться ветвь, и выйдите из журнала git

  git checkout theHashYouJustCopiedgit checkout -b your_new_awesome_branch  

Теперь у вас есть новая ветка именно такой, какой вы хотите.

Если вам также нужно сохранить конкретную фиксацию из ошибочной ветки, которой нет в вашей новой ветке, вы можете просто выбрать тот конкретный коммит, который вам нужен:

  git checkout the_errant_branchgit log  

Скопируйте хеш фиксации одного коммита вам нужно зайти в хорошую ветку и выйти из журнала git.

  git checkout your_new_awesome_branchgit cherry-pick theHashYouJustCopied  

Похлопайте себя сзади.


0
  git reset  --soft commit_id git stash save "message" git reset --hard commit_id git stash apply stash stash @ {0} git push --force  

Улучшить этот ответ
отредактировал 22 марта 2018, 06:58
ayushgp
3,81333 золотых знака2828 серебряных знаков6464 бронзовых знака
ответил 14 марта ’18 в 8:17
добавить комментарий |

  git reset --soft commit_id git stash save "message" git reset --hard commit_id git stash применить stash stash  @ {0} git push --force  


Удалить последнюю фиксацию из удаленного репозитория git [дубликат]

Возможный дубликат:
Откат локального и удаленного репозитория git на 1 фиксацию

Как я могу удалить последнюю фиксацию из удаленного репозитория GIT, если я больше не вижу ее в журнале?

Если, например, git log дает мне следующую историю фиксации

  A-> B-> C-> D [HEAD, ORIGIN]  

как я могу перейти к

A->B->C[HEAD,ORIGIN sizes 

Спасибо.


Будьте осторожны, это создаст «альтернативную реальность» для людей, которые уже получили/вытащили/клонировали из удаленного репозитория. Но на самом деле это довольно просто:

  git reset HEAD ^ # локально удалить фиксацию git push origin + HEAD # принудительно нажать новую фиксацию HEAD  

Если вы хотите, чтобы он оставался в вашем локальном репозитории и удалял его только с пульта дистанционного управления, вы можете использовать:

  git push origin + HEAD ^:    

16

Если его никто не тянул, вы, вероятно, можете сделать что-то вроде

  git push remote + branch ^ 1: remotebranch  

, который принудительно обновит удаленную ветку до предпоследнего коммита вашей ветки.

Улучшите этот ответ
ответил 22 ноября 2011 в 10:17
  • 4
    Вы могли также сделать это , если кто-то уже вытащил это. — Себастьян Мах, 19 ноя., 2014, 10:34
  • 6
    Совершенно верно. Хотя вам следует делать это только в том случае, если вы знаете, что делаете и каковы последствия. И если да, то вы, вероятно, не читаете этот ответ. — Михаил Крелин — хакер 19 ноя ’14 в 13:01
добавить комментарий |

Если его никто не тянул, вы, вероятно, можете сделать что-то вроде

  git push  remote + branch ^ 1: remotebranch  

, который принудительно обновит удаленную ветку до предпоследнего коммита вашей ветки.

Оцените статью
logicle.ru
Добавить комментарий