Git – Отменить нажатые коммиты

У меня есть проект в удаленном репозитории, синхронизированный с локальным репозиторием (разработка) и сервером (prod). Я делаю некоторые внесенные изменения, уже перенесенные на удаленный и вытаскиваемый с сервера. Теперь я хочу отменить эти изменения. Поэтому я мог бы просто выполнить git checkout до фиксации до изменений и зафиксировать новые изменения, но я предполагаю, что возникнут проблемы, чтобы снова нажать их на удаленный. Любое предложение о том, как мне следует продолжить?

Вы можете вернуть отдельные фиксации с помощью:

 git revert  

Это создаст новую фиксацию, которая вернет изменения указанного вами коммита. Обратите внимание, что он только возвращает эту конкретную фиксацию, а не после этого фиксирует. Если вы хотите вернуть диапазон коммитов, вы можете сделать это следующим образом:

 git revert .. 

Он восстанавливает коммиты между и включает указанные коммиты.

Посмотрите на страницу git-revert man для получения дополнительной информации о команде git revert . Также посмотрите на этот ответ для получения дополнительной информации о возврате коммитов.

Решение, которое не содержит следов «отмены».

ПРИМЕЧАНИЕ: не делайте этого, если кто-то уже сделал это изменение (я использовал бы это только на своем личном репо)

делать:

 git reset  

это будет проверять все обновления локально (так что статус git отобразит все обновленные файлы)

то вы «выполняете свою работу» и повторно фиксируете свои изменения (Примечание: этот шаг является необязательным)

 git commit -am "blabla" 

В настоящее время ваше локальное дерево отличается от удаленного

 git push -f   

будет удалять и принудительно удалять это нажатие и удалять предыдущий (указание имени удаленного и имени ветви не является обязательным, но рекомендуется избегать обновления всех ветвей с флагом обновления).

!! watch-out некоторые tags могут все еще указывать удаленную фиксацию !! как к удалению-а-удаленный тег

Что я делаю в этих случаях:

  • На сервере переместите курсор обратно к последнему известному хорошему фиксации:

     git push -f origin : 
  • Локально, сделайте то же самое:

     git reset --hard  # ^^^^^^ # optional 



Полный пример на ветке my_new_branch который я создал для этой цели:

 $ git branch my_new_branch 

Это недавняя история после добавления некоторых вещей в myfile.py :

 $ git log commit 80143bcaaca77963a47c211a9cbe664d5448d546 Author: me Date: Wed Mar 23 12:48:03 2016 +0100 Adding new stuff in myfile.py commit b4zad078237fa48746a4feb6517fa409f6bf238e Author: me Date: Tue Mar 18 12:46:59 2016 +0100 Initial commit 

Я хочу избавиться от последней фиксации, которая уже была нажата, поэтому я запускаю:

 $ git push -f origin b4zad078237fa48746a4feb6517fa409f6bf238e:my_new_branch Total 0 (delta 0), reused 0 (delta 0) To [email protected]:me/myrepo.git + 80143bc...b4zad07 b4zad078237fa48746a4feb6517fa409f6bf238e -> my_new_branch (forced update) 

Ницца! Теперь я вижу, что файл, который был изменен на этом commit ( myfile.py ), показан в «не поставлен для фиксации»:

 $ git status On branch my_new_branch Your branch is up-to-date with 'origin/my_new_branch'. Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: myfile.py no changes added to commit (use "git add" and/or "git commit -a") 

Поскольку я не хочу этих изменений, я просто перемещаю курсор обратно локально:

 $ git reset --hard b4zad078237fa48746a4feb6517fa409f6bf238e HEAD is now at b4zad07 Initial commit 

Итак, теперь HEAD находится в предыдущем фиксации, как на локальном, так и на удаленном:

 $ git log commit b4zad078237fa48746a4feb6517fa409f6bf238e Author: me Date: Tue Mar 18 12:46:59 2016 +0100 Initial commit 

Вы можете REVERT (или вы также можете называть его DELETE ) Git Commit BOTH локально и удаленно, если вы выполните шаги, приведенные ниже, через командную строку git.

Выполните следующую команду, чтобы увидеть идентификатор фиксации, который вы хотите вернуть

 git log --oneline --decorate --graph 

Вы получите следующий скриншот введите описание изображения здесь

Если вы также проверите дистанционный (через веб-интерфейс), вы увидите, что это будет таким же, как показано ниже

введите описание изображения здесь

В соответствии с скриншотом в настоящее время вы используете commit id e110322, однако вы хотите вернуться обратно к 030bbf6 ОБОИХ ЛОКАЛЬНО и УДАЛЕННО .

Выполните следующие шаги для DELETE / REVERT Задает локально + удаленно


Первый локальный возврат к фиксации id 030bbf6

 git reset --hard 030bbf6 

с последующим

 git clean -f -d 

Эти две команды очищают принудительный сброс, чтобы выполнить этап 030bbf6, как показано ниже в снимке

введите описание изображения здесь

теперь, если вы запустили git-статус, вы увидите, что вы находитесь в TWO COMMIT BEHIND из удаленной ветви, как показано ниже введите описание изображения здесь

Выполните следующие действия, чтобы обновить свои индексы (если есть какие-либо обновления). Рекомендуется, чтобы вы попросили всех разработчиков не принимать какие-либо запросы на тягу на главной удаленной ветке.

 git fetch --all 

Как только вы закончите с этим, вам необходимо принудительно нажать эту фиксацию, используя символ + перед ветвью, как показано ниже. Я использовал здесь как главную ветку, вы можете заменить ее любым

введите описание изображения здесь Код

 git push -u origin +master 

теперь, если вы видите веб-интерфейс удаленного, а затем зафиксируйте, он также должен быть отменен.

введите описание изображения здесь

 git revert HEAD -m 1 

В приведенной выше строке кода. «Последний аргумент представляет собой”

  • 1 – возврат одной фиксации.

  • 2 – возврат двух последних коммитов.

  • n – возвращает последние n коммитов.

Вам нужно нажать после этой команды, чтобы применить эффект на пульте дистанционного управления. У вас есть другие варианты, такие как указание диапазона транзакций для возврата. Это один из вариантов.


Позже используйте git commit -am "COMMIT_MESSAGE" затем git push или git push -f

  • Как сравнить локальную ветвь git с удаленной ветвью?
  • Как предотвратить использование автозапуска с помощью Git?
  • Interesting Posts

    pop_back () возвращаемое значение?

    Android LocationManager.getLastKnownLocation () возвращает null

    Как я могу опубликовать список элементов в MVC

    Avahi: ping не может разрешить имя хоста, но nslookup может

    Изменить значок закрепленной панели задач (windows 7)

    Что такое порог предупреждения о «низкой памяти» с окнами 16 ГБ x64?

    Как добавить параметры в android http POST?

    Тестирование, если флажок установлен с помощью jQuery

    Почему важно использовать invokeLater?

    CMake: в каком порядке обрабатываются файлы (кеш, toolchain и т. Д.)?

    Как сообщить Windows 7 о том, чтобы никогда не запускать восстановление при запуске

    Как передать ассоциативный массив в качестве аргумента функции в Bash?

    Программное обеспечение для конвертации слайд-шоу Powerpoint в изображения?

    Как добавить (вертикальный) разделитель в горизонтальный LinearLayout?

    MySQL Не удается удалить индекс, необходимый для ограничения внешнего ключа

    Давайте будем гением компьютера.