Git удалить коммит из ветки

плюса

188 Репутация автора

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

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

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

Некоторые заметки:

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

После этого вы можете заменить HEAD

N с следующим образом:

Если вы хотите сохранить изменения в файловой системе и просто изменить индекс (историю фиксации), используйте –soft флаг вроде git reset –soft HEAD

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

Сбрасывает индекс и обновляет файлы в рабочем дереве, которые отличаются между и HEAD, но сохраняет те, которые отличаются между индексом и рабочим деревом (т. Е. Которые имеют изменения, которые не были добавлены). Если файл, который отличается от индекса, и индекс не имеют изменений, сброс отменяется.

Revert из предыдущего раздела является мощной командой, которая позволяет отменить любые коммиты в репозиторий. Однако, и оригинальный и «отмененный» коммиты видны в истории ветки (при использовании команды git log ).

Часто мы делаем коммит, и сразу понимаем, что это была ошибка. Было бы неплохо иметь команду «возврата», которая позволила бы нам сделать вид, что неправильного коммита никогда и не было. Команда «возврата» даже предотвратила бы появление нежелательного коммита в истории git log .

01 Команда reset

Мы уже видели команду reset и использовали ее для согласования буферной зоны и выбранного коммита (мы использовали коммит HEAD в нашем предыдущем уроке).

При получении ссылки на коммит (т.е. хэш, ветка или имя тега), команда reset …

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

02 Проверьте нашу историю

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

Выполните:

Результат:

Мы видим, что два последних коммита в этой ветке – «Oops» и «Revert Oops». Давайте удалим их с помощью сброса.

03 Для начала отметьте эту ветку

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

Выполните:

04 Сброс коммитов к предшествующим коммиту Oops

Глядя на историю лога (см. выше), мы видим, что коммит с тегом «v1» является коммитом, предшествующим ошибочному коммиту. Давайте сбросим ветку до этой точки. Поскольку ветка имеет тег, мы можем использовать имя тега в команде сброса (если она не имеет тега, мы можем использовать хэш-значение).

Выполните:

Результат:

Наша ветка master теперь указывает на коммит v1, а коммитов Oops и Revert Oops в ветке уже нет. Параметр –hard указывает, что рабочий каталог должен быть обновлен в соответствии с новым head ветки.

05 Ничего никогда не теряется

Что же случается с ошибочными коммитами? Оказывается, что коммиты все еще находятся в репозитории. На самом деле, мы все еще можем на них ссылаться. Помните, в начале этого урока мы создали для отмененного коммита тег «oops». Давайте посмотрим на все коммиты.

Читайте также:  Программа для работы с gif анимацией

Выполните:

Результат:

Мы видим, что ошибочные коммиты не исчезли. Они все еще находятся в репозитории. Просто они отсутствуют в ветке master . Если бы мы не отметили их тегами, они по-прежнему находились бы в репозитории, но не было бы никакой возможности ссылаться на них, кроме как при помощи их хэш имен. Коммиты, на которые нет ссылок, остаются в репозитории до тех пор, пока не будет запущен сборщик мусора.

06 Опасность сброса

Сброс в локальных ветках, как правило, безопасен. Последствия любой «аварии» как правило, можно восстановить простым сбросом с помощью нужного коммита.

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

Я хотел бы знать, как удалить коммит.

By delete , Я имею в виду, что это как если бы я не сделал эту фиксацию, и когда я делаю толчок в будущем, мои изменения не будут толкать к удаленной ветви.

Я читаю git help, и я думаю, что команда, которую я должен использовать, это git reset –hard HEAD . Правильно ли это?

27 ответов

осторожно: git reset –hard УДАЛИТ ИЗМЕНЕНИЯ РАБОЧЕГО КАТАЛОГА. Обязательно stash любые локальные изменения, которые вы хотите сохранить перед запуском этой команды.

предполагая, что вы сидите на этом фиксации, то эта команда будет wack его.

1 означает фиксацию перед головой.

или, вы можете посмотреть на вывод git log найдите совершение коммита, который вы хотите заархивировать, и после этого:

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

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

если вы уже нажали, может быть, лучше использовать git revert , чтобы создать фиксацию "зеркального изображения", которая отменит изменение. Однако оба коммита будут в журнале.

справка — git reset –hard HEAD отлично, если вы хотите избавиться от незавершенной работы. Он вернет вас к самой последней фиксации и сотрет все изменения в вашем рабочем дереве и индексе.

наконец, если вам нужно найти фиксацию, которую вы "удалили", она обычно присутствует в git reflog если у вас нет мусора в вашем репозитории.

если вы еще не нажали фиксацию в любом месте, вы можете использовать git rebase -i чтобы удалить эту фиксацию. Во-первых, узнайте, как далеко назад эта фиксация (приблизительно). Тогда сделай:

N означает перебазирование последнего N commits ( N должно быть число, например HEAD

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

в книге Git есть хороший на перебазирование С картинками и примерами.

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

еще одна возможность-одна из моих любимых команд:

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

Я добавляю этот ответ, потому что я не понимаю, почему любой, кто только что пытался совершить работу, хотел бы удалить всю эту работу из-за какой-то ошибки с помощью Git!

Если вы хотите сохранить свою работу и просто "отменить" эту команду фиксации (вы поймали перед нажатием на репо):

Читайте также:  Смарт часы самсунг watch обзор

Не используйте –hard флаг, если вы не хотите уничтожить свою работу, выполняемую с момента последнего фиксации.

удаление всей фиксации

очевидно, замените " SHA " ссылкой, от которой вы хотите избавиться. "^"В этой команде является буквальным.

Если вы не публиковали изменения, чтобы удалить последнюю фиксацию, вы можете сделать

(обратите внимание, что это также удалит все незафиксированные изменения; используйте с осторожностью).

Если вы уже опубликовали фиксацию для удаления, используйте git revert

PS: CommitId ссылается на тот, который вы хотите вернуть обратно в

если вы хотите исправить свою последнюю фиксацию, вы можете отменить фиксацию и распаковать файлы в ней, выполнив:

это вернет ваш репозиторий в его состояние до того, как Git добавит команды, которые поставили файлы. Изменения будут внесены в рабочий каталог. HEAD

1 относится к фиксации ниже текущего кончика ветви.

если вы хотите отменить N коммитов, но сохраните изменения кода в своем рабочем каталоге:

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

аналогично, если вы хотите отменить последние N коммитов и не хотите сохранять изменения кода:

Насильственно Изменить Ход Истории

предполагая, что вы не просто хотите удалить последнюю фиксацию, но хотите удалить определенные фиксации последних N фиксаций, перейдите к:

git rebase -i HEAD

, so git rebase -i HEAD

5 Если вы хотите, чтобы увидеть последние пять коммитов.

затем в текстовом редакторе измените слово pick to drop рядом с каждой фиксацией, которую вы хотите удалить. Сохраните и закройте редактор. Вуаля!

Аддитивно Изменить История

попробовать git revert . вернуться создать новая commit, который отменяет указанную фиксацию.

скажем, мы хотим удалить коммиты 2 & 4 из РЕПО.

Примечание: у вас должны быть права администратора на репо если вы используете –hard и -f .

  • git checkout b3d92c5 проверка последнего используемого фиксации.
  • git checkout -b repair создать новую ветку для работы.
  • git cherry-pick 77b9b82 выполнить коммит 3.
  • git cherry-pick 2c6a45b выполнить фиксацию 1.
  • git checkout master оформить заказ мастер.
  • git reset –hard b3d92c5 сброс master до последнего используемого фиксации.
  • git merge repair объединить нашу новую ветку на master.
  • git push -f origin master Push master для удаленного РЕПО.

здесь ‘2’ – это количество коммитов, которые вы хотите перебазировать.

если вы хотите перебазировать все коммиты.

вы сможете выбрать один из этих вариантов.

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit’s log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

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

вы можете просто удалить эту фиксацию с помощью опции " d " или удалить строку с фиксацией.

чтобы удалить в локальной ветви, используйте

чтобы удалить в удаленной ветке, используйте

вот еще один способ сделать это:

Проверьте ветку, которую вы хотите вернуть, затем сбросьте локальную рабочую копию обратно на фиксацию, которую вы хотите быть последней на удаленном сервере (все после этого будет прощай). Для этого в SourceTree я щелкнул правой кнопкой мыши и выбрал "Reset BRANCHNAME to this commit". Я думаю, что командная строка:

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

Читайте также:  Modulenotfounderror no module named tensorflow python

затем перейдите в локальный каталог репозитория и выполните следующую команду:

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

Я git rebase -i –root ‘Эд моей ветви, невежественно думая, что я мог бы перефразировать первое совершение, отличающееся от мастера (GitHub для Windows представление по умолчанию-это сравнение с master, скрывающее его полноту).

я отрастил бороду Силиконовой долины, в то время как 900+ commits загрузились в Sublime. Выйдя без изменений, я зарядил свою батарею, а затем продолжил бриться, так как все 900 + отдельные коммиты небрежно перезагружены-сброс их фиксации до сих пор.

решив победить Git и сохранить исходное время, я удалил этот локальный репозиторий и повторно клонировал с пульта ДУ.

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

Я не хочу git revert – это создаст дополнительную фиксацию, давая Git верх.

git reset –hard HEAD ничего не сделал, после проверки reflog , в последний и единственный HEAD был клон-git выигрывает.

чтобы получить самый последний SHA, я проверил удаленный репозиторий на github.com -незначительная победа.

подумав git reset –hard работал, я обновил другую ветку до master и 1. 2. пуф! фиксация была возвращена-git выигрывает.

проверка обратно в мастер, время, чтобы попробовать git rebase -i , тогда удалите строку. к сожалению, безрезультатно. "если вы удалите строку здесь, то фиксация будет потеряна". Ах. приукрашенным над новой функцией троллить что n00b на 2.8.3 выпуске.

git rebase -i затем d, drop = remove commit .

чтобы проверить, я проверил другую ветку, и вуаля – нет скрытия, чтобы получить / вытащить из Мастера.

все команды выше восстанавливают состояние вашего рабочего дерева и индекса, как они были до совершения фиксации, но не восстанавливают состояние репозитория. Если вы посмотрите на него," удаленная " фиксация фактически не удаляется, она просто не находится на кончике текущей ветви.

Я думаю, что нет средств для удаления фиксации с фарфор команды. Единственный способ-это удалить его из журнала и reflog, а затем выполнить git prune –expire -now .

Если вы просто перепутали свой последний коммит (неправильное сообщение, забыли добавить некоторые изменения) и хотите исправить его, прежде чем толкать его в публичное РЕПО, почему бы не использовать:

если у вас есть новые поэтапные изменения, они будут объединены с последней фиксацией (от которой вы пытаетесь избавиться) и заменят эту фиксацию.

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

вы также можете передать опцию "–no-edit "вместо" – m", Если вы предпочитаете использовать сообщение предыдущей фиксации.

Если вы хотите сохранить историю, показывая фиксацию и возврат, вы должны использовать:

введите сообщение, объясняющее, почему вы возвращаетесь, а затем:

когда вы git log вы увидите как" неправильные " сообщения фиксации, так и сообщения журнала возврата.

что я обычно делаю, когда я совершаю и нажимаю (если кто-то нажал на его фиксацию, это решает проблему):

надеюсь, что это поможет

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

затем каждое место РЕПО было клонировано, запустите:

удалить последний коммит

например, ваш последний commit

git push origin +aa61ab32^: master

теперь вы хотите удалить эту фиксацию, а затем простой способ сделать это следующим образом

сначала сбросьте ветвь на родительский элемент текущей фиксации

Force-нажмите его на пульт дистанционного управления.

для конкретной фиксации, вы хотите сбросить после

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock detector