Я случайно передал неправильные файлы в Git , но я еще не отправил коммит на сервер.
Как я могу отменить эти коммиты из локального репозитория?
git
version-control
git-commit
undo
pre-commit
Peter Mortensen
источник
источник
git undo
, это оно. Затем репутация Git по обработке ошибок, совершенных нами, простыми смертными, исчезает. Реализуйте, поместив текущее состояние в стек git перед выполнением любойgit
команды. Это повлияет на производительность, поэтому было бы лучше добавить флаг конфигурации относительно того, включать ли его.alias
функции Git : git-scm.com/book/en/v2/Git-Basics-Git-Aliasesgit reflog
уже близко к тому, что вы описываете, но дает пользователю больше контроля над тем, что должно быть (не) сделано. Но, пожалуйста, нет, «отмена» не везде работает одинаково, и люди ожидают, что эта функция будет реализована по-разному. Отменить последний коммит? Отменить последнее действие? Если последнее действие было нажатием, отмените как (сбросить и нажать) или (повернуть и нажать)?Ответы:
Отменить фиксацию и повторить
git status
, поэтому вам нужно добавьте их еще раз перед совершением). Если вы хотите только добавить больше изменений к предыдущему коммиту или изменить сообщение о коммите 1 , вы можете использоватьgit reset --soft HEAD~
вместо этого, который похож наgit reset HEAD~
2, но оставляет ваши существующие изменения подготовленными.git add
все, что вы хотите включить в свой новый коммит.reset
скопировал старую голову в.git/ORIG_HEAD
;commit
с-c ORIG_HEAD
откроет редактор, который изначально содержит сообщение журнала от старого коммита и позволяет вам редактировать его. Если вам не нужно редактировать сообщение, вы можете использовать-C
опцию.Однако следует помнить, что если вы добавили какие-либо новые изменения в индекс, то при
commit --amend
их использовании они будут добавлены в ваш предыдущий коммит.Если код уже передан на ваш сервер и у вас есть права на перезапись истории (перебазирование), тогда:
Вы также можете посмотреть на этот ответ:
Как я могу переместить ГОЛОВУ назад в предыдущее место? (Отдельная голова) & Отменить фиксацию
Приведенный выше ответ покажет вам,
git reflog,
что используется для определения того, что такое SHA-1, который вы хотите вернуть. Как только вы нашли точку, к которой вы хотите отменить, используйте последовательность команд, как описано выше.1 Учтите, однако, что вам не нужно возвращаться к более ранней фиксации, если вы только что сделали ошибку в своем сообщении фиксации . Более простой вариант -
git reset
(отменить внесение изменений, которые вы сделали с тех пор), а затемgit commit --amend
открыть ваш редактор сообщений по умолчанию, предварительно заполненный последним сообщением.2 так
HEAD~
же, какHEAD~1
. Также смотрите Что такое HEAD в git? , Это полезно, если вы хотите отменить несколько коммитов.источник
git checkout theRightBranch
со всеми этапами изменений. Как я только должен был сделать.git reset --soft HEAD^
вам нужно будет использоватьgit reset --soft HEAD~1
. ^ - это символ продолжения в DOS, поэтому он не будет работать должным образом. Кроме того,--soft
по умолчанию, так что вы можете опустить его, если хотите, и просто сказатьgit reset HEAD~1
.zsh: no matches found: HEAD^
- вам нужно сбежать ^ iegit reset --soft HEAD\^
git commit -a
был выпущен, когда-a
должны были быть опущены. В этом случае лучше не пропускать--soft
(что приведет к тому,--mixed
что это значение по умолчанию), и тогда вы сможете заново изменить изменения, которые вы намеревались зафиксировать.git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec>…]
Отмена коммита немного страшна, если вы не знаете, как он работает. Но на самом деле это удивительно легко, если вы понимаете.
Скажем, у вас это есть, где C - это ваша ГОЛОВА, а (F) - это состояние ваших файлов.
Вы хотите обнулить коммит C и никогда больше его не видеть и потерять все изменения в локально измененных файлах . Ты делаешь это:
Результат:
Теперь Б - ГОЛОВА. Поскольку вы использовали
--hard
, ваши файлы возвращаются в свое состояние при фиксации B.Ах, но предположим, что commit C был не катастрофой, а всего лишь ошибкой. Вы хотите отменить коммит, но сохраните свои изменения для небольшого редактирования, прежде чем сделать лучший коммит. Начиная снова здесь, с C в качестве вашей головы:
Вы можете сделать это, оставив
--hard
:В этом случае результат:
В обоих случаях HEAD - это просто указатель на последний коммит. Когда вы делаете a
git reset HEAD~1
, вы говорите Git переместить указатель HEAD на один коммит. Но (если вы не используете--hard
) вы оставляете свои файлы, как они были. Итак, теперьgit status
показывает изменения, которые вы зарегистрировали в C. Вы ничего не потеряли!Для легкого прикосновения вы можете даже отменить фиксацию, но оставить свои файлы и индекс :
Это не только оставляет ваши файлы в покое, но даже оставляет ваш индекс в покое. Когда вы это сделаете
git status
, вы увидите, что в индексе есть те же файлы, что и раньше. Фактически, сразу после этой команды вы могли бы выполнитьgit commit
и повторить тот же коммит, который только что сделал.Еще одна вещь: предположим, вы уничтожили коммит, как в первом примере, но потом обнаружили, что он вам нужен в конце концов ? Не повезло, правда?
Нет, еще есть способ вернуть его. Тип
git reflog
и вы увидите список (частично) совершать ШАС (то есть, хэш) , что вы переместились вокруг в Найти коммит вы уничтожили, и сделать это.:Вы сейчас воскресили этот коммит. Комитеты на самом деле не уничтожаются в Git в течение примерно 90 дней, поэтому обычно вы можете вернуться и спасти того, от кого не хотели избавиться.
источник
git reset --hard~1
то ветка master будет указывать на последний коммит внутри ветви объекта. В этом случае вместо соответствующей команды следует использовать конкретный идентификатор фиксации.--hard
но я не осознавал, что все мои неустановленные изменения в моем рабочем дереве также были уничтожены! Я собирался зафиксировать эти файлы как часть последующего коммита. Теперь кажется невозможным вернуть эти файлы - я даже попробовал решение, о котором вы опубликовали,reflog
но это не восстановило ранее неустановленные изменения.Есть два способа «отменить» ваш последний коммит, в зависимости от того, сделали ли вы свой коммит открытым или нет (перенесены в удаленный репозиторий):
Как отменить локальный коммит
Допустим, я зафиксировал локально, но теперь я хочу удалить этот коммит.
Чтобы восстановить все обратно, как это было до последнего коммита, нам нужно сделать
reset
коммит доHEAD
:Теперь
git log
покажет, что наш последний коммит был удален.Как отменить публичный коммит
Если вы уже сделали свои коммиты общедоступными, вы захотите создать новый коммит, который "отменит" изменения, сделанные вами в предыдущем коммите (текущем HEAD).
Теперь ваши изменения будут отменены и готовы к принятию:
Для получения дополнительной информации, ознакомьтесь с Git Basics - Undoing Things .
источник
git revert HEAD^
это не предыдущий, это предыдущий из предыдущего. Я сделал:git revert HEAD
и затем снова нажал, и это сработало :)Добавить / удалить файлы, чтобы получить вещи, как вы хотите:
Затем измените коммит:
Предыдущая, ошибочная фиксация будет отредактирована, чтобы отразить новое состояние индекса - другими словами, это будет так, как если бы вы никогда не допустили ошибку с самого начала.
Обратите внимание, что вы должны делать это, только если вы еще не нажали. Если вы нажали, то вам просто нужно зафиксировать исправление в обычном режиме.
источник
git rm --cached
для хранения файлов в файловой системе и только удаляйте их из индекса git!или
Предупреждение. Приведенная выше команда навсегда удалит изменения в
.java
файлах (и любых других файлах), которые вы хотели зафиксировать.Команда
hard reset
toHEAD-1
установит вашу рабочую копию в состояние коммита до вашего неверного коммита.источник
git commit -a -m ""
илиgit commit -am ""
естественно! :]git stash
, а затемgit stash pop
Чтобы изменить последний коммит
Заменить файлы в индексе:
Затем, если это частная ветка, измените коммит:
Или, если это общая ветка, сделайте новый коммит:
( Чтобы изменить предыдущий коммит , используйте потрясающую интерактивную ребазу .)
ProTip ™: Добавить
*.class
в gitignore , чтобы остановить это происходит снова.Чтобы отменить коммит
Поправка коммита - это идеальное решение, если вам нужно изменить последний коммит, но есть более общее решение
reset
.Вы можете сбросить Git на любой коммит с помощью:
Где
N
количество коммитов доHEAD
и@~
сбрасывает до предыдущего коммита.Таким образом, вместо внесения изменений в коммит, вы можете использовать:
Проверьте
git help reset
, в частности, разделы на--soft
--mixed
и--hard
, для лучшего понимания того, что это делает.Reflog
Если вы запутались, вы всегда можете использовать reflog, чтобы найти пропущенные коммиты:
источник
git revert
это отдельная команда - которая в основном «сбрасывает» один коммит.Использование
git revert <commit-id>
.Чтобы получить идентификатор фиксации, просто используйте
git log
.источник
git revert commit-id
работал как шарм. Конечно, тогда вам нужно будет подтолкнуть ваши изменения.git cherry-pick <<erroneous-commit-sha>>
@astronomerdave. От, мистер почти 2 года опоздал на вечеринку.Если вы планируете полностью отменить локальный коммит, то, что вы изменили, вы сделали в коммите, и если вы не беспокоитесь об этом, просто выполните следующую команду.
(Эта команда будет игнорировать весь ваш коммит, и ваши изменения будут полностью потеряны из вашего локального рабочего дерева). Если вы хотите отменить свой коммит, но хотите внести изменения в промежуточную область (перед коммитом, как после
git add
), выполните следующую команду.Теперь ваши зафиксированные файлы попадают в промежуточную область. Предположим, что если вы хотите удалить файлы из-за необходимости отредактировать неправильный контент, выполните следующую команду
Теперь переданные файлы поступают из промежуточной области в неподготовленную область. Теперь файлы готовы к редактированию, поэтому, что бы вы ни изменили, вы захотите перейти к редактированию, добавить его и сделать новый / новый коммит.
Больше
источник
Если у вас установлен Git Extras , вы можете запустить,
git undo
чтобы отменить последний коммит.git undo 3
отменит последние три коммита.источник
Я хотел отменить последние пять коммитов в нашем общем хранилище. Я посмотрел идентификатор ревизии, на которую я хотел откатиться. Затем я набрал следующее.
источник
Я предпочитаю использовать
git rebase -i
для этой работы, потому что появляется хороший список, где я могу выбрать коммиты, от которых нужно избавиться. Это может быть не так прямо, как некоторые другие ответы здесь, но это просто кажется правильным .Выберите, сколько коммитов вы хотите перечислить, а затем примените вот так (чтобы подключить последние три)
Образец списка
Затем Git удалит коммиты для любой строки, которую вы удалите.
источник
Как исправить предыдущий локальный коммит
Используйте git-gui (или аналогичный) для выполнения
git commit --amend
. Из графического интерфейса вы можете добавлять или удалять отдельные файлы из коммита. Вы также можете изменить сообщение коммита.Как отменить предыдущий локальный коммит
Просто сбросьте вашу ветку в предыдущее местоположение (например, используя
gitk
илиgit rebase
). Затем повторно примените изменения из сохраненной копии. После сборки мусора в вашем локальном хранилище будет похоже на то, что нежелательный коммит никогда не происходил. Чтобы сделать все это в одной команде, используйтеgit reset HEAD~1
.Предупреждение : неосторожное использование
git reset
- хороший способ привести вашу рабочую копию в запутанное состояние. Я рекомендую новичкам Git избегать этого, если они могут.Как отменить публичный коммит
Выполните обратный выбор вишни ( git-revert ), чтобы отменить изменения.
Если вы еще не внесли другие изменения в свою ветку, вы можете просто сделать ...
Затем отправьте обновленную ветку в общий репозиторий.
История коммитов покажет оба коммита отдельно .
Дополнительно: исправление частной ветки в публичном хранилище
Это может быть опасно - убедитесь, что у вас есть локальная копия ответвления.
Также обратите внимание: вы не хотите делать это, если кто-то еще работает над веткой.
Очисти свою ветку локально, затем оттолкнись ...
В обычном случае вам, вероятно, не нужно беспокоиться о том, что ваша история коммитов в приватной ветке не искажается. Просто нажмите последующий коммит (см. «Как отменить публичный коммит» выше), а затем выполните сквош-слияние, чтобы скрыть историю.
источник
gitk --all $(git reflog | cut -c1-7)&
может быть полезно для поиска предыдущей ревизии, если вы хотите отменить коммит '--amend'.git reset
git push origin (branch_name) --force
Если вы хотите навсегда отменить это, и вы клонировали некоторый репозиторий
Идентификатор коммита можно увидеть
Тогда вы можете сделать -
источник
git reset --hard
, но если вам нужно жестко удалить последние коммиты "n", вы указываете SHAЕсли вы совершили мусор, но не столкнулись,
ИЛИ
источник
HEAD~1
вас можно использовать фактический хеш, отображаемый с помощьюgit log --stat
илиgit reflog
- полезный, когда вам нужно «отменить» более одного коммита.На SourceTree (GUI для GitHub) вы можете щелкнуть правой кнопкой мыши по коммиту и выполнить «Обратный коммит». Это должно отменить ваши изменения.
На терминале:
В качестве альтернативы вы можете использовать:
Или:
источник
Единственная команда:
Это прекрасно работает, чтобы отменить последний локальный коммит!
источник
Просто сбросьте его, выполнив следующую команду
git
:Объясните: что делать
git reset
, это в основномreset
любой коммит, к которому вы хотите вернуться, тогда, если вы объедините его с--soft
ключом, он вернется, но сохранит изменения в ваших файлах, так что вы вернетесь к стадии файл, который был только что добавлен,HEAD
является главой ветви, и если вы объедините с~1
(в этом случае вы также используетеHEAD^
), он вернет только один коммит, который вы хотите ...Я создаю шаги, изображенные на рисунке ниже, более подробно для вас, включая все шаги, которые могут произойти в реальных ситуациях, и фиксацию кода:
источник
Как отменить последний коммит Git?
Чтобы восстановить все, как было до последнего коммита, нам нужно сбросить коммит до HEAD.
Если вы не хотите сохранять сделанные вами изменения:
Если вы хотите сохранить свои изменения:
Теперь проверьте ваш журнал git. Это покажет, что наш последний коммит был удален.
источник
«Сбросить рабочее дерево до последнего коммита»
«Удалить неизвестные файлы из рабочего дерева»
смотри - Git Quick Reference
ПРИМЕЧАНИЕ. Эта команда удалит ваш предыдущий коммит, поэтому используйте его с осторожностью!
git reset --hard
безопаснееисточник
Используйте reflog, чтобы найти правильное состояние
РЕФЛОГ ДО СБРОСА
Выберите правильный reflog (f3cb6e2 в моем случае) и введите
После этого HEAD репо будет сброшен на этот HEADid LOG ПОСЛЕ СБРОСА
Наконец, рефлог выглядит как на картинке ниже
ФИНАЛ РЕФЛОГА
источник
Первый забег:
Он покажет вам все возможные действия, которые вы выполнили в своем хранилище, например, фиксация, слияние, извлечение и т. Д.
Затем сделайте:
источник
Отменить последний коммит:
git reset --soft HEAD^
илиgit reset --soft HEAD~
Это отменит последний коммит.
Здесь
--soft
означает возврат в постановку.HEAD~
илиHEAD^
означает двигаться, чтобы совершить перед ГОЛОВОЙ.Заменить последний коммит на новый коммит:
Он заменит последний коммит новым коммитом.
источник
Другой путь:
Извлеките ветку, которую вы хотите вернуть, а затем сбросьте свою локальную рабочую копию обратно на коммит, который вы хотите, чтобы он был последним на удаленном сервере (все после того, как оно пройдет пока) Для этого в SourceTree я щелкнул правой кнопкой мыши и выбрал «Сбросить BRANCHNAME для этого коммита».
Затем перейдите в локальный каталог вашего репозитория и выполните следующую команду:
Это удалит все коммиты после текущего в вашем локальном репозитории, но только для этой ветки.
источник
Введите
git log
и найдите хэш-код последнего коммита, а затем введите:источник
В моем случае я случайно передал некоторые файлы, которые я не хотел. Итак, я сделал следующее, и это сработало:
Проверьте результаты с помощью gitk или git log --stat
источник
Просто запустите это в командной строке:
источник
Есть много способов сделать это:
Команда Git для отмены последнего коммита / предыдущих коммитов:
Предупреждение: не используйте --hard, если вы не знаете, что делаете. --hard слишком опасен , и он может удалить ваши файлы.
Основная команда для возврата коммита в Git:
или
COMMIT-ID : идентификатор для фиксации
n: количество последних коммитов, которые вы хотите вернуть
Вы можете получить идентификатор фиксации, как показано ниже:
где d81d3f1 и be20eb8 являются идентификатором коммита.
Теперь давайте посмотрим на некоторые случаи:
Предположим, вы хотите отменить последний коммит 'd81d3f1'. Вот два варианта:
или
Предположим, вы хотите отменить коммит 'be20eb8':
Для получения более подробной информации вы можете обратиться и попробовать некоторые другие команды для возврата головки в указанное состояние:
источник
git reset --hard HEAD~1
это слишком опасно ! Это не только «отменит последний коммит», но и полностью вернет репо к предыдущему коммиту. Таким образом, вы потеряете все изменения, совершенные в последнем коммите!git push -f <remote> HEAD@{1}:<branch>
Для локального коммита
или если вы точно не помните, в каком именно коммите это происходит, вы можете использовать
Для толкаемого коммита
Правильный способ удаления файлов из истории хранилища использует
git filter-branch
. Это,Но я рекомендую вам использовать эту команду с осторожностью. Узнайте больше на странице руководства git-filter-branch (1) .
источник
Есть два основных сценария
Вы еще не выдвинули коммит
Если проблема заключалась в добавленных вами дополнительных файлах (а вы не хотите, чтобы они были в хранилище), вы можете удалить их, используя,
git rm
а затем зафиксировав--amend
Вы также можете удалить целые каталоги с помощью
-r
или даже объединить с другими Bash командамиПосле удаления файлов вы можете выполнить коммит, --amend параметром
Это перезапишет вашу недавнюю локальную фиксацию, удалив лишние файлы, поэтому эти файлы никогда не будут отправлены по запросу, а также будут удалены из вашего локального .git-репозитория GC.
Вы уже нажали коммит
Вы можете применить то же решение другого сценария и затем сделать
git push
с-f
опцией, но это не рекомендуется поскольку она перезаписывает удаленную историю изменяющимися изменениями (это может испортить ваш репозиторий).Вместо этого вы должны выполнить коммит без
--amend
(помните об этом -amend`: эта опция переписывает историю последнего коммита).источник
Чтобы вернуться к предыдущей ревизии, окончательно удалив все незафиксированные изменения:
источник
--soft
чтобы сохранить ваши изменения какuncommitted changes
, полностью--hard
сбросить коммит и вернуться к нему. Не забывайте делать такие операции только с изменениями, которые еще не переданы.git reset --hard
.git
сохраняет его содержимое в своей объектной базе данных. Сохраненное содержимое удаляется только при выполнении сборки мусора. Поэтому возможно восстановить последнюю поэтапную версию файла, который в данный момент неgit reset --hard
был подготовлен к моменту запуска (дополнительную информацию см. В сообщениях, ссылки на которые приведены выше).