diff для git rebase всухую - PullRequest
       80

diff для git rebase всухую

0 голосов
/ 13 июня 2018

Я хочу посмотреть, какие части ветки topic уже включены в ветку upstream , и какие возможные конфликты могут возникнуть при перебазировке.

Должнобыть своего рода пробным прогоном для git-rebase, который показывает разницу между topic и upstream , исключая изменения, которые не связаны с topic .

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Я хочу посмотреть, какие части ветки topic уже включены в ветку upstream , и какие возможные конфликты могут возникнуть при rebase.

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

Поскольку перебазирование - это своего рода слияние, яПодумайте, что самый простой способ сделать это - выполнить слияние без создания коммита (вы можете назвать это « dry merge ») и проверить разницу в unmerged (т.е. конфликтовать) файлы:

git checkout topic
git merge upstream --no-commit --no-ff

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

git diff --diff-filter=U
0 голосов
/ 17 июня 2019

Один из подходов здесь состоит в том, чтобы сделать копию вашей целевой ветви (git checkout -b tmpbranch), выполнить там перебазирование, а затем сравнить его с неизмененной ветвью.

0 голосов
/ 13 июня 2018

Одним из решений является применение diff на diffs.Идея такова:

  1. получить разность между точка ветвления и тема
  2. получить разность между вверх по течению и topic
  3. сравнить эти различия

git-diff-rebase файл сценария:

#!/bin/bash

upstream="$1"
topic="$2"

root=$( git rev-parse --show-toplevel )
forkpoint=$( git merge-base $upstream $topic )

if [ -z "$forkpoint" ] ; then
  echo "Merge base is not found" 1>&2
  exit 1
fi

# list of the changed files (space separated)
files=$( git -C "$root" diff --name-only $forkpoint $topic | paste -s -d ' ' )

diff -t --tabsize=4 -W $(tput cols) -y \
  <( git -C "$root" diff $forkpoint $topic ) \
  <( git -C "$root" diff $upstream $topic -- $files ) \
  | grep -v '^ *>'
  # skip changes that do not interfere with topic (empty left part)

Примечание: этот сценарий не должен работать для файлов с пробеламив имени.

Использование: git-diff-rebase master topic | less

Как интерпретировать результат:

  • * * < - (пустая правая часть) уже включено в восходящий поток
  • + * | * - (идентичный текст) уже включен в восходящий поток
  • + * + * - без конфликтов
  • - * - * -нет конфликта
  • - * | + * - конфликт
  • + * | - * - возможный конфликт

Где * является заполнителем для любого текста.

...