Переглянути відмінності гілок з цвіллю?


159

Я знаю, що я можу побачити різницю між HEAD та поточним станом за допомогою meld .. Але як я можу побачити відмінності між гілками, наприклад, masterі develз цвіллю?

На даний момент я роблю такі кроки:

  1. Перейменування папки робочої копії
    Наприклад mv /projectA /projectA_master)
  2. Клоніруйте проект знову
    git clone url
  3. Перехід на develвідділення
    cd projectA && git -b devel origin/devel
  4. Перегляньте відмінності з meld
    meld /projectA_Master projectA

Чи не існує простішого способу отримати такий самий результат у розплаві? Мені це потрібно лише для того, щоб переглянути зміни, а не передусім для об'єднання.


Відповіді:


55

Я також вважаю це питання дратівливим, тому я зробив git meld, який дозволяє більш зручно розрізняти довільні коміти проти робочого дерева або місця постановки. Ви можете знайти його за адресою https://github.com/wmanley/git-meld . Це трохи схоже на сценарій Марка, але працює для порівняння будь-яких довільних комірок або області постановки або робочого каталогу з будь-якими іншими. Якщо одна з речей, з якими ви порівнюєте, - це робоче дерево, то воно також читається - записуйте, щоб ви не втратили своїх змін.


1
Відмінний інструмент, Вілл. Дякую! Ретельно рекомендується ... тепер, якби він працював і на злиттях.
Штрих

TYVM для чудового інструменту - (нагадування про те, щоб самому додати! Псевдонім)
kfmfe04

26
Цитуючи Вілла з хіт-сховища github: "ПРИМІТКА: git-meld є застарілим, оскільки git difftool дізнався варіант --dir-diff у git 1.7.11."
oluc

318

Коротке та солодке:

git config --global diff.tool meld

Це налаштовує Git використовувати meldяк інструмент diff. (Вам не потрібно вказувати аргументи командного рядка; підтримка meldвбудована в Git.)

Тоді, якщо ви хочете, щоб графічний розмін замість текстового, ви просто викликати git difftoolзамістьgit diff (вони обидва беруть однакові аргументи). У вашому випадку:

git difftool master..devel

Оновлення: Якщо ви не хочете, щоб одноразовий розріз файлу одночасно, а натомість ви хочете використати перегляд "підкаталога" meld зі всіма змінами між двома гілками, зверніть увагу на -dабо --dir-diffпараметр для git difftool. Наприклад, коли я перебуваю на гілці XYZ і хочу побачити, що відрізняється між цим та гілкою ABC, я запускаю це:

git difftool -d ABC

3
це не те, що я шукаю. Він показує мені файл відмінностей за файлом. Я архівував це за допомогою сценарію diff.py та 'git diff master..devel' раніше. Я хочу побачити всі відмінності та дерево каталогів як 'meld folderA / folderB /'.
Мартен Бауер

Мартен, так працює Git. Він лише відслідковує файл, тому ви можете бачити лише різницю за файлом. У git ви не можете вчинити порожній dir самостійно. Якась конкретна причина, по якій ви хочете відобразити різницю між dir?
Донні Курня

@DonnyKurnia: мені знадобилося трохи зрозуміти, що ОП намагається зробити: Meld має окремий інтерфейс для перегляду всіх змін у каталозі. Ви можете відфільтрувати перегляд файлів на основі того, чи вони однакові, змінені, нові. ОП хоче використовувати цей інтерфейс, щоб показати зміни. (Це дозволяє вам переглянути список усіх змін і вибрати ті, які ви хочете відрізняти.) Отже, це не порівняння між каталогами, а порівняння комітетів, але переглянуте в цілому.
idbrii

17
@MartenBauer Я думаю, що ви цього хочете: git difftool - dir-diff master devel
Stéphane

3
Чи можна це зробити так, щоб поточна гілка не знаходилася в папці tmp і тому дозволяла редагувати?
zkent

100

Починаючи з git v1.7.11, ви можете використовувати git difftool --dir-diffдля виконання каталогу diff. Що добре працює із сценаріями meld wihout https://github.com/wmanley/git-meld .

Налаштування git

git config --global diff.tool meld

Використай це

git difftool -d topic             // -d is --dir-diff
git difftool -d master..topic

Для macOS

brew cask install meld
git config --global difftool.meld.cmd 'open -W -a Meld --args \"$LOCAL\" \"$PWD/$REMOTE\"'
git config --global difftool.meld.trustExitCode true

2
Я думаю, що це дійсно те, чого хотів ОП. Зверніть увагу на опцію -g для використання інструменту-орієнтовника, а -d - на -dir-diff. Це добре для огляду коду. Nit: опція difftool.prompt не потрібна, коли вказується -d, принаймні для Git 1.8.
Майкл Персі

1
Це дивно. Саме те, що мені було потрібно. Дякую!
Микола

5
Чи можна це зробити так, щоб поточна гілка не знаходилася в папці tmp і тому дозволяла редагувати?
zkent

2
Я також вдячний відповіді на питання @zkent ... :(
tavlima

3
@zkent @tavlima: Ця команда вже дозволяє редагувати поточну версію. Навіть якщо ви побачите флодер tmp у meld, якщо ви збережете - Ctrl+s- праву частину, ваш файл буде змінено.
Бенджамін

13

Важливо сказати, що за допомогою git difftool -dви все ще можете редагувати свої робочі файли в Meld та зберігати їх . Для того, щоб досягти цього, вам потрібно порівняти певну гілку з вашим поточним робочим деревом, наприклад:

git difftool -d branchname

Meld буде показувати, що і лівий, і правий каталоги розташовані в / tmp. Однак файли у правому каталозі насправді є символічними посиланнями на ваші файли у поточній робочій директорії (не стосується Windows). Таким чином, ви можете редагувати їх прямо в Meld, і коли ви збережете їх, ваші зміни будуть збережені у вашому робочому режимі.

Ще цікавіший варіант - порівняння поточного робочого режиму зі сховищем. Це можна зробити, просто ввівши:

git difftool -d stash

Тоді ви можете перенести деякі зміни зі сховища (ліве вікно) у вашу поточну робочу копію (праве вікно), не використовуючи git stash pop/applyта уникаючи набридливого вирішення конфлікту, який може бути викликаний цими командами.

Я думаю, що це може значно збільшити робочий процес за допомогою залишків. Ви можете поступово переносити зміни зі сховища в робочу копію та вносити їх по черзі, вводячи інші зміни, якщо хочете.


Piotr, це саме те, що я намагався зробити, але в моєму випадку (на CentOS) ніяких символьних посилань не створюється. Чи потрібні налаштування конфігурації або мінімальна версія meld, яка підтримує це?
wrjohns

Я думаю, що Git відповідає за створення символьних посилань, а не Meld. Перевірте інструкцію Git щодо команди difftool. Можливо, вам слід оновити його до нової версії?
Пьотр Юркевич

2
копіювати нові файли з відділення в робочий dir не працює :(
pykiss

5

Хоча з інших відповідей виглядає так, ніби немає способу зробити це безпосередньо у сховищі git, але легко (завдяки відповіді на інше питання :)) написати сценарій, який витягне дерева з двох комітів тимчасові каталоги та запустіть meld на них, видаляючи обидва каталоги, коли meld виходить:

http://gist.github.com/498628

Звичайно, ви втратите будь-які зміни, внесені через meld, але це дуже приємно для швидкого огляду відмінностей, я думаю.


3

Я думаю, що простий спосіб зробити це git reset --soft:

Мета: порівняти різниці між галуззю_a та гілкою_b з meld

git checkout branch_a
git checkout -b do_diff
git reset --soft branch_b
meld .

0

У git V1.7.9 ви можете порівняти два коміти без командного рядка:

Ви повинні налаштувати в параметрах редагування 'git gui', global: "Використовувати інструмент об'єднання: meld".

Запустіть gitk , виберіть команду, клацніть правою кнопкою миші ще одну команду> " diff this -> selected ". У розділі "латка" клацніть правою кнопкою миші файл> " зовнішній розл. "

meld почнеться і відображатиметься все ще вибране, спочатку здійснюючи праворуч.


0

Для Meld на macOS додайте це до свого, ~/.gitconfigяк рекомендує технічний сервіс програми macOS, yousseb :

[diff]
  tool = meld
[difftool]
  prompt = false
[difftool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args \"$LOCAL\" \"$REMOTE\"
[merge]
  tool = meld
[mergetool]
  prompt = false
[mergetool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args --auto-merge \"$LOCAL\" \"$BASE\" \"$REMOTE\" --output=\"$MERGED\"

Ви можете опустити merge налаштування, якщо хочете.

@ Відповідь GutenYe для мене не вийшла через автоматичне втечу та / або щось із цим zsh.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.