Выбрасывать локальные коммиты в 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 в контекстном меню.

enter image description here

Ответ 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, вот упражнение:

  1. В окне Team Explorer подключитесь к целевому репо.
  2. Затем в " Branches щелкните правой кнопкой интересующую ветвь и выберите " View history.
  3. Щелкните правой кнопкой мыши фиксацию в окне 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.

enter image description here

В командной строке он будет выглядеть как this- SHA-1 вместо имени ветки, поскольку HEAD не указывает на конец текущей ветки

enter image description here

enter image description here

Несколько вариантов восстановления после отсоединения HEAD:


git checkout

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>

git reflog

Вы также всегда можете использовать reflog.
git reflog отобразит любое изменение, которое обновило HEAD, а проверка нужной записи журнала повторного вызова вернет HEAD к этой фиксации.

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

git reflog
git checkout [email protected]{...}

Это вернет вас к желаемой фиксации

enter image description here


git reset --hard <commit_id>

"Переместите" ГОЛОВУ назад к желаемому коммиту.

# 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.

git revert <sha-1>

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

# 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.

enter image description here

Ответ 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 - это...

  1. Используйте "git config --get remote.origin.url", чтобы получить URL-адрес удаленного источника
  2. Переименуйте локальную папку git в "my_broken_local_repo"
  3. Используйте "git clone & lt; url_from_1 & gt;" получить свежую локальную копию удаленного репозитория git

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

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