Как отменить git push
Перейти к содержимому

Как отменить git push

  • автор:

Как отменить последний push?

Допустим сделал push, но теперь нужно отменить этот последний пуш из-за ошибки.
Как это правильно сделать? Ветка master P.S. по просьбе выложил ответ от команды git reflog , названия коммитов вымышленные, т.к. на задачу большого значения не влияют

$ git reflog 4e212ca (HEAD -> master, origin/master, origin/HEAD) HEAD@: commit: мой последний коммит e12ea6d HEAD@: reset: moving to HEAD^ 132ae6f HEAD@: commit: ещё один коммит e43ea6d HEAD@: commit: ещё один коммит 2234538 HEAD@: pull: Fast-forward 89543c9 HEAD@: commit: fix search 

Отслеживать
задан 13 фев 2018 в 6:39
2,780 4 4 золотых знака 30 30 серебряных знаков 68 68 бронзовых знаков
какая ошибка была?
13 фев 2018 в 7:07
просто чуть не то сделал и запушил
13 фев 2018 в 7:08

сделайте коммит-откат (git revert) и запуште. push c force — это очень плохо (особенно, если работаете в команде)

13 фев 2018 в 7:13
ассоциация: stackoverflow.com/questions/2389361
19 ноя 2018 в 10:48

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

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

Также настоятельно рекомендуется сделать резервную копию, скачав всё содержимое папки в какое-либо другое место.

В принципе, если вы работали из командной строки и ещё не успели её закрыть – то можете просто посмотреть, какой коммит был последним:

git commit -m "asdf" [master 6703d65] asdf 1 file changed, 3 insertions(+), 3 deletions(-) git push Counting objects: 4, done. Delta compression using up to 8 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (4/4), 407 bytes | 407.00 KiB/s, done. Total 4 (delta 2), reused 0 (delta 0) To git.mydomain.tld:folder/repo.git 743acea..6703d65 master -> master 

Последняя строчка говорит, что ДО push’а последний коммит был 743acea, а стал 6703d65 — вот и вернитесь к 743acea:

git reset --hard 743acea git push --force 

Также если вы закрыли консоль (либо у вас UI в котором не видны действия), но вы уверены, что ничего после push не делали — вам помогут команды:

git reset --hard HEAD~1 git push --force 

Вообще же лучше всего прочитать рефлог ( git reflog ) и откатиться к нужному коммиту через HEAD@ (уточните цифру сколько действий нужно отменить именно в вашем случае):

git reset --hard HEAD@ git push --force 
$ git reflog 6703d65 (HEAD -> master, origin/master, origin/HEAD) HEAD@: commit: asdf 743acea HEAD@: commit: asdf 1a4e976 HEAD@: commit: something . 

Ваша задача — найти в этом логе тот пункт, к которому вы хотите вернуться:

$ git reset --hard HEAD@

Как отменить сделанный git push?

Я совсем новичок в работе с GitHub. Он нужен нам с приятелем пока что только для того, чтобы пересылать друг другу код. По глупости, сделал git push, вроде даже пару раз. Файлы заменились старыми файлами из репозитория Гитхаба. Как я понимаю, всё это время я работал в основной ветке, которая у меня называется main. Попробовал сделать git fetch -all, ничего не изменилось.
Вопрос: как можно сделать откат?

  • Вопрос задан более двух лет назад
  • 308 просмотров

3 комментария

Простой 3 комментария

Обзор команд Git для отмены изменений

Предположим, что мы случайно удалили файл, например myfile.txt :

git rm myfile.txt
git status

Для его восстановления выполняем команду:

git restore myfile.txt

Отменяем индексирование файла

Допустим, мы по ошибке проиндексировали файл, выполнив команду git add myfilename . Для отмены этого действия воспользуемся командой:

git reset HEAD myfilename

Восстанавливаем предыдущие версии

Посмотрим, как восстановить более ранние версии в случае необходимости. С помощью команды git log переходим в историю коммитов, выбираем код SHA ранней версии (достаточно первых символов) и выполняем команду git checkout :

git checkout 0dd6680

Получаем следующее сообщение:

Внимание: переключение на '0dd6680'.Вы находитесь в состоянии 'detached HEAD'("отсоединенный указатель HEAD"). Осмотритесь, внесите пробные изменения и зафиксируйте их. Вы можете отменить любые коммиты, выполненные в этом состоянии, ни на что не влияя при переключении обратно на ветку.При желании можете создать новую ветку и сохранить свежие коммиты. Для этого понадобится команда switch и -c: 
Пример:
git switch -c Для отмены этой операции существует команда: git switch -Для отключения данного сообщения установите переменную конфигурации advice.detachedHead в значение false. На данный момент HEAD указывает на коммит 0dd6680.
cat myfile.txt

Вы увидите, что находитесь в более ранней версии. Вышеприведенная команда вывода checkout объясняет ситуацию. Эти изменения можно сохранить, если создать новую ветку.

Оказавшись в состоянии “detached HEAD” вполне можно запаниковать, не зная, как вернуться к последней версии в главной ветке master . Посмотрим, как это сделать:

git checkout main
Предыдущее положение HEAD указывало на коммит 0dd6680.
Переключение на ветку 'main'.
Состояние вашей ветки обновлено на 'origin/main'.

Откатываем изменения на один коммит

Для отмены предыдущего коммита выполняем команду:

git revert

Удаляем неотслеживаемый файл

Допустим, вы добавили файлы, которые еще не подготовлены к коммиту. Чтобы от них избавиться, выполняем команду:

git clean -n

Это пробный запуск, который отображает файлы, подлежащие удалению. Подтверждаем выполнение этой операции командой:

git clean -f

Отменяем git init

Работая с Git, вы инициализируете проект с помощью git init . Для отмены данной операции просто удаляем файл .git из каталога.

rm -rf .git

Дополнительные команды: удаляем файл из удаленного репозитория

При работе с Git и GitHub/GitLab можно случайно отправить файл в удаленный репозиторий. В таком случае возникает необходимость его удалить. Рассмотрим ситуацию на примерах. Создаем удаленный репозиторий GitHub и локально его клонируем:

Меняем рабочий каталог на клонированный репозиторий. Как видно, здесь есть файлы README.md и .git .

Далее создаем файл wrong.txt , который мы отправим в удаленный репозиторий:

ls -ltra
total 6
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 18:57 ../
-rw-r--r-- 1 gpipis 1049089 16 Jan 13 18:57 README.md
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 18:57 .git/
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 19:12 ./
-rw-r--r-- 1 gpipis 1049089 21 Jan 13 19:12 wrong.txt
git add wrong.txt
git commit -m "pushing the wrong.txt file"
git push origin main

Файл wrong.txt добавлен в удаленный репозиторий.

Удаляем файл

При необходимости удалить файл как из удаленного каталога, так и локальной файловой системы выполняем команды:

git rm wrong.txt
git commit -m "remove the wrong.txt file"
git push origin main

Как видим, цель достигнута:

ls -ltratotal 5
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 18:57 ../
-rw-r--r-- 1 gpipis 1049089 16 Jan 13 18:57 README.md
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 19:23 ./
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 19:24 .git/

Удаляем файл из удаленного репозитория Git, но сохраняем его локально

Повторяем последовательность действий по созданию файла wrong.txt , который на этот раз мы удалим только из удаленного репозитория:

ls -ltratotal 6
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 18:57 ../
-rw-r--r-- 1 gpipis 1049089 16 Jan 13 18:57 README.md
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 19:24 .git/
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 19:33 ./
-rw-r--r-- 1 gpipis 1049089 13 Jan 13 19:33 wrong.txt

Отправляем файл wrong.txt :

git add wrong.txt
git commit -m "pushing the wrong.txt file again"
git push origin main

Удаляем wrong.txt только из удаленного репозитория. Для этого используем тег cached .

git rm --cached wrong.txt
git commit -m "remove the wrong.txt file only from remote repo"
git push origin main

Проверяем локальный репозиторий:

$ ls -ltratotal 6
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 18:57 ../
-rw-r--r-- 1 gpipis 1049089 16 Jan 13 18:57 README.md
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 19:33 ./
-rw-r--r-- 1 gpipis 1049089 13 Jan 13 19:33 wrong.txt
drwxr-xr-x 1 gpipis 1049089 0 Jan 13 19:38 .git/

Проверяем удаленный каталог:

wrong.txt успешно удален из удаленного репозитория!

Со списком наиболее распространенных команд Git и GitHub вы можете ознакомиться по ссылке Git and GitHub Cheatsheet.

  • Полезные команды Git
  • 3 верных способа оптимизировать ревью на GitHub
  • Как настроить отдельные SSH-ключи для нескольких учётных записей GitLab

Что такое git push и как его использовать

В инструкции рассказываем о наиболее частых сценариях использования git push.

Эта инструкция — часть курса «Введение в Git».

Смотреть весь курс

Введение

Команда Git push позволяет отправлять локальную ветку на удаленный репозиторий. Она помогает разработчикам синхронизироваться в команде, а именно отправляет проделанные изменения. Если программист работает один, то пуш позволяет хранить код в облаке, например github, gitlab и не только, избавляя от риска потери данных на компьютере.

Дополнительно для синхронизации еще используют git pull для получения изменений с сервера и git remote, чтобы получить список удаленных подключений к репозиторию.

В этой инструкции мы расскажем, как запушить в удаленный git репозиторий. В статье под «пушем» будем подразумевать git push.

Отправка изменений в чистый репозиторий

Перед пушем надо связать локальный и удаленный репозитории. Делается это при помощи команды:

git remote add link

Вместо repository_name нужно дать имя удаленному репозиторию. Далее в инструкции вместо этого параметра мы будем использовать origin, так как чаще всего используют это имя.

Вместо link — ссылка на удаленный репозиторий, она может выглядеть по-разному в зависимости от того используется ssh или https.

Для ssh, который обязателен для github и gitlab, потребуются сделать дополнительные манипуляции для создания ssh-ключа. Соответствующие инструкции есть на этих ресурсах.

Отправка изменений

Перед пушем надо зафиксировать текущие изменения, то есть сделать git commit.

Далее для отправки в терминале пишем:

git push origin

Вместо branch — имя ветки, которую надо отправить. Чаще всего используется master или main:

git push origin master 

Такое каждый раз писать слишком громоздко, для этого придумали git push по умолчанию. Для этого единожды набираем предыдущую команду с флагом -u:

git push -u origin master

После этого можно писать более коротко, так как git запомнил, что пушить надо на сервер origin ветку под именем master:

git push

Таким образом, git позволяет запушить ветку в удаленный репозиторий. Чтобы через git добавить ветку в удаленный репозиторий, надо запушить существующую локальную ветку.

Дополнительные опции публикации

Отправка ветки на сервер в ветку с другим именем

Для того чтобы сделать git push в другую ветку, есть специальный синтаксис, где после имени ветки через двоеточие пишется имя удаленной ветки:

git push origin branch:server_branch

где branch – имя локальной ветки, server_branch – имя удаленной ветки на сервере.

Отправка всех веток на сервер

Вместо имени ветки пишем флаг —all:

git push origin --all

После этого все зафиксированные изменения в ветках отправятся в удаленный репозиторий.

Отправка текущей ветки

Удобный способ отправить текущую ветку с тем же именем на сервере.

git push origin HEAD 

HEAD указывает на текущую ветку (current branch). Тем самым, не надо запоминать имя ветки, на которой вы находитесь.

Принудительная публикация (git push —force …)

При отправке может произойти ошибка публикации:

To github.com:example/test.git ! [rejected] master -> master (fetch first) error: не удалось отправить некоторые ссылки в «github.com:example/test.git»

Это так называемый git push rejected, он означает что пуш был отклонен. Правильнее всего — сделать то, что написано в подсказке к ошибке. Надо получить и смержить изменения, затем снова отправить.

Эта ошибка происходит, так как git проверяет, что новый коммит основан на предыдущих коммитах. Пока вы вносили изменения, кто-то мог запушить изменения того же, над чем вы работали. Поэтому git не может выполнить автоматическое слияние, ваш коммит был раньше и он не базируется на обновленных коммитах в удаленном репозиториие.

Флагом —force или сокращенной его версией -f отключается проверка коммитов и при необходимости выполняется перезапись истории.

git push --force

Нужно быть аккуратными с этой командой, так как она стирает работу других людей. Эта команда оправдана лишь изредка, например, если вы почти сразу внесли изменения коммита с помощью git commit —amend и запушили до того, как кто-то сделал git pull.

Принудительная публикация с параметром (git push —force-with-lease …)

Это более безопасный, но так же нерекомендуемый вариант вариант принудительного пушинга. Он не перезапишет работу в удаленной ветке, если в нее были добавлены коммиты от других людей.

git push --force-with-lease

Принудительная публикация с этим параметром чревата появлением git push rejected у других людей

Как пушить в PhpStorm

При первом открытии PhpStorm потребуется создать новый проект.

новый проект

В открытом проекте в правом верхнем углу среды разработки располагаются наиболее часто используемые команды git, в том числе пушинга.

часто используемые команды

Синяя стрелка означает git pull, зеленая галочка — git commit, зеленая стрелка — git push. При нажатии на зеленую стрелку (горячие клавиши Ctrl+Alt+K или ⌥ ⌘ K) открывается диалоговое окно с информацией об изменениях и настроках отправки.

Незапушенные коммиты

Самый простой способ узнать про них при помощи команды:

git status 

Вывод будет содержать имя текущей ветки и то, насколько она опережает версию сервера. Пример вывода:

On branch master Your branch is ahead of ‘origin/master’ by 1 commit. (use “git push” to publish your local commits)

Для более подробной информации можно использовать:

git log 

Будет выведена история коммитов:

commit 0fcd9558b013f642a8c3b4a59a16a66de39c99bd (HEAD -> master) Author: Pavel Date: Sun Mar 27 18:57:14 2022 +0300 Local commit commit 289c650767d2c7c2e58486e27b8b3933c6442078 (origin/master, origin/HEAD) Author: Pavel Date: Fri Mar 25 19:41:47 2022 +0300 Pushed commit 

В скобках пишется где и какой коммит расположен.

HEAD -> master означает что текущая ветка (current branch) — это master и это последний локальный коммит в ней.

В нижнем коммите в скобках origin/master означает, что это последний опубликованный коммит на сервере в ветке master, а origin/HEAD, что коммит расположен на ветке, которая совпадает с локальной веткой HEAD.

Как пушить теги

Для создания тегов используют git tag, а для их отправки:

git push origin

Вместо tag_name — имя тега, который надо удалить на сервере.

Также можно сделать отправку всех тегов:

git push --tags

Мы не рекомендуем выбирать этот способ, так как могут отправиться теги, которые были удалены на сервере.

Удаление ветки или тега на сервере

Чтобы удалить ветку на удаленном репозитории, используем уже привычную команду с флагом —delete:

git push --delete origin

remote_branch_or_tag_name — имя ветки или тега на сервере.

Для удаление локальной ветки:

git branch -d

А для удаления локального тега:

git tag -d

Продвинутые возможности

Удаление локальных данных (prune)

Если на сервере была удалена ветка, то локально она все еще существует. Чтобы удалить все локальные ветки, которых нет на сервере:

git remote prune origin

Проверить, удастся ли пушинг (dry run option)

С этой опцией пушинг фактически не произойдет, но покажет вывод словно он произошел.

git push --dry-run

Так можно получить ошибку, которая могла бы произойти, и поправить ее заранее.

Атомарный пушинг (atomic option)

Если отправить несколько веток на сервер, некоторые могут быть приняты, а другие — нет. Иногда это не то поведение, которое ожидалось. Например, пушинг делает некоторая проверяющая система и ожидаемое поведение такое: либо все будут приняты, либо все будут отклонены. В таких случаях надо делать пушинг атомарно:

git push --atomic origin branch1 branch2 …

Заключение

В этой инструкции мы рассмотрели наиболее частые сценарии использования git push. В этой команде много опций, некоторые из них даже редко встречаются. Со всеми ними можно ознакомиться в документации:

git push –help

Git rebase — перебазирование коммитов и веток

Что такое GitLab, как и для чего он используется

Зарегистрируйтесь в панели управления

И уже через пару минут сможете арендовать сервер, развернуть базы данных или обеспечить быструю доставку контента.

Читайте также:

Инструкция

Как автоматизировать подготовку к собеседованиям с помощью Telegram-бота

29 сентября 2023

Инструкция

Как реализовать очередь в Redis

14 сентября 2023

Инструкция

Как генерировать истории с помощью ChatGPT и Telegram

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *