Сравните git ветку с перебазированной веткой - PullRequest
8 голосов
/ 16 февраля 2012

Я перебазировал довольно старую ветку темы на master. Поскольку во время перебазирования было довольно много конфликтов, я бы хотел сравнить старую ветку темы с перебазированной, чтобы убедиться, что я случайно не удалил и не испортил изменения в теме. Самое близкое, что я получил к этому, это различие результатов git diff master...topic и git diff master...topic-rebased. Это работает, но в финальной разнице много шума из-за изменений в коде контекста, номерах строк, хешах коммитов и т. Д., В дополнение к тому, что это не очень надежное решение. Есть ли более простой способ сделать это?

Ответы [ 3 ]

5 голосов
/ 28 мая 2012

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

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

rc = !git diff -w $(cat .git/rebase-merge/stopped-sha) > .git/rebase-merge/current-diff
rd = !git diff -w $(cat .git/rebase-merge/stopped-sha) | diff --suppress-common-lines .git/rebase-merge/current-diff - | cut -b 1-2 --complement | less

git rc хранит разницу между HEAD последней ревизией из ветви, которая перебазируется. После воспроизведения следующего коммита git rd сравнивает этот сохраненный дифференциал с различием между новым HEAD и следующим коммитом в ветви, которая была перебазирована. Следовательно, это показывает вам только разницу («ошибку»), вносимую при воспроизведении этого последнего коммита.

После проверки diff, позвоните git rc, чтобы обновить сохраненный diff и продолжить ребаз.

Вместо того, чтобы вручную вызывать git rc и git rd, вы даже можете добавить их к своему git-rebase-todo, чтобы они вызывались автоматически после каждого воспроизведения.

4 голосов
/ 16 февраля 2012

Возможно, вы захотите отразить эффективные изменения (патчи), произведенные каждым из них:

diff <(git log master..topic -p) <(git log master..old-place-of-topic -p)

Это эффективно удалит любые изменения, внесенные в master.

0 голосов
/ 16 февраля 2012

Если вас не волнует история коммитов из ветки тем, вы можете повторить ребаз и добавить флаг --squash.Это даст вам один коммит поверх вашей основной ветки, где вы сможете и просматривать измененные файлы файл за файлом.Я также добавил бы флаг --no-commit к rebase, чтобы я мог просмотреть изменения перед фиксацией git rebase.

git checkout master
git rebase --squash --no-commit topic
//review changes with your favourite git tool
git commit

Если вы не хотите повторять ребазу внешнего diffинструменты типа KDiff3 могут вам помочь.

...