Выбрасывать локальные коммиты в Git
Из-за какого-то плохого сбора вишни мой локальный репозиторий Git в настоящее время на пять коммитов опережает источник, и не в хорошем состоянии. Я хочу избавиться от всех этих коммитов и начать все заново.
Очевидно, что удаление моего рабочего каталога и повторное клонирование сделают это, но загрузка всего с GitHub снова кажется излишним, и неэффективно использует мое время.
Возможно, мне нужен git revert
, но я не хочу в конечном итоге сделать 10 коммитов раньше начала (или даже шести), даже если сам код вернется в нужное состояние. Я просто хочу притвориться, что последние полчаса не было.
Есть ли простая команда, которая сделает это? Это похоже на очевидный вариант использования, но я не нахожу никаких примеров.
Обратите внимание, что этот вопрос конкретно о коммитах, а не о:
- неотслеживаемые файлы
- неустановленные изменения
- постановочные, но незафиксированные изменения
Ответы
Ответ 1
Если ваши лишние коммиты видны только вам, вы можете просто выполнить git reset --hard origin/<branch_name>
чтобы вернуться туда, где находится источник. Это сбросит состояние хранилища до предыдущего коммита и отменит все локальные изменения.
Выполнение git revert
создает новые коммиты для удаления старых коммитов таким образом, чтобы сохранять историю всех в здравом уме.
Ответ 2
Просто удалите локальную ветвь мастера и заново создайте ее так:
git branch -D master
git checkout origin/master -b master
Ответ 3
Try:
git reset --hard <the sha1 hash>
to reset голову, где бы вы ни находились. Используйте gitk, чтобы узнать, с какой фиксацией вы хотите быть. Вы можете сделать reset внутри gitk.
Ответ 4
Удалить самый последний коммит:
git reset --hard HEAD~1
Удалите самый последний коммит, не разрушая работу, которую вы сделали:
git reset --soft HEAD~1
Ответ 5
Если вы используете приложение Atlassian SourceTree, вы можете использовать опцию reset в контекстном меню.
Ответ 6
При попытке вашего ветки:
git reset --hard origin/<branch_name>
Подтвердите отмену (в состояние без локальных коммитов), используя "git log
" или "git status
".
Ответ 7
git reset --hard @{u}
* удаляет все ваши локальные изменения в текущей ветке, включая коммиты. Я удивлен, что никто еще не опубликовал это, учитывая, что вам не нужно будет искать, что делать, чтобы вернуться или играть с ветками.
* То есть, сбросить в текущую ветку в @{upstream}
обычно origin/<branchname>
, но не всегда
Ответ 8
Чтобы увидеть/получить идентификатор SHA-1 коммита, к которому вы хотите вернуться
gitk --all
Откат к этому коммиту
git reset --hard sha1_id
!Заметка. Все коммиты, которые были сделаны после этого коммита, будут удалены (и все ваши изменения в проекте). Поэтому сначала лучше клонировать проект в другую ветку или скопировать в другой каталог.
Ответ 9
Для локальных коммитов, которые не вытолкнуты, вы также можете использовать git rebase -i
для удаления или раздачи фиксации.
Ответ 10
У меня была ситуация, когда я хотел удалить коммит, который не был передан, но коммит был раньше другого. Для этого я использовал следующую команду
git rebase -i HEAD~2
→ будет перебазировать последние два коммита
И я использовал "drop" для подписи фиксации, которую я хотел удалить.
Ответ 11
Удалить неотслеживаемые файлы (незафиксированные локальные изменения)
git clean -df
Окончательно удаляя все локальные коммиты и получая последние удаленные коммиты
git reset --hard origin/<branch_name>
Ответ 12
Для тех, кто заинтересован в решении Visual Studio, вот упражнение:
- В окне
Team Explorer
подключитесь к целевому репо. - Затем в "
Branches
щелкните правой кнопкой интересующую ветвь и выберите " View history
. - Щелкните правой кнопкой мыши фиксацию в окне
History
и выберите " Reset → Delete changes (--hard)
.
Это отбросит ваши локальные коммиты и сбросит состояние вашего репо до выбранного коммита. Т.е. ваши изменения после вытащенного репо будут потеряны.
Ответ 13
Прежде чем ответить, добавим немного предыстории, объясняющей, что это HEAD
. поскольку некоторые из приведенных ниже вариантов приведут к отсоединению головы
First of all what is HEAD?
HEAD
- это просто ссылка на текущий коммит (последний) в текущей ветке.
В любой момент времени может быть только один HEAD
. (исключая git worktree
)
Содержимое HEAD
хранится внутри .git/HEAD
и содержит 40 байтов SHA-1 текущего коммита.
detached HEAD
Если вы не используете последний коммит - это означает, что HEAD
указывает на предыдущий коммит в истории, он называется detached HEAD
.
В командной строке он будет выглядеть как this- SHA-1 вместо имени ветки, поскольку HEAD
не указывает на конец текущей ветки
Несколько вариантов восстановления после отсоединения HEAD:
git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back
Это извлечет новую ветку, указывающую на желаемый коммит.
Эта команда вернется к данному коммиту.
На этом этапе вы можете создать ветку и начать работать с этого момента.
# Checkout a given commit.
# Doing so will result in a 'detached HEAD' which mean that the 'HEAD'
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>
# create a new branch forked to the given commit
git checkout -b <branch name>
Вы также всегда можете использовать reflog
.
git reflog
отобразит любое изменение, которое обновило HEAD
, а проверка нужной записи журнала повторного вызова вернет HEAD
к этой фиксации.
Каждый раз, когда заголовок изменяется, в reflog
будет добавляться новая запись
git reflog
git checkout [email protected]{...}
Это вернет вас к желаемой фиксации
"Переместите" ГОЛОВУ назад к желаемому коммиту.
# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32
# Alternatively, if there work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
- Примечание: (начиная с Git 2.7)
Вы также можете использовать git rebase --no-autostash
.
"Отменить" указанный диапазон фиксации или фиксации.
Команда сброса "отменит" любые изменения, сделанные в данном коммите.
Новый коммит с патчем отмены будет зафиксирован, в то время как оригинальный коммит также останется в истории.
# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>
Эта схема иллюстрирует, какая команда что делает.
Как вы можете видеть, reset && checkout
модифицирует HEAD
.
Ответ 14
git reset --hard <SHA-Code>
Это пригодится, если вы допустили некоторые ошибки в своей локальной копии, и хотите, чтобы они не были по ошибке отправлены в удаленную ветку.
SHA-код можно получить, посмотрев на webVersion вашей git dashboard для последнего коммита в ветке.
Таким образом, вы можете синхронизироваться с последним коммитом на ветке.
Вы можете выполнить git pull
после того, как успешно выполнили полный сброс, чтобы подтвердить, что ничего нового для синхронизации нет, то есть вы увидите сообщение.
Ваш филиал обновлен с помощью Origin/<Branch Name>
Ответ 15
Если ваша ветка опережает ' origin/XXX
' на 5 коммитов.
Вы можете оформить:
git reset --hard HEAD~5
И это должно удалить последние 5 коммитов.
Ответ 16
Если ваш локальный репо полностью запутался, то надежный способ отбросить локальные коммиты в Git - это...
- Используйте "git config --get remote.origin.url", чтобы получить URL-адрес удаленного источника
- Переименуйте локальную папку git в "my_broken_local_repo"
- Используйте "git clone & lt; url_from_1 & gt;" получить свежую локальную копию удаленного репозитория git
По моему опыту, Eclipse хорошо справляется с изменяющимся миром. Однако вам может понадобиться выбрать затронутые проекты в Eclipse и очистить их, чтобы заставить Eclipse перестроить их. Я думаю, что другим IDE тоже может понадобиться принудительная перестройка.
Дополнительным преимуществом описанной выше процедуры является то, что вы узнаете, использует ли ваш проект локальные файлы, которые не были помещены в git. Если вы обнаружите, что у вас отсутствуют файлы, вы можете скопировать их из "my_broken_local_repo" и добавить их в git. Если у вас есть уверенность в том, что в вашем новом локальном репо есть все необходимое, вы можете удалить "my_broken_local_repo".