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

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

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

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

27 ответов


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

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

git reset --hard HEAD~1

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

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

git reset --hard <sha1-commit-id>

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

git push origin HEAD --force

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

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


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


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


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

git rebase -i HEAD~N

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

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

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


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

git rebase -i <commit>~1

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


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

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

git reset --soft HEAD~1

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


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

git rebase -p --onto SHA^ SHA

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

http://sethrobertson.github.io/GitFixUm/fixup.html


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

$ git reset --hard HEAD^

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

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

$ git revert HEAD

git reset --hard commitId

git push <origin> <branch> --force

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


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

git reset HEAD~1

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

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

git reset HEAD~N

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

git reset --hard HEAD~1

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

git reset --hard HEAD~N

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

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

git rebase -i HEAD~<number of commits to go back>, so git rebase -i HEAD~5 Если вы хотите, чтобы увидеть последние пять коммитов.

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

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

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


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

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

Примечание: у вас должны быть права администратора на репо если вы используете --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 для удаленного РЕПО.

git rebase -i HEAD~2

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

'git rebase -i HEAD`

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

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

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 " или удалить строку с фиксацией.


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

git reset --hard HEAD~1

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

git push origin HEAD --force

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

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

git reset --hard COMMIT_ID

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

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

git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

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


ошибка:

Я 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 <SHA> работал, я обновил другую ветку до master и 1... 2... пуф! фиксация была возвращена-git выигрывает.

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

решение:

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

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

https://twitter.com/holman/status/706006896273063936

Добрый день.


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

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


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

git commit --amend -m "New message here"

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

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

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

документы: http://git-scm.com/docs/git-commit.html


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

git revert GIT_COMMIT_HASH

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

git push  

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


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

git reset --hard HEAD~1

git push -f origin

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


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

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

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

git reset --hard origin/master

источник:https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

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

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

git push origin +aa61ab32^: master

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

шаги

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

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

git reset HEAD^ --hard

git push origin -f

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

git reset bb676878^ --hard

git push origin -f

сброс на локальную ветку

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

принудительный толчок к началу

git push -f origin

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


git reset --hard

git push origin HEAD -- force

если один или несколько коммитов помечены, сначала удалите тег(ы). в противном случае помеченная фиксация не удаляется.


использовать git revert https://git-scm.com/docs/git-revert .Он вернет весь код, тогда вы можете сделать следующий commit.Тогда голова будет указывать на последний коммит. отмененные коммиты никогда не удаляются, но это не повлияет на последний коммит.


delete local commit

как вы можете видеть на изображении выше, я хочу удалить revert" test change 2 " commit(SHA1 ID:015b5220c50e3dfbb1063f23789d92ae1d3481a2(вы можете получить идентификатор SHA1 с помощью gitk команда в Git bash)).

для этого я могу использовать(все приведенные ниже команды работают только на местных. вам нужно нажать после удаления):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2 / / это резервное копирование вас на эту фиксацию (SHA1 ID изменение тест 4 commit is 515b5220c50e3dfbb1063f23789d92ae1d3481a2)
  2. git reset --hard HEAD~1 / / это резервное копирование перед одним коммитом.
  3. git reset --hard HEAD^ / / чтобы удалить последнюю фиксацию из git

после "удалить":

after delete commit


создайте резервную копию кода в папке temp. Следующая команда сбросит то же, что и сервер.

git reset --hard HEAD
git clean -f
git pull

Если вы хотите сохранить свои изменения и удалить последние коммиты

git reset --soft HEAD^
git pull