Я случайно отправил неверные файлы в Git, но еще не отправил коммит на сервер.
Как я могу отменить эти коммиты из локального репозитория?
Я случайно отправил неверные файлы в Git, но еще не отправил коммит на сервер.
Как я могу отменить эти коммиты из локального репозитория?
$ git commit -m "Something terribly misguided" # (1)
$ git reset HEAD~ # (2)
<< edit files as necessary >> # (3)
$ git add ... # (4)
$ git commit -c ORIG_HEAD # (5)
git status
, поэтому вам нужно добавьте их еще раз перед совершением). Если вы хотите только добавить больше изменений к предыдущему коммиту или изменить сообщение о git reset --soft HEAD~
1 вы можете вместо этого использовать git reset --soft HEAD~
, что похоже на git reset HEAD~
(где HEAD~
совпадает с HEAD~1
), но оставляет ваши существующие изменения поэтапно.git add
все, что вы хотите включить в свой новый коммит.reset
скопировал старую голову в .git/ORIG_HEAD
; commit
с -c ORIG_HEAD
откроет редактор, который изначально содержит сообщение журнала от старого коммита и позволяет вам редактировать его. Если вам не нужно редактировать сообщение, вы можете использовать -c
. Однако помните, что если вы добавили какие-либо новые изменения в индекс, использование commit --amend
добавит их в ваш предыдущий коммит.
Если код уже передан на ваш сервер и у вас есть права на перезапись истории (перебазирование), тогда:
git push origin master --force
Вы также можете посмотреть на этот ответ:
Как переместить ГОЛОВУ назад в предыдущее место? (Отдельная голова) & Отменить фиксацию
Приведенный выше ответ покажет вам git reflog
который используется, чтобы узнать, что такое SHA-1, к которому вы хотите вернуться. Как только вы нашли точку, к которой вы хотите отменить, используйте последовательность команд, как описано выше.
1 Учтите, однако, что вам не нужно возвращаться к более ранней фиксации, если вы только что сделали ошибку в своем сообщении коммита. Более простой вариант - выполнить git reset
(чтобы отменить внесение изменений, которые вы сделали с тех пор), а затем git commit --amend
, что откроет ваш редактор сообщений по умолчанию, предварительно заполненный последним сообщением коммита.
Отмена коммита немного страшна, если вы не знаете, как он работает. Но это на самом деле удивительно легко, если вы понимаете.
Скажем, у вас это есть, где C - это ваша ГОЛОВА, а (F) - это состояние ваших файлов.
(F)
A-B-C
↑
master
Вы хотите обнулить коммит C и больше никогда его не видеть. Ты делаешь это:
git reset --hard HEAD~1
Результат:
(F)
A-B
↑
master
Теперь Б - ГОЛОВА. Поскольку вы использовали --hard
, ваши файлы возвращаются в свое состояние при фиксации B.
Ах, но предположим, что commit C - это не катастрофа, а совсем немного. Вы хотите отменить коммит, но сохраните свои изменения для небольшого редактирования, прежде чем сделать лучший коммит. Начиная снова здесь, с C в качестве вашей головы:
(F)
A-B-C
↑
master
Вы можете сделать это, оставив --hard
:
git reset HEAD~1
В этом случае результат:
(F)
A-B-C
↑
master
В обоих случаях HEAD - это просто указатель на последний коммит. Когда вы делаете git reset HEAD~1
, вы говорите Git переместить указатель HEAD назад на один коммит. Но (если вы не используете --hard
) вы оставляете свои файлы такими, какими они были. Теперь git status
показывает изменения, которые вы зарегистрировали в C. Вы ничего не потеряли!
Для легкого прикосновения вы можете даже отменить фиксацию, но оставить свои файлы и индекс:
git reset --soft HEAD~1
Это не только оставляет ваши файлы в покое, но даже оставляет ваш индекс в покое. Когда вы сделаете git status
, вы увидите, что в индексе есть те же файлы, что и раньше. Фактически, сразу после этой команды вы можете выполнить git commit
и вы будете переделывать тот же коммит, который только что у вас был.
Еще одна вещь: предположим, вы уничтожили коммит, как в первом примере, но потом обнаружили, что он вам нужен в конце концов? Не повезло, правда?
Нет, еще есть способ вернуть его. Тип git reflog
, и вы увидите список (частично) совершать ШАС (то есть, хэш), что вы переместились вокруг в Найти коммит вы уничтожили, и сделать это.:
git checkout -b someNewBranchName shaYouDestroyed
Вы сейчас воскресили этот коммит. Комитеты на самом деле не уничтожаются в Git в течение примерно 90 дней, поэтому обычно вы можете вернуться и спасти того, от которого не хотели избавиться.
Мне потребовалось некоторое время, чтобы понять, так что, возможно, это поможет кому-то...
Существует два способа "отменить" ваш последний коммит, в зависимости от того, сделал ли вы общедоступный отчет (нажал на удаленный репозиторий):
Пусть говорят, что я совершил локально, но теперь хочу удалить эту фиксацию.
git log
commit 101: bad commit # latest commit, this would be called 'HEAD'
commit 100: good commit # second to last commit, this is the one we want
Чтобы восстановить все до того, как это было до последнего фиксации, нам нужно выполнить reset
до фиксации перед HEAD
:
git reset --soft HEAD^ # use --soft if you want to keep your changes
git reset --hard HEAD^ # use --hard if you don't care about keeping the changes you made
Теперь git log
покажет, что наша последняя фиксация была удалена.
Если вы уже сделали свои коммиты общедоступными, вам нужно будет создать новый коммит, который "вернет" изменения, внесенные вами в предыдущую фиксацию (текущий HEAD).
git revert HEAD
Теперь ваши изменения будут отменены и готовы к фиксации:
git commit -m 'restoring the file I removed by accident'
git log
commit 102: restoring the file I removed by accident
commit 101: removing a file we don't need
commit 100: adding a file that we need
Для получения дополнительной информации, ознакомьтесь с Основами Git - Отменить вещи
Добавить/удалить файлы, чтобы получить то, что вы хотите:
git rm classdir
git add sourcedir
Затем измените фиксацию:
git commit --amend
Предыдущая, ошибочная фиксация будет отредактирована, чтобы отразить новое состояние индекса - другими словами, это будет похоже на то, что вы никогда не делали ошибку в первую очередь.
Обратите внимание, что вы должны сделать это только в том случае, если вы еще не нажали. Если вы нажали, вам просто придется совершить исправить нормально.
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"
или
git reset --hard HEAD~1
Предупреждение. Вышеупомянутая команда навсегда удалит изменения в .java
файлах (и любых других файлах), которые вы хотите зафиксировать.
hard reset
в HEAD-1
установит вашу рабочую копию в состояние фиксации до вашего неправильного фиксации.
Замените файлы в индексе:
git rm --cached *.class
git add *.java
Затем, если это частный филиал, измените фиксацию:
git commit --amend
Или, если это общая ветка, выполните новую фиксацию:
git commit -m 'Replace .class files with .java files'
(чтобы изменить предыдущую фиксацию, используйте удивительную интерактивную rebase)
ProTip ™: добавьте *.class
в gitignore, чтобы остановить это повторение.
Изменение коммита - идеальное решение, если вам нужно изменить последнее коммит, но reset
более общее решение.
Вы можете сбросить git на любой фиксатор с помощью:
git reset @~N
Где N
- количество коммитов перед HEAD
, а @~
возврат к предыдущему фиксации.
Итак, вместо внесения изменений в коммит вы можете использовать:
git reset @~
git add *.java
git commit -m "Add .java files"
Проверьте git help reset
, в частности разделы --soft
--mixed
и --hard
, чтобы лучше понять, что это делает.
Если вы испортились, вы всегда можете использовать reflog, чтобы найти удаленные коммиты:
$ git reset @~
$ git reflog
c4f708b [email protected]{0}: reset: moving to @~
2c52489 [email protected]{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started
Использовать git revert <commit-id>
Чтобы получить идентификатор фиксации, просто используйте git log
Если вы планируете полностью отменить локальную фиксацию, независимо от того, что вы изменили, вы сделали в фиксации, и если вы ничего не волнуетесь об этом, просто выполните следующую команду.
git reset --hard HEAD^1
(Эта команда будет игнорировать всю вашу фиксацию, и ваши изменения будут полностью потеряны из вашего локального рабочего дерева). Если вы хотите отменить фиксацию, но хотите внести изменения в промежуточную область (перед фиксацией точно так же, как после git add
), выполните следующую команду.
git reset --soft HEAD^1
Теперь ваши фиксированные файлы входят в промежуточную область. Предположим, что если вы хотите перевыполнить файлы, потому что вам нужно отредактировать некорректный контент, выполните следующую команду
git reset HEAD
Теперь переданные файлы поступают из поэтапной области в непоставленную область. Теперь файлы готовы к редактированию, поэтому, что бы вы ни изменили, вы хотите перейти к редактированию и добавить его и создать новый/новый коммит.
Если у вас установлена Git Extras, вы можете запустить git undo
чтобы отменить последнюю фиксацию. git undo 3
отменяет последние 3 фиксации.
Я хотел отменить последние 5 коммитов в нашем общем хранилище. Я просмотрел идентификатор ревизии, к которому я хотел откат. Затем я набрал следующее.
prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To [email protected]:thecompany/prometheus.git
+ 09a6480...5a74047 master -> master (forced update)
prompt>
Я предпочитаю использовать git rebase -i
для этого задания, потому что появляется хороший список, где я могу выбрать коммиты, чтобы избавиться. Это может быть не так прямо, как некоторые другие ответы здесь, но это просто кажется правильным.
Выберите количество коммитов, которые вы хотите перечислить, затем вызовите это (чтобы забрать последние три)
git rebase -i HEAD~3
Примерный список
pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support
Затем Git удалит фиксации для любой удаляемой строки.
Используйте git-gui (или аналогичный) для выполнения git commit --amend
. Из графического интерфейса вы можете добавлять или удалять отдельные файлы из коммита. Вы также можете изменить сообщение коммита.
Просто верните свою ветку в предыдущее местоположение (например, используя gitk
или git rebase
). Затем повторно примените изменения из сохраненной копии. После сборки мусора в вашем локальном хранилище будет похоже на то, что нежелательный коммит никогда не происходил. Чтобы сделать все это в одной команде, используйте git reset HEAD~1
.
Слово предупреждения: неосторожное использование git reset
- хороший способ привести вашу рабочую копию в запутанное состояние. Я рекомендую новичкам Git избегать этого, если они могут.
Выполните обратный выбор вишни (git-revert), чтобы отменить изменения.
Если вы еще не внесли другие изменения в свою ветку, вы можете просто сделать...
git revert --no-edit HEAD
Затем отправьте обновленную ветку в общий репозиторий.
История коммитов покажет оба коммита отдельно.
Также обратите внимание: вы не хотите делать это, если кто-то еще работает над веткой.
git push --delete (branch_name) ## remove public version of branch
Очистите свою ветку локально, затем оттолкнитесь...
git push origin (branch_name)
В нормальном случае вам, вероятно, не нужно беспокоиться о том, что ваша история коммитов в приватной ветке будет нетронутой. Просто нажмите последующий коммит (см. "Как отменить публичный коммит" выше), а затем выполните сквош-слияние, чтобы скрыть историю.
Если вы хотите окончательно отменить его, и вы клонировали некоторый репозиторий
Идентификатор фиксации можно увидеть
git log
Тогда вы можете сделать -
git reset --hard <commit_id>
git push origin <branch_name> -f
Если вы совершили ошибку, но не нажали,
git reset --soft HEAD~1
HEAD ~ 1 является сокращением для фиксации перед головой. В качестве альтернативы вы можете обратиться к SHA-1 хэша, если вы хотите сбросить его. --soft удалит коммит, но он оставит все ваши измененные файлы "Изменения будут совершены", как сказал бы статус git.
Если вы хотите избавиться от любых изменений в отслеживаемых файлах в рабочем дереве, так как фиксация перед голосом использует " --hard ".
ИЛИ
Если вы уже нажали, и кто-то потянул, что обычно является моим делом, вы не можете использовать сброс git. Однако вы можете сделать git revert,
git revert HEAD
Это создаст новую фиксацию, которая отменяет все, введенное случайным фиксацией.
В SourceTree (GUI для GitHub) вы можете щелкнуть правой кнопкой мыши фиксацию и выполнить "Обратный фиксат". Это должно отменить ваши изменения.
На терминале:
Вы также можете использовать:
git revert
Или:
git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.
Единая команда:
git reset --soft 'HEAD^'
Он отлично работает, чтобы отменить последнюю локальную фиксацию!
Просто сбросьте его, выполнив команду ниже, используя git
:
git reset --soft HEAD~1
Объясните: что делает git reset
, он в основном reset
на любой фиксатор, на который вы хотите вернуться, тогда, если вы объедините его с --soft
, он вернется, но сохранит изменения в ваших файлах, поэтому вы вернетесь на сцену, в которую был добавлен файл, HEAD
- глава ветки, и если вы объединитесь с ~1
(в этом случае вы также используете HEAD^
), он вернется только к одной команде, которую вы хотите...
Я создаю шаги на изображении ниже более подробно для вас, включая все шаги, которые могут произойти в реальных ситуациях и совершение кода:
Как отменить последний Git?
Чтобы восстановить все до того, как это было до последнего фиксации, нам нужно сбросить фиксацию до HEAD.
Если вы не хотите сохранять свои изменения, которые вы сделали:
git reset --hard HEAD^
Если вы хотите сохранить свои изменения:
git reset --soft HEAD^
Теперь проверьте свой журнал git. Он покажет, что наша последняя фиксация была удалена.
Используйте reflog, чтобы найти правильное состояние
git reflog
REFLOG ПЕРЕД СБРОСОМ
Выберите правильный рефлог (f3cb6e2 в моем случае) и введите
git reset --hard f3cb6e2
После этого HEAD возвращается в HEADid LOG AFTER RESET
Наконец, reflog выглядит как картинка ниже
REFLOG FINAL
"Сбросить рабочее дерево до последнего фиксации"
git reset --hard HEAD^
"Очистить неизвестные файлы от рабочего дерева"
git clean
см. - Краткая ссылка Git
ПРИМЕЧАНИЕ. Эта команда удалит предыдущую фиксацию, поэтому используйте ее с осторожностью! git reset --hard
безопаснее -
Первый забег:
git reflog
Он покажет вам все возможные действия, которые вы выполнили в своем репозитории, например, commit, merge, pull и т.д.
Затем выполните:
git reset --hard ActionIdFromRefLog
git reset --soft HEAD^
или git reset --soft HEAD~
Это приведет к отмене последнего фиксации.
Здесь --soft
означает сброс настроек.
HEAD~
или HEAD^
означает переход к фиксации перед HEAD.
git commit --amend -m "message"
Он заменит последнее коммит новым фиксатором.
Другой путь:
Оформите заявку на филиал, который хотите вернуть, затем верните локальную рабочую копию обратно на коммит, который вы хотите быть последним на удаленном сервере (все после того, как оно пройдет до свидания). Для этого в SourceTree я щелкнул правой кнопкой мыши и выбрал "Сбросить BRANCHNAME на это коммит".
Затем перейдите в локальный каталог репозитория и выполните следующую команду:
git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
Это приведет к удалению всех коммитов после текущего в локальном репозитории, но только для одной ветки.
Введите git log
и найдите последний код хеширования и введите:
git reset <the previous co>
В моем случае я случайно совершил некоторые файлы, которые я не хотел. Поэтому я сделал следующее, и это сработало:
git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD
Проверьте результаты с помощью gitk или git log --stat
Простой, запустите это в командной строке:
git reset --soft HEAD~
Есть много способов сделать это:
Команда Git для отмены последнего фиксации/предыдущих коммитов:
Предупреждение: Не используйте --hard, если вы не знаете, что делаете. --hard слишком опасен, и он может удалить ваши файлы.
Основная команда для отмены фиксации в Git:
$ git reset --hard <COMMIT -ID>
или
$ git reset --hard HEAD~<n>
COMMIT-ID: идентификатор для фиксации
n: число последних коммитов, которые вы хотите вернуть
Вы можете получить идентификатор фиксации, как показано ниже:
$ **git log --oneline**
d81d3f1 function to subtract two numbers
be20eb8 function to add two numbers
bedgfgg function to mulitply two numbers
где d81d3f1 и be20eb8 - идентификатор commit.
Теперь рассмотрим некоторые случаи:
Предположим, вы хотите вернуть последнее коммит 'd81d3f1'. Вот два варианта:
$ git reset --hard d81d3f1
или
$ git reset --hard HEAD~1
Предположим, вы хотите вернуть commit 'be20eb8':
$ git reset --hard be20eb8
Для получения более подробной информации вы можете обратиться и попробовать другие команды для сброса головы в указанное состояние:
$ git reset --help
Используйте SourceTree (графический инструмент для Git), чтобы увидеть ваши коммиты и дерево. Вы можете вручную сбросить его, щелкнув правой кнопкой мыши.
Чтобы вернуться к предыдущей ревизии, навсегда удалите все незафиксированные изменения:
git reset --hard HEAD~1
git reset --soft HEAD~1
или если вы точно не помните, в какой фиксации это возможно, вы можете использовать
git rm --cached <file>
Правильный способ удаления файлов из истории репозитория - использование git filter-branch
. То есть,
git filter-branch --index-filter 'git rm --cached <file>' HEAD
Но я рекомендую вам использовать эту команду с осторожностью. Подробнее читайте в разделе git-filter-branch (1) Manual.