git: ветви разошлись; как продолжить?

мое местное дерево разошлось от мастера:

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 7 and 3 different commit(s) each, respectively.
#
nothing to commit (working directory clean)

пробовал git pull --rebase так и не удалось:

$ git pull --rebase
First, rewinding head to replay your work on top of it...
Applying: * ...
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging ChangeLog
CONFLICT (content): Merge conflict in ChangeLog
Failed to merge in the changes.
Patch failed at 0001 * ...

поэтому я вернулся с git rebase --abort и теперь я нахожусь в квадрате 1.

чего я хочу, так это:

  1. "экспорт" моих 7 патчей в читаемые человеком файлы diff (a la экспорт рт. ст.).
  2. сделайте мое дерево копией оригинала/мастера (a la hg полосы).
  3. повторно примените мои 7 патчей один за другим вручную (a la импорт hg).

Я понимаю, что git rebase --продолжить это. Я сделал это, и это сработало (после нескольких ручных слияний и в Git добавить). Однако я хочу иметь возможность сделать это вручную, поэтому мне интересно, что такое git команды, соответствующей hg команды выше.

спасибо.

PS. Пожалуйста, не говорите мне, что с помощью изменений С git - это глупо. Даже если и так, это не мое дело.

4 ответов


есть, конечно, несколько способов сделать это вручную. У вас все равно будут те же конфликты, потому что git в основном делает это для вас под капотом. Но если вы хотите сделать это вручную, вот несколько способов.

во-первых, экспортируйте свои коммиты в виде серии патчей. Самый простой способ сделать это-использовать git format-patch:

git format-patch -M @{upstream}

создаст 7 файлов исправлений - по одному для каждого из ваших коммитов. (Обратите внимание, что "@{upstream} " является буквальным - это не так хорошо известная особенность ЖКТ.) Это лучше, чем захват вывода git diff потому что вся информация о фиксации (автор, дата, сообщение и т. д.) сохраняются.

затем вы можете сбросить свой репозиторий в соответствии с восходящим:

git reset --hard @{upstream}

затем вы можете повторно применить патчи используя git am -- либо по одному, либо все сразу.

git am 0001-blah-blah.patch
git am 0002-blah-blah.patch
...

второй вариант-создать запасную ветку с вашей работой над ней:

git branch scrap

затем сброс ваша ветка вверх по течению:

git reset --hard @{upstream}

затем вишневый выбор коммитов:

git cherry-pick scrap~6
git cherry-pick scrap~5
git cherry-pick scrap~4
...

затем мусор металлолом:

git branch -D scrap

ты пробовал git merge origin/master ?

ваши удаленные изменения хранятся в ветке origin/master. (Или будет, если вы это сделаете git fetch.) Просто объедините две ветви -master и origin/master - как любые две ветви и разрешить конфликты (если таковые имеются).

Это может помочь вам, если вам нужно знать, как разрешать конфликты git.

как разрешить конфликты слияния в Git?


Git говорит, что он пытался сделать именно то, что вы хотите (повторно применить свои патчи поверх новейших изменений из origin/master), но не удалось с конфликтом. Сразу после git pull --rebase конфликты откройте редактор с конфликтующими файлами (git status перечислит их в разделе "оба изменены") и разрешит конфликты, отмеченные в стандартном diff lingua. Когда вы закончите разрешение конфликта, бросьте git rebase --continue (или git rebase --skip Если ваше разрешение не вносит никаких изменений).

читайте о его at документация Stackexchange для "разрешения конфликтов слияния после git rebase".


вот несколько хороших ответов на ту же проблему (только без разрешения конфликтов):

master branch и "origin/master" разошлись, как "undiverge " ветви"?

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

git log HEAD..origin/master

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

git pull --rebase

как вы сказали, Вы появляются конфликты.

разрешение конфликтов является повторяющейся проблемой. Если вы еще не сделали этого, вы можете взглянуть на git mergetool (см. git help mergetool для деталей). Чтобы получить графическую поддержку, я бы рекомендовал перезаписать merge.tool конфигурации. Например, если вы хотите использовать meld для 3-полосных слияний вы можете использовать:

git config --global merge.tool meld

Итак, после того, как вы разрешили конфликт, что git pull --rebase сделать? Он объединил все изменения из источника / мастера в ваш локальный Мастер, и воспроизвел ваши изменения поверх него. Поздравляю, ты вернулся к нормальной жизни.