Отменить слияние Git, которое еще не было отправлено

В моей основной ветке я локально выполнил git merge some-other-branch , но никогда не отправлял изменения в исходный мастер. Я не хотел объединяться, поэтому хочу его отменить. Выполняя git status после слияния, я получал следующее сообщение:

  # На главном сервере ветки # Ваша ветка опережает 'origin /master 'на 4 коммита.  

Основываясь на некоторых инструкциях, которые я нашел, я попытался запустить

  git revert HEAD -m 1   

но теперь я получаю это сообщение с git status :

  # Вкл.  ветвь master # Ваша ветка опережает origin/master на 5 коммитов.  

Я не хочу, чтобы моя ветка опережала любое количество коммитов. Как мне вернуться к этой точке?


С помощью git reflog проверьте, какая фиксация является одной до слияния ( git reflog будет лучшим вариантом, чем git log ). Затем вы можете сбросить его, используя:

  git reset --hard commit_sha  

Есть еще один способ:

  git reset --hard HEAD ~ 1  

Это вернет вам 1 коммит.

Имейте в виду, что любые измененные и незафиксированные/несшитые файлы будут сброшены в исходное состояние . Чтобы сохранить изменения, либо отложите изменения, либо воспользуйтесь опцией - объединить ниже.


Как @Velmont предложил ниже в своем ответе, в этом прямом случае с использованием:

  git reset --hard ORIG_HEAD  

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


Еще один совет заключается в использовании переключателя - merge вместо - hard , поскольку он не сбрасывает файлы без необходимости:

  git reset --merge ORIG_HEAD  

— merge

Сбрасывает индекс и обновляет файлы в рабочем дерево, которые различаются между и HEAD, но сохраняют те, которые различаются между индексом и рабочим деревом (т.е. в которых есть изменения, которые не были добавлены).


Предполагая, что ваш локальный мастер не опередил origin/master, вы должны иметь возможность сделать

  git reset --hard origin/master  

Затем ваша локальная ветка master должен выглядеть идентично origin/master .


Предполагая, что ваш локальный master не опередил origin/master, у вас должно получиться

  git reset --hard origin/master  

Тогда ваша локальная ветка master должна выглядеть идентично origin/master .


См. главу 4 в книге Git и исходный пост Линуса Торвальдса..

Чтобы отменить слияние , которое уже было отправлено :

  git revert -m 1 commit_hash  

Обязательно отмените откат, если вы снова фиксируете ветку, как сказал Линус.


См. главу 4 в книге Git и исходную публикацию Линуса Торвальдса.

Чтобы отменить слияние , которое уже было отправлено :

  git revert -m 1 commit_hash  

Не забудьте отменить возврат, если вы снова фиксируете ветку, например — сказал Линус.


Странно, что отсутствовала простейшая команда. Большинство ответов работают, но отмена только что выполненного слияния это простой и безопасный способ :

  git reset --merge ORIG_HEAD  

Ссылка ORIG_HEAD будет указывать на исходную фиксацию до слияния.

( - параметр слияния не имеет ничего общего с слиянием. Он похож на git reset --hard ORIG_HEAD , но безопаснее, поскольку он не затрагивает незафиксированные изменения.)


Странно, что отсутствовала простейшая команда. Большинство ответов работают, но отмена только что выполненного слияния это простой и безопасный способ :

  git reset --merge ORIG_HEAD  

Ссылка ORIG_HEAD будет указывать на исходную фиксацию до слияния.

( - параметр слияния не имеет ничего общего с слиянием. Он похож на git reset --hard ORIG_HEAD , но безопаснее, поскольку он не касается незафиксированных изменений.)


В более новых версиях Git, если вы еще не зафиксировали слияние и у вас есть слияние конфликт , вы можете просто сделать:

  git merge --abort  

From man git merge :

[Это] может быть запущено только после того, как слияние привело к конфликту. git merge --abort прервет процесс слияния и попытается восстановить состояние до слияния.


В более новых версиях Git, если вы еще не зафиксировали слияние и у вас есть конфликт слияния , вы можете просто сделать:

  git merge --abort  

Из man git merge :

[Это] может быть запущено только после того, как слияние привело к конфликту. git merge --abort прервет процесс слияния и попытается восстановить состояние до слияния.


Вы должны вернуться к предыдущей фиксации. Это должно работать:

  git reset --hard HEAD ^  

Или даже HEAD ^^ , чтобы отменить эту отмену фиксации. Вы всегда можете дать полную ссылку на SHA, если не знаете, на сколько шагов назад вам следует сделать.

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


Вы должны сбросить до предыдущий коммит. Это должно работать:

  git reset --hard HEAD ^  

Или даже HEAD ^^ , чтобы отменить эту отмену фиксации. Вы всегда можете дать полную ссылку на SHA, если не знаете, на сколько шагов назад вам следует сделать.

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


В последнее время я использовал git reflog , чтобы помочь с этим. В основном это работает, только если слияние ПРОСТО произошло на вашей машине.

git reflog может возвращать что-то вроде:

  fbb0c0f HEAD @ {0}: commit (merge)  : Объединить ветку master в my-branch43b6032 HEAD @ {1}: checkout: перейти от master к my-branche3753a7 HEAD @ {2}: rebase finished: вернуться к refs/heads/mastere3753a7 HEAD @ {3}: pull -  rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830eb41ea52 HEAD @ {4}: reset: move to HEAD ^ 8400a0f HEAD @ {5}: rebase: aborting  

Первая строка указывает, что произошло слияние. Вторая строка — время до моего слияния. Я просто git reset --hard 43b6032 , чтобы заставить эту ветку отслеживать до слияния и продолжать.


В последнее время я использовал git reflog , чтобы помочь с этим. В основном это работает, только если слияние ПРОСТО произошло на вашей машине.

git reflog может возвращать что-то вроде:

  fbb0c0f HEAD @ {0}: commit (merge)  : Объединить ветку master в my-branch43b6032 HEAD @ {1}: checkout: перейти от master к my-branche3753a7 HEAD @ {2}: rebase finished: вернуться к refs/heads/mastere3753a7 HEAD @ {3}: pull -  rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830eb41ea52 HEAD @ {4}: reset: move to HEAD ^ 8400a0f HEAD @ {5}: rebase: aborting  

Первая строка указывает, что произошло слияние. Вторая строка — время до моего слияния. Я просто git reset --hard 43b6032 , чтобы заставить эту ветвь отслеживать до слияния, и продолжаю.


В современном Git вы можете:

   git merge --abort  

Старый синтаксис:

  git reset --merge  

Старая школа:

  git reset --hard  

Но на самом деле стоит заметить, что git merge --abort эквивалентен только git reset --merge , если присутствует MERGE_HEAD . Это можно прочитать в справке Git по команде слияния.

  git merge --abort эквивалентен git reset --merge, когда присутствует MERGE_HEAD.  

После неудачного слияния, когда нет MERGE_HEAD , неудачное слияние можно отменить с помощью git reset --merge , но не обязательно с помощью git merge --abort , , поэтому это не только старый и новый синтаксис для одного и того же .

Лично я считаю git reset --merge гораздо более мощным и полезным в повседневной работе, поэтому я всегда использую его.


В современном Git вы можете:

  git merge --abort  

Старый синтаксис:

  git reset --merge  

Старая школа:

  git reset --hard  

Но на самом деле стоит заметить, что git merge --abort только equ равносильно git reset --merge при наличии MERGE_HEAD . Это можно прочитать в справке Git по команде слияния.

  git merge --abort эквивалентен git reset --merge, когда присутствует MERGE_HEAD.  

После неудачного слияния, когда нет MERGE_HEAD , неудачное слияние можно отменить с помощью git reset --merge , но не обязательно с помощью git merge --abort , , поэтому это не только старый и новый синтаксис для одного и того же .

Лично я считаю git reset --merge гораздо более мощным и полезным в повседневной работе, поэтому я всегда использую его.


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

Делаем это …

  git reset --hard HEAD ^ git status  

… дал мне следующий статус.

  # На главном сервере # Ваша ветка и 'origin/master' разошлись, # и имеют 3 и 3  разные коммиты соответственно.  

Затем мне пришлось ввести одну и ту же команду git reset еще несколько раз. Каждый раз, когда я это делал, сообщение менялось на единицу, как вы можете видеть ниже.

 > git reset --hard HEAD ^ HEAD теперь находится в [... усеченном ..  .]> git status # На главном узле ветки # Ваша ветка и 'origin/master' разошлись, # и имеют 3 и 3 разных фиксации соответственно.> git reset --hard HEAD ^ HEAD теперь находится в [.  ..срезано ... ]> git status # На главной ветке # Ваша ветка и 'origin/master' разошлись, # и имеют 2 и 3 разных фиксации соответственно.> git reset --hard HEAD ^ HEAD теперь находится в [..  .truncated ...]> git status # На ветке master # Ваша ветка и 'origin/master' разошлись, # и имеют 1 и 3 разных коммита соответственно.> git reset --hard HEAD ^ HEAD is  теперь в [... truncated ...]> git status # На главном сервере # Ваша ветка отстает от 'origin/master' на 3 коммита и может быть быстро перенаправлена.  

На этом этапе я увидел, что сообщение о состоянии изменилось, поэтому я попытался выполнить git pull , и это, похоже, сработало:

   > git pullUpdating 2df6af4..12bbd2fFast forward app/views/truncated |  9 ++++++ --- app/views/truncated |  13 +++++++++++++ app/views/truncated |  2 + - 3 файла изменено, 20 вставок (+), 4 удаления (-)> git status # На главном сервере ветки  

Короче говоря, мои команды сводились к следующему:

  git reset --hard HEAD ^ git reset --hard HEAD ^ git reset --hard HEAD ^ git reset --hard HEAD ^ git pull  


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

Делаем это …

  git reset --hard HEAD ^ git status  

… дал мне следующий статус.

  # На главном сервере # Ваша ветка и 'origin/master' разошлись, # и имеют 3 и 3  разные коммиты соответственно.  

Затем мне пришлось ввести одну и ту же команду git reset еще несколько раз. Каждый раз, когда я это делал, сообщение менялось на единицу, как вы можете видеть ниже.

 > git reset --hard HEAD ^ HEAD теперь находится в [... усеченном ..  .]> git status # На главном узле ветки # Ваша ветка и 'origin/master' разошлись, # и имеют 3 и 3 разных фиксации соответственно.> git reset --hard HEAD ^ HEAD теперь находится в [.  ..truncated ...]> git status # На ветке master # Ваша ветка и 'origin/master' разошлись, # и имеют 2 и 3 разных коммита соответственно.> git reset --hard HEAD ^ HEAD  теперь находится на [... усеченном ...]> git status # На главном сервере # Ваша ветка и 'origin/master' разошлись, # и имеют 1 и 3 разных фиксации соответственно.> git reset -  -hard HEAD ^ HEAD теперь находится в [... truncated ...]> git status # На главном сервере # Ваша ветка отстает от 'origin/master' на 3 коммита и может быть быстро перенаправлена.  

На этом этапе я увидел, что сообщение о состоянии изменилось, поэтому я попытался выполнить git pull , и это, похоже, сработало:

 > git pullUpdat  ing 2df6af4.. 12bbd2fFast forward app/views/truncated |  9 ++++++ --- app/views/truncated |  13 +++++++++++++ app/views/truncated |  2 + - 3 файла изменено, 20 вставок (+), 4 удаления (-)> git status # На главном сервере ветки  

Короче говоря, мои команды сводились к следующему:

  git reset --hard HEAD ^ git reset --hard HEAD ^ git reset --hard HEAD ^ git reset --hard HEAD ^ git pull  

Вы должны изменить свою ГОЛОВУ, не вашу, конечно, но git HEAD ….

Итак, прежде чем отвечать, давайте добавим немного предыстории, объясняя, что это за HEAD .

HEAD — это просто ссылка на текущую фиксацию (последнюю) в текущей ветке.
В любой момент времени может быть только один HEAD . (за исключением git worktree )

Содержимое HEAD хранится внутри .git/HEAD и содержит 40 байт SHA-1 текущего коммита.


Если вы не используете последний коммит — это означает, что HEAD указывает на предыдущую фиксацию в истории, которая называется detached HEAD .

В командной строке это будет выглядеть так: SHA-1 вместо имени ветки, поскольку HEAD не указывает на конец текущей ветви

Несколько вариантов восстановления после отключенного ГОЛОВКА:


git checkout

  git checkout  git checkout -b    git checkout HEAD ~ X//x - количество коммитов, которые нужно вернуться назад  

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

  # Оформить заказ на фиксацию.  # Это приведет к `detached HEAD`, что означает, что` HEAD` # не указывает на последнюю версию, поэтому вам нужно будет проверить ветку #, чтобы иметь возможность обновить код. Git checkout   # создать новую ветку, ответвленную для данного коммита. git checkout -b   

git reflog

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

Каждый раз, когда HEAD изменяется, в reflog

  git refloggit checkout HEAD @ {...}  

Это вернет вас к желаемой фиксации


git reset --hard

«Переместите» вашу HEAD обратно в желаемый коммит.

  # Это уничтожит любые локальные изменения. # Не делайте этого  если у вас есть незавершенная работа, которую вы хотите сохранить. git reset --hard 0d1d7fc32 # В качестве альтернативы, если есть работа, которую нужно сохранить: git stashgit reset --hard 0d1d7fc32git stash pop # Это сохраняет изменения, а затем повторно применяет этот патч после сброса. # Вы можете  получить конфликты слияния, если вы изменили элементы, # которые были изменены после выполнения сброса.  
  • Примечание. (Начиная с Git 2.7)
    вы также можете использовать git rebase --no-autostash .

git revert

«Отменить» заданный коммит или диапазон фиксации.
Команда сброса «отменит» любые изменения, сделанные в данной фиксации.
Новая фиксация с патчем отмены будет зафиксирована, в то время как исходная фиксация останется в история тоже.

  # добавить новую фиксацию с отменой исходной. #  может быть любой фиксацией (ями) или диапазоном фиксации git revert   

Эта схема показывает, какая команда что делает.
Как вы можете видеть там reset && checkout измените HEAD .


Вы должны изменить свою ГОЛОВУ, не свою, конечно, но git HEAD ….

Итак, прежде чем отвечать, давайте добавим немного предыстории, объяснив, что это за HEAD .

HEAD — это просто ссылка на текущий зафиксировать (последний) в текущей ветке.
В любой момент времени может быть только один HEAD . (за исключением git worktree )

Содержимое HEAD хранится внутри .git/HEAD и содержит 40 байт SHA-1 текущего коммита.


Если вы не используете последний коммит — это означает, что HEAD указывает на предыдущую фиксацию в истории, которая называется detached HEAD .

В командной строке это будет выглядеть так: SHA-1 вместо имени ветки, поскольку HEAD не указывает на конец текущей ветви

Несколько вариантов восстановления после отключенного ГОЛОВКА:


git checkout

  git checkout  git checkout -b    git checkout HEAD ~ X//x - количество коммитов, которые нужно вернуться назад  

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

  # Оформить заказ.  # Это приведет к `detached HEAD`, что означает, что` HEAD` # не указывает на последнюю версию, поэтому вам нужно будет проверить ветку #, чтобы иметь возможность обновить код. Git checkout   # создать новую ветку, ответвленную для данного коммита. git checkout -b   

git reflog

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

Каждый раз, когда HEAD изменяется, в reflog

  git refloggit checkout HEAD @ {...}  

Это вернет вас к желаемой фиксации


git reset - -hard

«Переместить» ГОЛОВУ обратно в желаемую фиксацию.

  # Это уничтожит все локальные изменения. # Не делайте этого, если у вас есть незавершенная работа, которую вы хотите сохранить. Git reset --hard 0d1d7fc32 # В качестве альтернативы, если есть работа, которую нужно сохранить: git stashgit reset --hard 0d1d7fc32git stash pop #  Это сохраняет изменения, а затем повторно применяет этот патч после сброса. # Вы можете получить конфликты слияния, если вы изменили вещи, # которые были изменены после фиксации, на которую вы сбросили.  
  • Примечание. (Начиная с Git 2.7)
    вы также можете использовать git rebase --no-autostash .

git revert

«Отменить» заданный коммит или диапазон фиксации.
Команда сброса «отменит» любые изменения, сделанные в данной фиксации.
Будет зафиксирована новая фиксация с патчем отмены, в то время как исходная фиксация также останется в истории.

  # добавить новую фиксацию с отменой исходной. #  может быть любой фиксацией (-ами) или диапазоном фиксации git revert  

Эта схема показывает, какая команда что делает.
Как вы можете видеть, reset && checkout измените HEAD код>.


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

Конкретно,

  $ git reflog $ git reset --hard HEAD @ {0  }  


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

Конкретно,

  $ git reflog $ git reset --hard HEAD @ {0  }  

Если вы находитесь в процессе слияния, вы всегда можете его прервать git merge —abort


Если вы находитесь в процессе слияния, вы всегда можете его прервать git merge --abort


Мне удалось решить эту проблему с помощью одной команды, которая не требует поиска идентификатора фиксации.

  git reset --hard remotes/origin/HEAD  

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


Мне удалось решить эту проблему с помощью одной команды, которая не требует поиска идентификатора фиксации.

  git reset --hard remotes/origin/HEAD  

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


Это можно сделать несколькими способами.

1) Прервать слияние

Если вы находитесь между неудачным слиянием (ошибочно выполнено с неправильной веткой) и хотите чтобы избежать слияния, вернитесь к последней ветке, как показано ниже:

  git merge --abort  

2) Сбросить HEAD в удаленную ветвь

Если вы работаете из удаленной ветки разработки, вы можете сбросить HEAD до последней фиксации в удаленной ветке, как показано ниже:

  git reset --hard origin/develop  

3) Удалить текущую ветку и снова оформить заказ из удаленного репозитория

Учитывая, что вы работаете над веткой разработки в локальном репо, которая синхронизируется с веткой удаленной/разработки, вы можете сделать следующее:

   git checkout master ##, чтобы удалить одну ветку, вам нужно быть в другой ветке, иначе вы упадете с веткой :) git branch -D developgit checkout -b develop origin/develop  


Это можно сделать несколькими способами.

1) Прервать слияние

Если вы находитесь между неудачным слиянием (ошибочно выполнено с неправильной веткой) и хотите чтобы избежать слияния, вернитесь к последней ветке, как показано ниже:

  git merge --abort  

2) Сбросить HEAD в удаленную ветвь

Если вы работаете из удаленной ветки разработки, вы можете сбросить HEAD до последней фиксации в удаленной ветке, как показано ниже:

  git reset --hard origin/develop  

3) Удалить текущую ветку и снова оформить заказ из удаленного репозитория

Учитывая, что вы работаете над веткой разработки в локальном репо, которая синхронизируется с веткой удаленной/разработки, вы можете сделать следующее:

   git checkout master ##, чтобы удалить одну ветку, вам нужно быть в другой ветке, иначе вы попадете в ветку :) git branch -D developgit checkout -b develop origin/develop  

Если вы еще не зафиксировали его, вы можете использовать только

  $ git checkout -f  

Это отменит слияние (и все, что вы сделали).


Если вы еще не зафиксировали его, вы можете использовать только

  $ git checkout -f  

Это отменит слияние (и все, что вы сделали).


Добрался до этого вопроса, также пытаясь вернуться к соответствию происхождению (т. Е. NO совершает перед началом происхождения). Проведя дальнейшие исследования, мы обнаружили, что есть команда reset именно для этого:

git reset --hard @ {u}

Примечание. @ {u} — это сокращение от origin/master . (И, конечно же, для работы вам понадобится этот удаленный репозиторий.)


Получил ответ на этот вопрос, также хочу вернуться к соответствию происхождению ( т. е. NO фиксируется до начала происхождения). Проведя дальнейшие исследования, мы обнаружили, что есть команда reset именно для этого:

git reset --hard @ {u}

Примечание. @ {u} — это сокращение от origin/master . (И, конечно же, для работы вам понадобится этот удаленный репозиторий.)


Самый простой ответ — тот, который дал odinho — Velmont

Сначала выполните git reset --merge ORIG_HEAD

Для тех, кто хочет сбросить после изменений нажата, сделайте это (потому что это первое сообщение, которое встречается для любых вопросов о слиянии git reset)

git push origin HEAD --force

Это будет сброшено таким образом, что вы больше не получите объединенные изменения после извлечения.


Самый простой ответ — тот, который дал odinho — Velmont

Сначала выполните git reset --merge ORIG_HEAD

Для тех, кто хочет выполнить сброс после того, как изменения были внесены, сделайте это (потому что это первое сообщение, показанное для любого git reset объединить вопросы)

git push origin HEAD --force

Это будет сброшено таким образом, что вы не получите объединенные изменения снова после извлечения.


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

  1. git reset --hard commitHash (вы должны использовать фиксацию, которую хотите перезапустить, например, 44a587491e32eafa1638aca7738)
  2. git push origin HEAD --force (отправка новой локальной главной ветки в origin/master)

Удачи и вперед!


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

  1. git reset --hard commitHash (вы должны использовать коммит, который вы хотите перезапустить, например . 44a587491e32eafa1638aca7738)
  2. git push origin HEAD --force (отправка новой локальной главной ветки в origin/master)

Удачи и вперед!


Просто для дополнительной возможности посмотреть, я был в основном следуя модели ветвления, описанной здесь: http://nvie.com/posts/a-successful-git-branching-model/и, как таковые, были объединены с - no-ff ( без перемотки вперед) обычно.

Я только что прочитал эту страницу, так как случайно объединил ветвь тестирования вместо ветки выпуска с главной для развертывания (веб-сайт, мастер — это то, что находится в реальном времени). К тестовой ветке слиты две другие ветки, всего около шести коммитов.

Итак, чтобы отменить весь коммит, мне просто нужен был один git reset --hard HEAD ^ , и он полностью отменил слияние. Поскольку слияния не выполнялись быстро, слияние было блоком, а один шаг назад — «ветвь не объединена».


Просто для дополнительной опции Чтобы посмотреть, я в основном следовал модели ветвления, описанной здесь: http://nvie.com/posts/a-successful-git-branching-model/и, как таковой, слился с - no-ff (без перемотки вперед) обычно.

Я только что прочитал эту страницу, так как случайно объединил ветвь тестирования вместо ветки выпуска с главной для развертывания (веб-сайт, мастер — это то, что находится в реальном времени). К тестовой ветке слиты две другие ветки, всего около шести коммитов.

Итак, чтобы отменить весь коммит, мне просто нужен был один git reset --hard HEAD ^ , и он полностью отменил слияние. Поскольку слияния не пересылались быстро, слияние было блоком, а один шаг назад — «ветвь не объединена».


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

Например, я случайно слил разработку перейти к мастеру и хотел отменить это. Выполните следующие действия:

  git checkout developgit branch -D mastergit branch -t master origin/master  

Вуаля! Мастер находится на той же стадии, что и источник, и ваше неверно объединенное состояние стирается.


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

Например, я случайно слил ветку разработки в мастер и хотел чтобы отменить это. Выполните следующие действия:

  git checkout developgit branch -D mastergit branch -t master origin/master  

Вуаля! Мастер находится на той же стадии, что и источник, и ваше неверно объединенное состояние стирается.


Если ветки мурдж и не толкнул. Затем нижеприведенная команда git reset будет работать для отмены слияния: git reset —merge ORIG_HEAD


Если ветки убивают и не толкают. Затем нижеприведенная команда git reset будет работать для отмены слияния: git reset —merge ORIG_HEAD


Если вам нужно решение для командной строки, я предлагаю просто использовать ответ MBO.

Если вы новичок, вам может понравиться графический подход:

  1. Начните gitk (из командной строки или щелкните правой кнопкой мыши в браузере файлов, если он у вас есть)
  2. Вы там можно легко заметить фиксацию слияния — первый узел сверху с двумя родителями
  3. Перейдите по ссылке к первому/левому родителю (тот, который находится в вашей текущей ветке перед слиянием, обычно красный для меня )
  4. В выбранной фиксации щелкните правой кнопкой мыши «Сбросить ветку сюда», выберите там жесткий сброс

Если вам нужно решение для командной строки, я предлагаю просто пойти с ответом MBO.

Если вы новичок, вам может понравиться графический подход:

  1. Начни gitk ( из командной строки или щелкните правой кнопкой мыши в обозревателе файлов, если он у вас есть)
  2. Вы можете легко заметить фиксацию слияния там — первый узел сверху с двумя родителями
  3. Перейдите по ссылке к первому/левому родительскому элементу (тот, который находится в вашей текущей ветке перед слиянием, обычно красный для меня)
  4. В выбранной фиксации щелкните правой кнопкой мыши «Сбросить ветку сюда» , выберите здесь полный сброс

Стратегия: Создайте новую ветку, в которой все было хорошо.

Обоснование: Отменить слияние сложно. Существует слишком много решений, в зависимости от многих факторов, таких как совершили ли вы свое слияние или подтолкнули его, или были ли новые коммиты после вашего слияния. Кроме того, вам все еще необходимо иметь относительно глубокое понимание git, чтобы адаптировать эти решения к вашему случаю. Если слепо следовать некоторым инструкциям, вы можете получить «пустое слияние», при котором ничего не будет слито, а дальнейшие попытки слияния заставят Git сказать вам «Уже обновлено».

Решение:

Допустим, вы хотите объединить dev в feature-1 .

  1. Найдите ревизию, которую вы хотите получить слияние:

      git log --oneline feature-1a1b2c3d4  Объедините ветку dev в feature-1  
  2. Проверить это (вернуться в прошлое):

      git checkout e5f6g7h8  
  3. Создайте новую ветку оттуда и проверьте ее:

      git checkout -b feature-1  

Теперь вы можете перезапустить слияние:

  1. Слияние: git merge dev

  2. Устраните конфликты слияния.

  3. Comm it: git commit

  4. Когда вы будете удовлетворены результатами, удалите старую ветку: git branch --delete feature-1


Стратегия: Создайте новую ветку, в которой все было хорошо.

Обоснование: Отменить слияние сложно. Существует слишком много решений, в зависимости от многих факторов, таких как совершили ли вы свое слияние или подтолкнули его, или были ли новые коммиты после вашего слияния. Кроме того, вам все еще необходимо иметь относительно глубокое понимание git, чтобы адаптировать эти решения к вашему случаю. Если вы слепо следуете некоторым инструкциям, вы можете получить «пустое слияние», при котором ничего не будет слито, а дальнейшие попытки слияния заставят Git сказать вам «Уже обновлено».

Допустим, вы хотите объединить dev в feature-1 .

  1. Найдите ревизию, которую вы хотите получить слияние:

      git log --oneline feature-1a1b2c3d4 Объединить ветку 'dev' в 'feature-1'  
  2. Проверить это (вернуться во времени):

      git checkout  e5f6g7h8  
  3. Создайте новую ветку оттуда и проверьте ее:

      git checkout  -b feature-1  

Теперь вы можете перезапустить слияние:

  1. Слияние: git merge dev

  2. Устраните конфликты слияния.

  3. Коммит: git commit

  4. Когда вы будете удовлетворены результатами, удалите старый ветка: git branch --delete feature-1


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

Ее заставка и проще, а затем сбросы, описанные в много ответов выше


Просто создайте новую ветку, а затем выберите желаемую ветку.

Ее заставка и проще, чем сбросы, описанные во многих ответах выше


Я думаю, вы можете сделать git rebase - i [hash] [branch_name] где [hash] — идентифицирующий хеш для того, насколько далеко назад вы хотите перемотать плюс один (или сколько угодно коммитов назад вы хотите вернуться) и затем удалите в редакторе строки для коммитов, которые вам больше не нужны. Сохраните файл. Выход. Молись. И его надо перемотать. Возможно, вам придется выполнить git reset --hard , но на этом этапе это должно быть хорошо. Вы также можете использовать это для извлечения определенных коммитов из стека, если вы не хотите сохранять их в своей истории, но это может оставить ваш репозиторий в состоянии, которое вам, вероятно, не нужно.


Думаю, вы можете сделать git rebase -i [hash] [branch_name] где [hash] — это идентифицирующий хеш для того, насколько далеко назад вы хотите перемотать плюс один (или сколько коммитов вы хотите вернуться), а затем удалите строки для коммитов в редакторе, которые вы не используете больше не хочу. Сохраните файл. Выход. Молись. И его надо перемотать. Возможно, вам придется выполнить git reset --hard , но на этом этапе это должно быть хорошо. Вы также можете использовать это для извлечения определенных коммитов из стека, если вы не хотите сохранять их в своей истории, но это может оставить ваш репозиторий в состоянии, которое вы, вероятно, не хотите.


Если вы совершили слияние:

  git  reset HEAD ~ 1 # Убедитесь, что вы возвращаете файлы слияния git add .git reset --hard  


Если вы совершили слияние:

  git reset HEAD ~ 1 # Убедитесь, что вы выполняете возврат, на самом деле файлы слияния git add .git reset  --hard  

  1. Сначала убедитесь, что что вы все зафиксировали.

  2. Затем сбросьте репозиторий в предыдущее рабочее состояние:

      $  git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36  

    или с помощью - hard ( это удалит все локальные, а не зафиксированные изменения! ):

      $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard  

    Используйте хеш, который был там до вашего ошибочного слияния ed commit.

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

      $ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704fcommit 4c3e23f529b581c3cbe95350e84e66e3cb05704f ... commit 16b373a96b0a353f7454b14fits правой части       правильную версию вашего репозитория:  
    • Используя вишневый выбор (изменения, внесенные некоторыми существующими коммитами)

        git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7  
    • Или путем выбора диапазона коммитов:

      • Сначала проверьте правильность изменений перед их объединением:

          git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f  li> 
      • Сначала проверьте правильность изменений перед их объединением:

          git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe  95350e84e66e3cb05704f  

        где это диапазон совершенных вами правильных коммитов (исключая ошибочно совершенное слияние).


  1. Первый , убедитесь, что вы все зафиксировали.

  2. Затем верните репозиторий в предыдущее рабочее состояние:

      $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36  

    или с помощью - hard ( это удалит все локальные, а не зафиксированные изменения! ):

      $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard  

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

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

      $ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704fcommit 4c3e23f529b581c3cbe95350e84e66e3cb05704f ... совершить 16b373a96b0a353f7454b141f7aaa6 правая версия           ваш репозиторий с помощью:  
    • Используя вишневый выбор (изменения, внесенные некоторыми существующими коммитами)

        git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7  
    • Или путем выбора диапазона коммитов:

      • Сначала проверьте правильность изменений перед их объединением:

          git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f    #  li> 

        Сначала проверьте правильность изменений перед их объединением:

          git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e6  6e3cb05704f  

        где это диапазон совершенных вами правильных коммитов (исключая ошибочно совершенное слияние).


  1. git stash

  2. git branch -d the_local_branch

  3. git checkout -t

  4. git stash apply

У меня это сработало .. !!


  1. git stash

  2. ветка git - d the_local_branch

  3. git checkout -t

  4. git stash apply

У меня это сработало .. !!


Если вы заметили, что вам нужно вернуться сразу после слияния, и вы больше ничего не сделали после попытки слияния , вы можете просто ввести эту команду: git reset --hard HEAD @ {1} .

По сути, ваше слияние sha будет указывать на HEAD @ {0} , если после слияния ничего не было зафиксировано, и поэтому HEAD @ {1} будет предыдущей точкой перед слиянием .


Если вы заметили, что вам нужно вернуться сразу после слияния, и вы больше ничего не сделали после попытки слияния, вы можете просто выполните эту команду: git reset --hard HEAD @ {1} .

По сути, ваше слияние sha будет указывать в HEAD @ {0} , если после слияния ничего не было зафиксировано, и поэтому HEAD @ {1} будет предыдущей точкой перед слиянием.


Самый простой из самых простых вариантов, намного проще, чем все, что здесь сказано:

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


Самый простой из простейших вариантов, гораздо проще, чем все, что здесь сказано:

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

Оцените статью
techsly.ru
Добавить комментарий