Есть ли опция git-merge --dry-run? - PullRequest
       28

Есть ли опция git-merge --dry-run?

646 голосов
/ 01 февраля 2009

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

Я не вижу ничего похожего на --dry-run на git-merge.

Ответы [ 13 ]

721 голосов
/ 01 февраля 2009

Как отмечалось ранее, передайте флаг --no-commit, но, чтобы избежать фиксации ускоренной перемотки, также введите --no-ff, например:

$ git merge --no-commit --no-ff $BRANCH

Для проверки поэтапных изменений:

$ git diff --cached

И вы можете отменить объединение, даже если это ускоренное слияние:

$ git merge --abort
213 голосов
/ 08 июня 2011

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

  1. Загрузите пульт в ваш репозиторий. Например: git fetch origin master
  2. Запуск git merge-base: git merge-base FETCH_HEAD master
  3. Запустить git merge-tree: git merge-tree mergebase master FETCH_HEAD ( mergebase - это шестнадцатеричный идентификатор, который merge-base напечатал на предыдущем шаге)

Теперь предположим, что вы хотите объединить удаленный мастер с вашим локальным мастером, но вы можете использовать любые ветви. git merge-tree выполнит объединение в памяти и выведет результат на стандартный вывод. Grep для шаблона << или >>. Или вы можете распечатать вывод в файл и проверить это. Если вы обнаружите строку, начинающуюся с «изменено в обоих», то, скорее всего, возникнет конфликт.

49 голосов
/ 16 мая 2011

Моё простое грубое решение этого вопроса:

  1. Создание ветки "pre-master" (конечно, из мастера)

  2. Объедините все, что вы хотите, с этим пре-мастером.
    Тогда вы сможете увидеть, как произошло слияние, не касаясь мастера.

    • Слияние pre-master с мастером ИЛИ
    • Слияние всех веток, выпущенных подражателем, с мастером

В любом случае, я бы следовал совету @ orange80.

46 голосов
/ 02 февраля 2009

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

$ git pull $REMOTE $BRANCH
# uh oh, that wasn't right
$ git reset --hard ORIG_HEAD
# all is right with the world

РЕДАКТИРОВАТЬ: Как отмечено в комментариях ниже, если у вас есть изменения в вашем рабочем каталоге или промежуточной области, вы, вероятно, захотите сохранить их перед выполнением вышеупомянутых действий (иначе они исчезнут после git reset выше)

34 голосов
/ 18 апреля 2014

Я сделал псевдоним для этого и работает как талисман

 git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f '

Теперь я просто звоню

git mergetest <branchname>

Чтобы выяснить, есть ли конфликты.

27 голосов
/ 10 декабря 2010

Просто сравните вашу текущую ветку с удаленной веткой, это скажет вам, что изменится, когда вы выполните вытягивание / слияние.

#see diff between current master and remote branch
git diff master origin/master
19 голосов
/ 26 июня 2015

Я использую команду request-pull git для этого. Это позволяет вам видеть каждое изменение, которое произойдет при слиянии, , но без каких-либо действий в локальных или удаленных репозиториях .

Например, представьте, что вы хотите объединить ветку с именем "feature-x" в вашу основную ветку

git request-pull master origin feature-x

покажет вам сводку того, что произойдет (без каких-либо действий):

The following changes since commit fc01dde318:
    Layout updates (2015-06-25 11:00:47 +0200)
are available in the git repository at:
    http://fakeurl.com/myrepo.git/ feature-x
for you to fetch changes up to 841d3b41ad:
----------------------------------------------------------------
john (2):
    Adding some layout
    Refactoring
ioserver.js            |   8 +++---
package.json           |   7 +++++-
server.js              |   4 +--
layout/ldkdsd.js       | 277 +++++++++++++++++++++++++++++++++++++
4 files changed, 289 insertions(+), 7 deletions(-)
create mode 100644 layout/ldkdsd.js

Если вы добавите параметр -p, вы также получите полный текст патча, точно так же, как если бы вы делали git diff для каждого измененного файла.

17 голосов
/ 14 сентября 2017

Я удивлен, что никто еще не предложил использовать патчи.

Скажем, вы хотите проверить слияние со your_branch на master (я предполагаю, что вы master выписали):

$ git diff master your_branch > your_branch.patch
$ git apply --check your_branch.patch
$ rm your_branch.patch

Это должно сработать.

Если вы получаете ошибки типа

error: patch failed: test.txt:1
error: test.txt: patch does not apply

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


Обратите внимание, что это не фактически изменит ваше рабочее дерево (кроме создания файла исправления, конечно, но вы можете безопасно удалить его впоследствии). Из документации git-apply:

--check
    Instead of applying the patch, see if the patch is applicable to the
    current working tree and/or the index file and detects errors. Turns
    off "apply".

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

8 голосов
/ 11 июня 2015

Мне известно, что это старый вопрос, но он появляется первым в поиске Google.

Git ввел опцию --ff-only при слиянии.

От: http://git -scm.com / docs / git-merge


- далее только

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

Выполнение этого попытается объединить и выполнить перемотку вперед, и если это не удастся, оно прерывает работу и выдает подсказку о том, что перемотка вперед не может быть выполнена, но оставляет вашу рабочую ветку нетронутой. Если он может выполнить ускоренную перемотку вперед, он выполнит объединение в вашей рабочей ветви. Эта опция также доступна на git pull. Таким образом, вы можете сделать следующее:

git pull --ff-only origin branchA #See if you can pull down and merge branchA

git merge --ff-only branchA branchB #See if you can merge branchA into branchB
8 голосов
/ 17 декабря 2013

Это может быть интересно: из документации:

Если вы попытались выполнить слияние, которое привело к сложным конфликтам, и хотите начать заново, вы можете восстановить с помощью git merge --abort .

Но вы также можете сделать это наивным (но медленным) способом:

rm -Rf /tmp/repository
cp -r repository /tmp/
cd /tmp/repository
git merge ...
...if successful, do the real merge. :)

(Примечание: это не сработает, просто клонируя в / tmp, вам понадобится копия, чтобы быть уверенным, что незафиксированные изменения не будут конфликтовать).

...