удалить - отменить удаление git




Отменить слияние Git, которое еще не было нажато (18)

  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
        

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

В моей основной ветке я сделал 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.

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


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

git reflog может вернуть что-то вроде:

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

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


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

git reset --hard HEAD^

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

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


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

В частности,

$ git reflog
$ git reset --hard [email protected]{0}

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

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

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


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

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

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

Если вы еще не сделали этого, вы можете использовать

$ git checkout -f

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


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

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


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

git reset --hard @{u}

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


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

git reset --hard origin/master

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


С 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 поскольку он не перезагружает файлы без необходимости:

--merge

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


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

git merge --abort

От man git merge :

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


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

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


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

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

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

git push origin HEAD --force

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


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

git reset --merge ORIG_HEAD

ORIG_HEAD указывает на первоначальную фиксацию до слияния.

(Опция --merge не имеет никакого отношения к слиянию. Это похоже на git reset --hard ORIG_HEAD , но более безопасный, так как он не касается незафиксированных изменений.)


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

Делая это...

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

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

git reset --hard remotes/origin/HEAD

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


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

Обоснование: возврат слияния затруднен. Слишком много решений, в зависимости от многих факторов, таких как то, что вы совершили или нажали ваше слияние, или были новые коммиты с момента вашего слияния. Также вам необходимо иметь относительно глубокое понимание 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. Commit: git commit

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





git-merge