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

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

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

13 ответов


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

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

чтобы изучить поэтапные изменения:

$ git diff --cached

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

$ git merge --abort

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

  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 для шаблона << или >>. Или вы можете распечатать вывод в файл и проверить это. Если вы найдете строку, начинающуюся с "изменено в обоих" , то, скорее всего, будет конфликт.


мое простое решение грубой силы:

1: Создайте ветвь pre-master (от master конечно)
2: объединить все, что вы хотите сделать с этим pre-master
тогда вы можете увидеть, как слияние произошло, не касаясь мастера.
3A: объединить pre-master в master или
3B: объединить все ветви wannabe-released в master

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


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

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

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


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

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

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

git mergetest <branchname>

чтобы узнать, есть ли какие-либо конфликты.


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

#see diff between current master and remote branch
git diff master origin/master

Я использую запрос-тянуть команда 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

Если добавить


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

скажите, что вы хотите протестировать слияние из 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+ лет, что этот вопрос существовал, никто не будет предложите это, казалось бы, очевидное решение.


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

Если вы попытались объединить, что привело к сложным конфликтам и хотите начните сначала, вы можете восстановить с git merge --abort.

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

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

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


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

Git представил опцию --FF-only при слиянии.

From:http://git-scm.com/docs/git-merge


--ff-только

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

это попытка объединить и вперед, и если он не прерывает и предлагает, что вперед не может быть выполнена, но оставляет свои рабочие ветки нетронутыми. Если он может перемотать вперед, то он выполнит слияние на вашей рабочей ветви. Эта опция также доступна на 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

Я использую git log, чтобы увидеть, что изменилось в ветке функции из master branch

git log does_this_branch..contain_this_branch_changes

например - чтобы увидеть, какие коммиты находятся в ветви объекта, которая / не была объединена с master:

git log master..feature_branch

Если вы хотите перемотать вперед от B к A, то вы должны убедиться, что git log B..A ничего не показывает, то есть у A нет ничего, чего нет у B. Но даже если Б..У A есть что-то, вы все равно можете слиться без конфликтов, поэтому вышеизложенное показывает две вещи: что будет быстрая перемотка вперед, и, таким образом, вы не получите конфликт.


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