Meld ile şube farkları görüntülemek?


159

HEAD ile şu anki durum arasındaki farkı görebileceğimi biliyorum meld .. Ancak, örneğin dallar masterve develmeld ile dallar arasındaki farkları nasıl görebilirim ?

Şu anda aşağıdaki adımları gerçekleştiriyorum:

  1. Kopyasını çalışma klasörünü yeniden
    Örneğin mv /projectA /projectA_master)
  2. Projeyi tekrar klonlayın
    git clone url
  3. Geçin develdalı
    cd projectA && git -b devel origin/devel
  4. Meld ile farklılıkları görüntüleme
    meld /projectA_Master projectA

Aynı sonucu meld'de almanın daha kolay bir yolu yok mu? Öncelikle birleştirme için değil, yalnızca değişiklikleri gözden geçirmem gerekiyor.


Yanıtlar:


55

Ayrıca bu sorunu can sıkıcı buldum, bu yüzden çalışma ağacına veya evreleme alanına karşı keyfi taahhütleri ayırmanın daha rahat bir yolunu sağlayan git meld yaptım. Https://github.com/wmanley/git-meld adresinde bulabilirsiniz . Mark'ın senaryosuna benziyor, ancak keyfi bir taahhüdü veya sahneleme alanını veya çalışma dizinini diğerleriyle karşılaştırmak için çalışıyor. Karşılaştırma yaptığınız şeylerden biri çalışan ağaçsa, bu okuma-yazmadır, böylece değişikliklerinizi kaybetmezsiniz.


1
Mükemmel bir araç, Will. Teşekkürler! İyice önerilir ... şimdi sadece birleştirme üzerinde de çalıştı.
Yağ seviye çubuğu

Harika bir araç için TYVM - (takma ad eklemek için kendini hatırlatma)
kfmfe04

26
Alıntı Yapmak Will, hit github deposundan: "NOT: git difftool git 1.7.11'de --dir-diff seçeneğini öğrendiğinden git-meld kullanılmıyor."
oluc

318

Kısa ve tatlı:

git config --global diff.tool meld

Bu Git'i melddiff aracı olarak kullanılacak şekilde yapılandırır . (Komut satırı bağımsız değişkenlerini belirtmenize gerek yoktur; desteği meldGit'e yerleştirilmiştir.)

Bunun yerine bir metinsel birinin bir grafik diff istiyorsanız Sonra, sadece çağırmak git difftoolyerine git diff(her ikisi de aynı argümanları almak). Senin durumunda:

git difftool master..devel

Güncelleme: Bir kerede tek dosya farkını istemiyorsanız, bunun yerine meld'in "alt dizini" görünümünü iki dal arasındaki tüm değişikliklerle kullanmak istiyorsanız, -dveya --dir-diffseçeneğini not edin git difftool. Örneğin, XYZ şubesinde olduğumda ve bu ve ABC şubesi arasında neyin farklı olduğunu görmek istediğimde, şunu çalıştırıyorum:

git difftool -d ABC

3
Aradığım şey bu değil. Bana dosyadaki farkları gösterir. Daha önce bir script diff.py ve 'git diff master..devel' ile arşivledim. 'Meld folderA / folderB /' gibi tüm farklılıkları ve dizin ağacını görmek istiyorum.
Marten Bauer

Marten, git'in yolu bu. Sadece dosyayı izler, böylece fark dosyasını sadece dosyaya göre görebilirsiniz. Git'te tek başına boş bir direk işleyemezsiniz. Göstermek istediğiniz herhangi bir özel neden dir?
Donny Kurnia

@DonnyKurnia: OP'nin ne yapmaya çalıştığını bulmam biraz zaman aldı: Meld'in bir dizindeki tüm değişiklikleri görüntülemek için ayrı bir kullanıcı arayüzü var. Görüntüleme dosyalarını aynı, değiştirilmiş, yeni olup olmadıklarına göre filtreleyebilirsiniz. OP bu kullanıcı arayüzünü değişiklikleri göstermek için kullanmak istiyor. (Bu, tüm değişikliklerin bir listesini görmenizi ve farklı olanları seçmenizi sağlar.) Bu, dizinler arasında bir karşılaştırma değil, taahhütler arasında bir karşılaştırma, ancak bir bütün olarak görüntüleniyor.
idbrii

17
@MartenBauer Sanırım istediğin bu: git difftool --dir-diff master devel
Stéphane

3
Bu, geçerli dalın bir tmp klasöründe olmaması ve dolayısıyla düzenlemelere izin vermesi için yapılabilir mi?
zkent

100

Git v1.7.11 ile başlayarak, farklı git difftool --dir-diffbir dizin gerçekleştirmek için kullanabilirsiniz . Hangi https://github.com/wmanley/git-meld betikleri olmadan meld ile oldukça iyi çalışır .

Git'i yapılandır

git config --global diff.tool meld

Kullanın

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

MacOS için

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
Bence OP bu gerçekten istedi. Guidiff aracını kullanmak için -g seçeneğini ve --dir-diff kullanmak için -d seçeneğini not edin. Bu, kod incelemeleri yapmak için iyidir. Nit: -to belirtilirken, en azından Git 1.8 için difftool.prompt seçeneği gerekli değildir.
Michael Percy

1
Bu harika. Tam olarak ihtiyacım olan şey. Teşekkür ederim!
Nicholas

5
Bu, geçerli dalın bir tmp klasöründe olmaması ve dolayısıyla düzenlemelere izin vermesi için yapılabilir mi?
zkent

2
@Zkent sorusuna da cevap vermeyi çok isterim ... :(
tavlima

3
@zkent @tavlima: Bu komut zaten mevcut sürümünüzde düzenlemelere izin veriyor. Bir tmp floder'ı meld'de görseniz bile, - Ctrl+s- sağ kısmı kaydederseniz, dosyanız değiştirilir.
Benjamin

13

O kullanarak söylemek önemlidir git difftool -dsizi hala düzenleyebilir Meld içinde ve çalışma dosyaları Onları kurtaracağız . Bunu başarmak için bazı dalları mevcut çalışma ağacınızla karşılaştırmanız gerekir, örneğin:

git difftool -d branchname

Meld, hem sol hem de sağ dizinlerin / tmp içinde olduğunu gösterecektir. Ancak, sağ dizindeki dosyalar aslında geçerli çalışma dizinindeki dosyalarınıza sembolik bağlantılardır (Windows için geçerli değildir). Böylece bunları doğrudan Meld'de düzenleyebilirsiniz ve bunları kaydettiğinizde değişiklikleriniz çalışma dizininize kaydedilir.

Yine de daha ilginç bir seçenek, mevcut çalışma direklerinin sakla ile karşılaştırılmasıdır. Bunu sadece şunu yazarak yapabilirsiniz:

git difftool -d stash

Ardından git stash pop/apply, bu komutlar tarafından tetiklenebilecek rahatsız edici çakışma çözümlemelerini kullanmadan ve bunlardan kaçınmadan , bazı değişiklikleri stash'tan (sol pencere) geçerli çalışma kopyanıza (sağ pencere) aktarabilirsiniz .

Bence bu iş akışını önemli miktarda artırabilir. Değişiklikleri yavaş yavaş stash'tan çalışma kopyasına aktarabilir ve bunları tek tek uygulayabilirsiniz, isterseniz başka değişiklikler yapabilirsiniz.


Piotr, tam olarak yapmaya çalıştığım şey bu, ama benim durumumda (CentOS'ta) hiçbir sembolik bağlantı oluşturulmuyor. Gerekli herhangi bir yapılandırma kurulumu veya bunu destekleyen bir min sürümü var mı?
wrjohns

Git'in Meld'den değil, sembol bağlantılarının oluşturulmasından sorumlu olduğunu düşünüyorum. Difftool komutu için Git kılavuzuna bakın. Belki daha yeni bir sürüme güncellemelisiniz?
Piotr Jurkiewicz

2
yeni dosyaları şubeden çalışma dizinine kopyalamıyor :(
pykiss

5

Diğer cevaplardan, şu anda doğrudan git deposunda bunu yapmanın bir yolu yokmuş gibi görünse de, iki komisyonun ağaçlarını çıkaracak bir komut dosyası yazmak kolaydır ( başka bir sorunun cevabı :)) geçici dizinlere gidin ve üzerlerinde meld çalıştırın, meld çıkarken her iki dizini de kaldırın:

http://gist.github.com/498628

Tabii ki, meld yoluyla yapılan değişiklikleri kaybedeceksiniz, ancak farklara hızlı bir bakış için oldukça güzel olduğunu düşünüyorum.


3

Bunu yapmak için kolay bir yol olduğunu düşünüyorum git reset --soft:

Hedef: branch_a ve branch_b arasındaki farkları meld ile karşılaştırmak

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

0

Git V1.7.9'da iki komutu komut satırı olmadan karşılaştırabilirsiniz:

'Git gui' düzenleme seçeneklerinde genel olarak yapılandırmalısınız: "Birleştirme aracını kullan: meld".

Başlangıç gitk "> sağ başka işlemek tıklayın bir taahhüt seçmek -> Seçilen bu fark ". 'Yama' altında bir dosyayı sağ tıklayın> " dış fark ".

meld başlar ve hala seçili olarak görüntülenir, ilk önce sağ tarafta kesin.


0

MacOS'taki Meld için, bunu macOS uygulamasının bakımcısı~/.gitconfig tarafından önerildiği gibi ekleyin , 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\"

İsterseniz mergeyapılandırmaları atlayabilirsiniz .

@ GutenYe'nin cevabı , otomatik kaçış ve / veya bununla ilgili bir şey nedeniyle benim için çalışmadı zsh.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.