Из-за некоторого плохого сбора вишни мой локальный репозиторий Git в настоящее время на пять коммитов опережает источник, и не в хорошем состоянии. Я хочу избавиться от всех этих коммитов и начать все заново.
Очевидно, что удаление моего рабочего каталога и повторное клонирование сделают это, но загрузка всего с GitHub снова кажется излишним, и неэффективно использует мое время.
Может быть, git revert
это то, что мне нужно, но я не хочу в конечном итоге 10 коммитов до начала (или даже шести), даже если он вернет сам код в правильное состояние. Я просто хочу притвориться, что последние полчаса не было.
Есть ли простая команда, которая сделает это? Это похоже на очевидный вариант использования, но я не нахожу никаких примеров.
Обратите внимание, что этот вопрос конкретно о коммитах , а не о:
- неотслеживаемые файлы
- неустановленные изменения
- постановочные, но незафиксированные изменения
Ответы:
Если ваши лишние коммиты видны только вам, вы можете просто сделать
git reset --hard origin/<branch_name>
вернуться туда, где находится источник. Это сбросит состояние хранилища до предыдущего коммита и отменит все локальные изменения.Выполнение
git revert
делает новые коммиты, чтобы удалить старые коммиты таким образом, чтобы сохранить историю каждого в здравом уме.источник
git reset --hard <commit hash, branch, or tag>
если вы хотите перейти к определенной ссылке, кроме удаленной ветви.master
другой веткой, вам нужно запуститьgit reset --hard origin/<your-branch-name>
git reset --hard origin/<branch_name>
Это также сбросит конфигурацию проекта, поэтому позаботьтесь об этом. У меня есть большой.cfg
файл, который был сброшен по умолчанию. Я должен был потратить часы на это снова.Просто удалите свою локальную главную ветку и создайте ее так:
источник
git reset --hard origin/<branch_name>
Пытаться:
чтобы вернуть голову туда, где вы хотите быть. Используйте gitk, чтобы увидеть, на какой коммит вы хотите попасть. Вы можете сделать сброс в Gitk, а также.
источник
Удалить самый последний коммит:
git reset --hard HEAD~1
Удалите самый последний коммит, не разрушая работу, которую вы сделали:
git reset --soft HEAD~1
источник
Если вы используете приложение Atlassian SourceTree , вы можете использовать опцию сброса в контекстном меню.
источник
На вашей ветке попытка:
Подтвердите обращение (к состоянию, без локальных фиксаций), используя "
git log
" или "git status
" следовательно.источник
Just to be clear, if you're not working on master but on another branch, you should run git reset --hard origin/<your-branch-name>
git reset --hard @{u}
* удаляет все ваши локальные изменения в текущей ветке, включая коммиты. Я удивлен, что никто еще не опубликовал это, учитывая, что вам не нужно будет искать, что делать, чтобы вернуться или играть с ветками.* То есть сброс в текущую ветку в —
@{upstream}
обычноorigin/<branchname>
, но не всегдаисточник
Чтобы увидеть / получить идентификатор SHA-1 коммита, к которому вы хотите вернуться
Откат к этому коммиту
!Запись. Все коммиты, которые были сделаны после этого коммита, будут удалены (и все ваши изменения в проекте). Поэтому сначала лучше клонировать проект в другую ветку или скопировать в другой каталог.
источник
У меня была ситуация, когда я хотел удалить коммит, который не был передан, но коммит был раньше другого. Для этого я использовал следующую команду
git rebase -i HEAD~2
-> это отменит два последних коммитаИ я использовал «drop» для подписи фиксации, которую я хотел удалить.
источник
Удалить неотслеживаемые файлы (незафиксированные локальные изменения)
Безвозвратно удаляя все локальные коммиты и получая последние удаленные коммиты
источник
Для локальных коммитов, которые не выдвигаются, вы также можете использовать
git rebase -i
для удаления или сжатия коммита.источник
git rebase -i
- более общий способ решения многих подобных проблем и может быть полезен в различных ситуациях.drop
ключевое слово (вместо удаления строки) при удалении всех коммитов, чтобы избежать отмены ребаза.Простым решением будет сопоставить локальную главную ветку HEAD с источником / главной веткой HEAD
PS: origin / master - удаленный указатель на ветку master. Вы можете заменить мастер с любым именем филиала
источник
Прежде чем ответить, давайте добавим некоторую предысторию, объясняющую, что это такое
HEAD
. так как некоторые из вариантов ниже приведут к отсоединению головыFirst of all what is HEAD?
HEAD
это просто ссылка на текущий коммит (последний) в текущей ветке.Там может быть только один
HEAD
в любой момент времени. (исключаяgit worktree
)Содержимое
HEAD
хранится внутри.git/HEAD
и содержит 40 байтов SHA-1 текущего коммита.detached HEAD
Если вы не используете последний коммит, то
HEAD
есть он указывает на предыдущий коммит в историиdetached HEAD
.В командной строке это будет выглядеть так - SHA-1 вместо имени ветви, так как
HEAD
не указывает на конец текущей ветвиНесколько вариантов того, как восстановить систему с отключенной HEAD:
git checkout
Это извлечет новую ветку, указывающую на желаемый коммит.
Эта команда вернется к данному коммиту.
На этом этапе вы можете создать ветку и начать работать с этого момента.
git reflog
Вы всегда можете использовать
reflog
также.git reflog
будет отображаться любое изменение, которое обновило,HEAD
и проверка желаемой записи reflog установитHEAD
вернет этот коммит.Каждый раз, когда ГОЛОВКА изменяется, в
reflog
Это вернет вас к желаемой фиксации
git reset --hard <commit_id>
«Переместите» ГОЛОВУ назад к желаемому коммиту.
вы также можете использовать
git rebase --no-autostash
.git revert <sha-1>
"Отменить" данный диапазон фиксации или фиксации.
Команда сброса «отменит» любые изменения, сделанные в данном коммите.
Новый коммит с патчем отмены будет зафиксирован, в то время как оригинальный коммит останется в истории.
Эта схема иллюстрирует, какая команда что делает.
Как вы можете видеть там,
reset && checkout
изменитеHEAD
.источник
Для тех, кто заинтересован в решении Visual Studio, вот упражнение:
Team Explorer
окне подключитесь к целевому репо.Branches
щелкните правой кнопкой мыши интересующую ветку и выберитеView history
.History
окне и выберитеReset -> Delete changes (--hard)
.Это отбросит ваши локальные коммиты и сбросит состояние вашего репо до выбранного коммита. Т.е. ваши изменения после вытащенного репо будут потеряны.
источник
Если Ваша ветка опережает '
origin/XXX
' на 5 коммитов.Вы можете оформить:
И это должно удалить последние 5 коммитов.
источник
Это пригодится, если вы допустили некоторые ошибки в своей локальной копии, и хотите, чтобы они не были по ошибке отправлены в удаленную ветку.
Код SHA можно получить, посмотрев на webVersion вашей git dashboard для последнего коммита в ветке.
Таким образом, вы можете синхронизироваться с последним коммитом на ветке.
Ты можешь сделать
git pull
после того, как вы успешно выполнили полный сброс, чтобы подтвердить ничего нового для синхронизации, т.е. вы увидите сообщение.Ваш филиал обновлен с
Origin/<Branch Name>
источник
Если ваш локальный репо окажется в полном беспорядке, то надежный способ отбросить локальные коммиты в Git - это ...
По моему опыту, Eclipse хорошо справляется с изменяющимся миром. Однако вам может понадобиться выбрать затронутые проекты в Eclipse и очистить их, чтобы заставить Eclipse перестроить их. Я думаю, что другие IDE тоже могут нуждаться в принудительной перестройке.
Дополнительным преимуществом описанной выше процедуры является то, что вы узнаете, использует ли ваш проект локальные файлы, которые не были помещены в git. Если вы обнаружите, что у вас отсутствуют файлы, вы можете скопировать их из «my_broken_local_repo» и добавить их в git. Если вы уверены, что в вашем новом локальном репо есть все, что вам нужно, вы можете удалить «my_broken_local_repo».
источник
Если вы просто хотите отбросить локальные коммиты и сохранить изменения, сделанные в файлах, тогда выполните
git reset @ ~
Другие ответы, адресованные к hard reset
источник