Скасуйте об'єднання Git, яке ще не було натиснуто


3941

У межах своєї гілки я працював git merge some-other-branchлокально, але ніколи не підштовхував зміни до початкового майстра. Я не хотів зливатися, тому хотів би скасувати це. Коли я робив git statusпісля мого злиття, я отримував це повідомлення:

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

Спираючись на знайдені мені інструкції , я спробував запустити

git revert HEAD -m 1

але тепер я отримую це повідомлення за допомогою git status:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

Я не хочу, щоб моя філія випереджала будь-яку кількість комісій. Як я можу повернутися до цього моменту?


3
Якщо вам потрібно зберегти історію, іншими словами, є зміна, яку хтось коли-небудь відтягнув від вас, або ви її кудись підштовхнули, використовуйте рішення у відповіді Юрія Ушакова внизу!
Седрік

6
Скасуйте вибір поточної виграшної відповіді, вона небезпечна (як багато вказували), хоча все ще збирає голоси. Мені "MBO" -и виглядають найкраще, хоча у нього менше очок.
inger



3
Це чудовий ресурс прямо з Github: Як скасувати (майже) що-небудь із Git
jasonleonhard

Відповіді:


4454

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

git reset --hard commit_sha

Є й інший спосіб:

git reset --hard HEAD~1

Це дозволить вам отримати 1 комісію.

Майте на увазі, що будь-які модифіковані та непослані / непомічені файли будуть повернені до їх немодифікованого стану . Щоб утримати їх, не зберігайте зміни, або перегляньте --mergeваріант нижче.


Як @Velmont запропонував нижче у своїй відповіді, у цьому прямому випадку використовуйте:

git reset --hard ORIG_HEAD

може дати кращі результати, оскільки це має зберегти ваші зміни. ORIG_HEADбуде вказувати на зобов’язання безпосередньо перед тим, як відбулося злиття, тому вам не доведеться полювати на це самостійно.


Наступна порада - використовувати --mergeперемикач замість того, що --hardвін не скидає файли без потреби:

git reset --merge ORIG_HEAD

--мірувати

Скидає індекс і оновлює файли в робочому дереві, які відрізняються між <commit> і HEAD, але зберігає ті, які відрізняються між індексом і робочим деревом (тобто, які мають зміни, які не були додані).


129
Я не думаю, що це буде (завжди?) Спрацьовувати - "один до об'єднання" буде останньою комісією, яка була об'єднана з іншої гілки - це не буде останньою комісією для поточної гілки . Правильно? (Це може бути просто результатом того, що git logвирішить показати за замовчуванням - можливо, для цього є інший вихід git logабо git reflogможе бути використаний для цього)
Джон Бачір

6
Я думаю, це може залежати від того, чи зливаєш ти сквош.
Марцін Гіл

29
@JohnBachir має рацію. У git logвисновку потрібно переглянути два батьківські коміти. Один - це остання комісія у вашій галузі, а остання - у філії, у яку ви об'єдналися. Ви хочете, щоб git reset --hardбатьківська комісія в галузі, в яку ви об'єдналися.
Джастін

7
@JohnBachir: Поки "злиття" насправді не буде швидким вперед, це призведе до нового зобов’язання, яке знаходиться у верхній частині журналу, і це зобов'язання має двох батьків (або більше двох, якщо ви робите восьминога злиття). Якщо ви видалите це одне об'єднання злиття, то і всі старі комісії, що надійшли в результаті злиття, також зникнуть. Проте, щоб бути в безпеці, після скидання git скаже вам, де знаходиться нова голова: "HEAD зараз у 88a04de <повідомлення повідомлення>". Я завжди дивлюся на це, щоб переконатися, що я опинився там, де очікував бути. Мій проект використовує стандартну схему іменування галузей, щоб зберігати речі запам'ятовуються.
Марк Е. Хааз

44
Що мені здалося корисним - подивитися на "git reflog" та шукати останнє зобов'язання, яке я зробив у майстра. Тоді робітьgit reset --hard <commit_sha>
Макс Вільямс

1455

Якщо припустити, що ваш місцевий господар не випереджав походження / господаря, ви повинні зробити це

git reset --hard origin/master

Тоді ваша місцева masterфілія повинна виглядати ідентично origin/master.


71
@Carter це насправді не найкраща відповідь. Цілком можливо, що початковий / головний господар може випередити свого місцевого господаря, що передував злиття, за деякими комітетами, у такому випадку це може не дати бажаних результатів
Друва Сагар

15
@ dhruva-sagar Так, але поки git не скаже, що ти позаду, і ти не прийдеш, ти повинен бути добре.
Кельвін

3
Дякую! Це ідеально, якщо (і лише якщо) у вас віддалене сховище.
tomc

2
Ні, це не ідеальне питання для цього питання, дивіться пункт «припустити». Відповідь MBO насправді охоплює цей випадок, і випадок, коли злиття не є єдиним місцевим зобов'язанням.
inger

2
Ще раз, можливо, це попередження повинно перейти до самої відповіді: Завжди уникайте переписування історії git!
Крегокс

1175

Дивіться розділ 4 книги "Гіт" та оригінальну публікацію Лінуса Торвальда .

Щоб скасувати злиття, яке вже було натиснуто :

git revert -m 1 commit_hash

Обов’язково скасуйте повернення, якщо ви знову вкажете гілку, як сказав Лінус.


10
@perfectionist погодився :) Добре побажав, що є спосіб перенести цю відповідь на інше
питання--

для отримання додаткової інформації про повернення: посилання
assaqqaf

1
Щоб бути впевненим, що це відновлення спрацювало, ви можете зробити git diff hash1 hash2, де hash1 - це скоєне повернення, а hash2 - це старий фіксатор, до стану якого ви намагалися повернутися. Немає результату == успіх! Мені вдалося відкатати декілька комітетів, зробивши це кілька разів, починаючи з повернення останнього злиття та роботи назад. git diff показав мені, що я опинився в бажаному стані.
Роберт Сінтон

6
Зауважте, що це фактично не вирішує питання оригінального афіші . Оригінальний плакат вже використаний git revert -m 1 <commit>. Проблема полягає в тому, що це не стирає випадкового злиття, яке він зробив (і ще не натиснув). Інші відповіді, що стосуються жорстких перезавантажень, кращі для проблеми оригінального плаката.

Це чудовий ресурс прямо від Github: Як скасувати (майже) що-небудь із Git
jasonleonhard

986

Дивно, що найпростішої команди бракувало. Більшість відповідей працює, але скасування злиття, яке ви тільки що зробили, це простий і безпечний спосіб :

git reset --merge ORIG_HEAD

Посилання ORIG_HEADвказуватиме на оригінальний фіксатор, що відбувся до злиття.

( --mergeПараметр не має нічого спільного з об'єднанням. Це просто git reset --hard ORIG_HEAD, але безпечніше, оскільки він не торкається невмілих змін.)


17
Якщо ви з цього часу забруднили своє робоче дерево, git reset --merge ORIG_HEADці зміни зберігаються.
проголошено

1
Це єдина правильна відповідь (я не кажу, що це найкраща відповідь - відзначте різницю). Скажімо, на майстру, я зробив 3 коми при t1, t3 і t5. Скажімо, на гілці1 я зробив 3 коментарі на t2, t4 і t6 (припустимо, t1, t2, t3, t4, t5 і t6 знаходяться в хронологічному порядку). Будь-яка команда, схожа на, git reset --hard HEAD~5буде скидати лише HEAD (може видаляти комісії як у master, так і у відділенні1). Лише --mergeопція видаляє merge.
Ману Манджунат

@Manu --mergeОпція фактично не видаляє злиття, ви можете використовувати --hardїї також буде добре. Тут є підказка ORIG_HEAD, вона встановлюється перед тим, як зробити злиття там, де ви стоїте в цій точці. :)
odinho - Велмонт,

@yingted, що ви розумієте під "Якщо ви з цього часу забруднили своє робоче дерево, git reset --merge ORIG_HEAD зберігає ці зміни." Ви мали на увазі зміну файлів після об'єднання? У будь-якому разі я зробив злиття, а потім вирішив деякі конфлікти. Але тоді я хотів скинути злиття і зробив, як прописано в цій відповіді. Все було нормально, і це не зберегло мої зміни, зроблені після злиття. Моє місцеве репо схоже на позицію до того, як я зробив злиття.
Саміта Чатхуранга

git reset --hard ORIG_HEADКоманда працювала відмінно для мене - це , можливо, допомогло те , що я не робив жодних - або інших змін в сховище після того , як місцевий git mergeя намагався скасувати. Команда просто скидає стан сховища до того, яким він був до злиття. Дякую за чудову пораду!
bluebinary

391

З новішими версіями Git, якщо ви ще не здійснили злиття і у вас є конфлікт злиття , ви можете просто зробити:

git merge --abort

Від man git merge:

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


8
Його злиття здійснено, але не підштовхне (див. Заголовок), він уже злився, ваша команда працює лише тоді, коли він все ще знаходиться посеред злиття
JBoy

135

Вам слід скинути попередній комітет. Це має працювати:

git reset --hard HEAD^

Або навіть HEAD^^повернути це повернення. Ви завжди можете дати повну довідку SHA, якщо не впевнені, скільки кроків назад ви повинні зробити.

У разі, якщо у вас є проблеми, і у вашої головної гілки не було місцевих змін, ви можете скинути їх на origin/master.


5
Найкраща відповідь ІМХО - це власний ОП (припускаючи лише 1 крок до повернення, що, здавалося, було у випадку Q), а також ярлик randomguy3 (який працює, коли "ваша головна гілка не мала місцевих змін ")
інгер

4
Ви, коментатори, @Inger та @Konstantin, чому? Ви прийшли сюди після того, як була створена моя відповідь, і це правильніше. Просто піднятися на голову на один крок часто неправильно, і вам доведеться насправді порахувати, як далеко вам потрібно пройти. Git вже набір ORIG_HEADдля вас, чому б не використовувати його?
odinho - Велмонт,

чи скине місцеві зміни також? #PleaseUpdate.
CoDe

Для мене це спрацювало ідеально, скидання голови на зразок цього має набагато більше сенсу, ніж половина відповідей тут.
Varda Elentári

HEAD ^ дорівнює чині перед HEAD? і ^^ - це два коміти раніше? Здогадавшись, що це не спрацює зі швидкими злиттями вперед?
Маркус Леон

87

Останнім часом я використовую, git reflogщоб допомогти у цьому. Це здебільшого працює лише в тому випадку, якщо злиття відбулося, і це було на вашій машині.

git reflog може повернути щось на кшталт:

fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 HEAD@{1}: checkout: moving from master to my-branch
e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master
e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 HEAD@{4}: reset: moving to HEAD^
8400a0f HEAD@{5}: rebase: aborting

Перший рядок вказує, що відбулося злиття. 2-й рядок - це час до мого злиття. Я просто git reset --hard 43b6032змушую цю гілку відстежуватись до початку злиття та продовжувати.


Чудова відповідь, дякую! Потрібно скасувати злиття, але інші відповіді просто зіпсували його більше, використовуючи, reflogщоб отримати SHA та передати це в git resetвідпрацьоване.
Ланкімарт

51

З сучасним Git ви можете:

git merge --abort

Старіший синтаксис:

git reset --merge

Стара школа:

git reset --hard

Але насправді варто зазначити, що git merge --abortце рівнозначно тому, git reset --mergeщо MERGE_HEADє. Це можна прочитати в команді Git довідки для злиття.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

Після невдалого злиття, коли його немає MERGE_HEAD, невдале злиття може бути скасовано git reset --merge, але не обов'язково з git merge --abort, тому вони є не лише старими, а новими синтаксисами для одного і того ж .

Особисто я вважаю git reset --mergeнабагато потужнішим і кориснішим у повсякденній роботі, тож саме цим я завжди користуюся.


Для мене чудово працювали. Кожен інший пост каже, що це так складно, але це зробило саме те, що очікувалося. Я вважаю, що це спрацювало лише тому, що були конфлікти, що не відповідає точно на початкове запитання.
Джеремі

Ця відповідь не зосереджується на ситуації з ОП, а залишає важливий контекст.
Бен Уілер

37

Гаразд, відповіді, які мені дали інші люди, були близькими, але це не спрацювало. Ось що я зробив.

Робити це ...

git reset --hard HEAD^
git status

... надав мені такий статус.

# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.

Потім мені довелося вводити одну і ту ж git resetкоманду ще кілька разів. Кожного разу, коли я робив це, повідомлення змінювалося по одному, як ви бачите нижче.

> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.

У цей момент я побачив, що повідомлення про статус змінилося, тому я спробував виконати git pull, і це, здавалося, спрацювало:

> git pull
Updating 2df6af4..12bbd2f
Fast forward
 app/views/truncated |    9 ++++++---
 app/views/truncated |   13 +++++++++++++
 app/views/truncated |    2 +-
 3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master

Отож, довге оповідання коротке, мої команди зійшли до цього:

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

19
або ви могли скористатисяHEAD^^^^
hasen

17
можливо навіть скинути до origin/master;)
hasen

23

Ви можете використати git reflogдля пошуку попереднього замовлення. Іноді це хороший стан, до якого ти хочеш повернутися.

Конкретно,

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

1
Дякую! Ви заощадили пів дня моєї роботи. Однак я не зміг вийти з режиму перемикання жодної команди.
Катажина

1
@Katarzyna використовуйте клавішу "q" для виходу з рефлогу
Amjed Baig

21

Якщо ви знаходитесь в середині злиття, ви завжди можете перервати це git merge --abort


2
дякую брато, і я збирався зробити цю страшну штуку правильною відповіддю. пощастило, що я прокрутився вниз. я просто хочу видалити об'єднати голову
Nyuu

15

Мені вдалося вирішити цю проблему за допомогою однієї команди, яка не передбачає пошуку ідентифікатора фіксації.

git reset --hard remotes/origin/HEAD

Прийнята відповідь не працювала для мене, але ця команда досягла результатів, яких я шукав.


Саме так! Він скидає ваші зміни до ГЛАВИ філії! Не робив один за одним
Карлос Зінато

не працювало для мене. фактично надіслали місцевий відділення ще місяць-два. На щастя, це все локально, тому я завжди можу знищити гілку та отримати її знову. Просто хотілося вказати на той випадок, якщо інші спробували це.
Метт Пенгеллі

@MattPengelly цей метод значною мірою недокументований і зазвичай працює, якщо ваша гілка синхронізується з віддаленою гілкою до того, як ви зробили об'єднання. Чи минули місяці, коли ваша філія синхронізувалася з віддаленою гілкою?
Ральф Рітох

@MattPengelly це також залежить від того, на яку галузь вказано HEAD. Я використовую gitflow для одного з моїх проектів, і, хоча я перебуваю на гілці розробки, віддалений / походження / HEAD вказується на початок / master, тому, якщо мені потрібно скасувати злиття, мені, ймовірно, потрібно буде скинути на віддалені / походження / розвиток
Ральф Рітох

14

Якщо ви цього ще не зробили, ви можете лише користуватися

$ git checkout -f

Це скасує злиття (і все, що ви зробили).


Спробував це, і це фактично збільшило кількість комісій, які випереджає моя місцева філія.
barclay

14

До цього питання також потрібно повернутись до відповідного походження (тобто НЕ береться до початку). Досліджуючи далі, виявив, що є resetкоманда саме для цього:

git reset --hard @{u}

Примітка: @{u}це скорочення для origin/master. (І, звичайно, для цього вам потрібен віддалений сховище.)


14

Ви повинні змінити свою ГОЛОВУ, не вашу, звичайно, але git HEAD ....

Тож перед тим, як відповісти, давайте додамо деяку інформацію, пояснивши, що це HEAD?

First of all what is HEAD?

HEADце просто посилання на поточний комітет (останній) у поточній галузі.
У HEADбудь-який момент може бути лише сингл . (крім git worktree)

Вміст HEADзберігається всередині, .git/HEADі він містить 40 байт SHA-1 поточної комісії.


detached HEAD

Якщо ви не перебуваєте на останньому комітеті - це означає, що HEADвказує на попереднє вчинення в історії, його називають detached HEAD.

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

У командному рядку це виглядатиме так - SHA-1 замість назви гілки, оскільки значення HEADне вказує на кінчик поточної гілки

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

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

Кілька варіантів того, як відновитись із відокремленої ГЛАВИ:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Це дозволить перевірити нову гілку, яка вказує на бажану комісію.
Ця команда перевірятиме дану комісію.
У цей момент ви можете створити відділення і почати працювати з цього моменту.

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

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

Кожен раз, коли зміниться HEAD, буде новий запис у reflog

git reflog
git checkout HEAD@{...}

Це поверне вас до бажаного завдання

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


git reset --hard <commit_id>

"Перемістіть" голову назад до потрібної фіксації.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
  • Примітка: ( Так як Git 2.7 )
    ви також можете використовувати git rebase --no-autostashтакож.

git revert <sha-1>

"Скасувати" заданий діапазон фіксації чи фіксації.
Команда скидання "скасує" будь-які зміни, внесені в дану комісію.
Нова фіксація з виправленням патча буде здійснена, тоді як оригінальна комісія також залишиться в історії.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

Ця схема ілюструє, яка команда робить що.
Як ви бачите, там можна reset && checkoutзмінити HEAD.

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


Це скарб 🐱‍👤🐱‍👤🐱‍👤
Джаванд Сінгх

12

Найпростіша відповідь - це та, яку дає Одінью - Велмонт

Спочатку зробіть git reset --merge ORIG_HEAD

Для тих, хто хоче скинути зміни після натискання змін, зробіть це (Тому що це перше повідомлення, яке спостерігається за будь-якими питаннями про злиття git щодо злиття)

git push origin HEAD --force

Це скинеться таким чином, що після повернення ви знову не отримаєте об'єднані зміни.


10

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

Я просто прочитав цю сторінку, оскільки випадково з’єднав тестову гілку замість своєї гілки випуску з майстром для розгортання (веб-сайт, майстер - це те, що живе). Тестова гілка має дві інші гілки, об'єднані до неї, і становить приблизно шість комітів.

Отже, щоб скасувати цілу комісію, мені просто знадобився один, git reset --hard HEAD^і це повернуло все злиття. Оскільки злиття не було швидко переслане, злиття було блоком, і один крок назад - "гілка не об'єднана".


10

Ви можете скористатися лише двома командами для відновлення злиття або перезавантаження певним комітетом:

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

Удачі та йди вперед!


10

Це можна зробити декількома способами.

1) Скасувати злиття

Якщо ви перебуваєте між поганим злиттям (помилково зроблено з неправильною гілкою), і хочете уникнути злиття, щоб повернутися до гілки останнього, як показано нижче:

git merge --abort

2) Скиньте HEAD до віддаленої гілки

Якщо ви працюєте з відділенням віддаленої розробки, ви можете скинути HEAD до останнього комітету на віддаленій гілці, як показано нижче:

git reset --hard origin/develop

3) Видаліть поточну гілку та знову вийдіть із віддаленого сховища

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

git checkout master 
##to delete one branch, you need to be on another branch, otherwise you will fall with the branch :) 

git branch -D develop
git checkout -b develop origin/develop

що "1) Скасувати злиття" було досить досить. Оголошення.
CodeToLife

1
Будь обережний! git merge --abort "можна запустити лише після того, як злиття призвело до конфліктів. git merge --abort припинить процес злиття та спробує відновити стан попереднього об'єднання"
Pedro García Medina

8

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

Наприклад, я випадково об'єднав розвинуту галузь у головну і хотів скасувати це. Виконуючи наступні дії:

git checkout develop
git branch -D master
git branch -t master origin/master

Вуаля! Майстер знаходиться на тому ж етапі, що і походження, і ваше неправильно об'єднане стан стирається.


1
Примітка. Це скасовує не тільки злиття, але й будь-які локальні комітети, які були зроблені з часу останнього поштовху до походження.
Martijn Heemels

4

Якщо ви хочете вирішити командний рядок, пропоную просто відповісти MBO.

Якщо ви новачок, вам може сподобатися графічний підхід:

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

4

Стратегія: Створіть нову гілку, з якої все було б добре.

Обґрунтування: Повернення об'єднання важко. Занадто багато рішень, залежно від багатьох факторів, таких, як ви здійснили чи підштовхнули ваше злиття або якщо з моменту злиття з’явилися нові коміти. Крім того, ви все ще повинні мати глибоке розуміння git, щоб адаптувати ці рішення до вашого випадку. Якщо сліпо слідувати деяким інструкціям, ви можете закінчити "порожнє злиття", де нічого не буде злито, і подальші спроби злиття змусять Git сказати вам "Вже оновлено".

Рішення:

Припустимо, ви хочете об'єднати devв feature-1.

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

    git log --oneline feature-1
    a1b2c3d4 Merge branch 'dev' into 'feature-1' <-- the merge you want to undo
    e5f6g7h8 Fix NPE in the Zero Point Module <-- the one before the merge, you probably want this one
    
  2. Перевірте це (поверніться у часі):

    git checkout e5f6g7h8
    
  3. Створіть звідти нову гілку та перевірте її:

    git checkout -b feature-1
    

Тепер ви можете перезапустити об'єднання:

  1. Об’єднання: git merge dev

  2. Виправте конфлікти злиття.

  3. Виконати: git commit

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


2

Просто створіть нову гілку, а потім виберіть потрібні вишні.

Його заставка та простіше потім скидає, описане в багатьох відповідях вище


1
Я погоджуюся з цією пропозицією, особливо якщо вам не зовсім зручні перелічені команди git. Це може бути повільніше, і більше "трудів", але якщо це не дуже сильно, і ви переймаєтесь втратою роботи, варто докласти зусиль.
Грег

1

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


1

Якщо ви здійснили злиття:

git reset HEAD~1
# Make sure what you are reverting is in fact the merge files
git add .
git reset --hard

1
  1. Спочатку переконайтеся, що ви все зробили.

  2. Потім відновіть сховище до попереднього робочого стану:

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36
    

    або за допомогою --hard( це видалить усі локальні, не скоєні зміни! ):

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
    

    Використовуйте хеш, який був там, до того, як ви зробили неправильно об'єднані.

  3. Перевірте, які комісії ви хочете повторно здійснити вгорі попередньої правильної версії:

    $ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    ...
    
    commit 16b373a96b0a353f7454b141f7aa6f548c979d0a
    
    ...
    
  4. Застосовуйте свої правові зобов’язання у верхній частині правої версії вашого сховища:

    • Використовуючи вишню (зміни, внесені деякими існуючими комісіями)

          git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7
      
    • Або вибираючи вишневий асортимент комісій:

      • Перша перевірка правильних змін перед об'єднанням:

        git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        
      • Перша перевірка правильних змін перед об'єднанням:

        git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        

        де це діапазон правильних комітетів, які ви здійснили (виключаючи неправильно здійснене злиття).


1
  1. git stash

  2. git branch -d the_local_branch

  3. git checkout -t <name of remote>

  4. git stash apply

Це працювало для мене .. !!


0

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

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


0

Найпростіший з найпростіших випадків, набагато простіший за все, що тут сказано:

Видаліть місцеву гілку (локальну, а не віддалену) та знову потягніть її. Таким чином ви скасуєте зміни на своїй головній гілці, і будь-хто буде впливати на зміни, які ви не хочете натискати. Почніть це з початку.


0

У цьому випадку ви хочете скинути свою філію git reset --hard <branch_name>. Якщо ви хочете зберегти свої зміни перед їх перезавантаженням, не забудьте створити нову гілку та git checkout <branch_name>.

Ви також можете скинути стан до певної комісії git reset --hard <commit_id>.

Якщо зміни були натиснуті, ви можете використовувати це git revert <branch_name>замість цього. Не забудьте дізнатись, як використовувати відновлення git та git checkout в інших сценаріях.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.