"Git diff" yazdığımda, "diff -y" gibi yan yana bir fark görmek veya "kdiff3" gibi etkileşimli bir fark aracında fark göstermek istiyorum. Bu nasıl yapılabilir?
"Git diff" yazdığımda, "diff -y" gibi yan yana bir fark görmek veya "kdiff3" gibi etkileşimli bir fark aracında fark göstermek istiyorum. Bu nasıl yapılabilir?
Yanıtlar:
Git'te diff'in dahili bir uygulaması olsa da, bunun yerine harici bir araç ayarlayabilirsiniz.
Harici bir fark aracı belirtmenin iki farklı yolu vardır:
GIT_EXTERNAL_DIFF
ve GIT_DIFF_OPTS
çevre değişkenleri.git config
Ayrıca bakınız:
git diff --help
Bir işlemi yaparken git diff
Git, hem yukarıdaki ortam değişkenlerinin ayarlarını hem de .gitconfig
dosyasını kontrol eder.
Git varsayılan olarak diff programına aşağıdaki yedi bağımsız değişkeni iletir:
path old-file old-hex old-mode new-file new-hex new-mode
Genellikle yalnızca eski dosya ve yeni dosya parametrelerine ihtiyacınız vardır. Tabii ki çoğu diff aracı argüman olarak sadece iki dosya adını alır. Bu, Git'in komut dosyasına sağladığı bağımsız değişkenleri alan ve bunları seçtiğiniz harici git programına veren küçük bir sarmalayıcı komut dosyası yazmanız gerektiği anlamına gelir.
Diyelim ki sarmalayıcı komut dosyanızı altına koydunuz ~/scripts/my_diff.sh
:
#!/bin/bash
# un-comment one diff tool you'd like to use
# side-by-side diff with custom options:
# /usr/bin/sdiff -w200 -l "$2" "$5"
# using kdiff3 as the side-by-side diff:
# /usr/bin/kdiff3 "$2" "$5"
# using Meld
/usr/bin/meld "$2" "$5"
# using VIM
# /usr/bin/vim -d "$2" "$5"
daha sonra bu komut dosyasını yürütülebilir hale getirmeniz gerekir:
chmod a+x ~/scripts/my_diff.sh
daha sonra Git'e özel fark sarmalayıcı komut dosyanızı nasıl ve nerede bulacağınızı söylemeniz gerekir. Bunu nasıl yapacağınız üç seçeneğiniz var: (.gitconfig dosyasını düzenlemeyi tercih ediyorum)
Kullanma GIT_EXTERNAL_DIFF
,GIT_DIFF_OPTS
örneğin .bashrc veya .bash_profile dosyanızda aşağıdakileri ayarlayabilirsiniz:
GIT_EXTERNAL_DIFF=$HOME/scripts/my_diff.sh
export GIT_EXTERNAL_DIFF
kullanma git config
sarmalayıcı komut dosyanızın nerede bulunacağını tanımlamak için "git config" kullanın:
git config --global diff.external ~/scripts/my_diff.sh
~/.gitconfig
Dosyanızı düzenleme
~/.gitconfig
şu satırları eklemek için dosyanızı düzenleyebilirsiniz :
[diff]
external = ~/scripts/my_diff.sh
Not:
Özel fark aracınızı yüklemeye benzer şekilde, birleştirmeyi görselleştirmeye yardımcı olmak için görsel birleştirme aracı olabilecek özel bir birleştirme aracı da yükleyebilirsiniz. (progit.org sayfasına bakınız)
Bkz. Http://fredpalma.com/518/visual-diff-and-merge-tool/ ve https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
meld
?
meld
sürümü ne için diff görmek istediğiniz dosya (lar) seçebileceğiniz bir dizin diff yapmak üzere yapılandırılabilir? Şu anda meld
her dosya için ayrı bir komut çalıştırıyor meld
ve bir sonraki dosyayı görmek için çıkmak zorundayım . Mercurial kullanıldığında meld
davrandığı gibi değiştirilmiş dosyaların bir dizin listesini göstermeyi tercih ederim meld
.
Yerine git difftool
kullanın git diff
. Asla geri dönmeyeceksin.
Aşağıda konuşulan başka bir stackoverflow bağlantısı git difftool
: Tercih edilen diff aracım / görüntüleyicimle 'git diff' çıktısını nasıl görüntüleyebilirim?
Komutunun daha yeni sürümleri için git
, difftool
komut kullanıma hazır birçok harici fark aracını destekler. Örneğin vimdiff
, otomatik olarak desteklenir ve komut satırından şu şekilde açılabilir:
cd /path/to/git/repo
git difftool --tool=vimdiff
git difftool --tool-help
Burada listelenen diğer desteklenen harici fark araçları örnek bir çıktıdır:
'git difftool --tool=<tool>' may be set to one of the following:
araxis
kompare
vimdiff
vimdiff2
The following tools are valid, but not currently available:
bc3
codecompare
deltawalker
diffuse
ecmerge
emerge
gvimdiff
gvimdiff2
kdiff3
meld
opendiff
tkdiff
xxdiff
This message is displayed because 'diff.tool' is not configured.
. Belki de cevabı en az nasıl yapılandıracağınızla güncelleyin, böylece terminalde yan yana farklılıklar gösterebilir, OP'nin istediği şey nedir? GUI araçları, ssh kullanarak bağlandığınız uzak sunucuda oldukça işe yaramaz.
git difftool
ile vimdiff
her zaman doğru iki dosya / tamponlar hizaya gelmez.
git difftool -y
tkdiff istemini önlemek için kullanın
git difftool
Windows ve Linux'ta kaynaştırın : stackoverflow.com/a/48979939/4561887
Ayrıca deneyebilirsiniz git diff --word-diff
. Tam olarak yan yana değil, bir şekilde daha iyi, bu yüzden gerçek yan yana ihtiyaçlarınıza tercih edebilirsiniz.
git diff --word-diff=color
--word-diff=color
bana geçersiz bir seçenek hatası veriyor. Hangi sürümde tanıtıldı?
git diff --color-words
çalışır.
git diff --color-words
modern git versiyonlarına geçmenin yolu.
ydiff
Eski adıyla cdiff
, bu araç yan yana , artımlı ve renkli fark görüntüleyebilir.
git diff
Yapmak yerine şunları yapın:
ydiff -s -w0
Bu, ydiff
farklı dosyaların her biri için yan yana görüntüleme modunda başlatılır .
Yükleme yeri:
python3 -m pip install --user ydiff
-veya-
brew install ydiff
İçin git log
şunları kullanabilirsiniz:
ydiff -ls -w0
-w0
terminal genişliğinizi otomatik olarak algılar. Ayrıntılar ve demo için ydiff
GitHub veri havuzu sayfasına bakın .
Git 2.18.0, ydiff 1.1'de test edilmiştir.
git diff | cdiff -s
ile eşdeğerini nasıl yapacağınızı açıklayabilir misiniz?
ydiff -s
bir git / svn / hg çalışma alanından çalıştırın,
cd <git repo>
ve sonra çalıştırmak istiyorsanızydiff -ls <path/to/file>
Aşağıdaki işlemleri diff
kullanarak yan yana yapabilirsiniz sdiff
:
$ git difftool -y -x sdiff HEAD^ | less
Burada HEAD^
, neye karşı koymak istediğinizle değiştirmeniz gereken bir örnek var.
Bu çözümü burada birkaç öneride daha buldum . Ancak, bu OP'nin sorusunu kısa ve öz bir şekilde cevaplıyor.
Argümanların açıklaması için man git-difftool'a bakınız .
Gemide yorumları alarak, git sdiff
aşağıdaki yürütülebilir komut dosyasını yazarak kullanışlı bir komut oluşturabilirsiniz :
#!/bin/sh
git difftool -y -x "sdiff -w $(tput cols)" "${@}" | less
Farklı /usr/bin/git-sdiff
ve kaydedin chmod -x
. Sonra bunu yapabilirsiniz:
$ git sdiff HEAD^
tput cols
bunun yerine örneğin: git difftool -x "sdiff -s -w $(tput cols)"
.
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'
o zaman basitçe:
git diff
GitHub'ı içermeden bir tarayıcıda yan yana farkları görmek istiyorsanız , aşağıdakiler için bir yedek yerine git webdiff'in keyfini çıkarabilirsiniz git diff
:
$ pip install webdiff
$ git webdiff
Bu, tkdiff
sözdizimi vurgulaması yapabilmeniz ve görüntü farklarını gösterebilmesi gibi geleneksel GUI difftoollerine göre bir dizi avantaj sunar .
Bununla ilgili daha fazla bilgiyi buradan edinebilirsiniz .
Kullandığım colordiff .
Mac OS X'te ile yükleyin
$ sudo port install colordiff
Linux'ta apt get install colordiff
dağıtımınıza bağlı olarak muhtemelen böyle bir şey.
Sonra:
$ git difftool --extcmd="colordiff -ydw" HEAD^ HEAD
Veya bir takma ad oluşturun
$ git alias diffy "difftool --extcmd=\"colordiff -ydw\""
Sonra kullanabilirsiniz
$ git diffy HEAD^ HEAD
Ben "diffy" olarak adlandırdım çünkü unix'te diff -y
yan yana fark var. Colordiff ayrıca daha güzel renkler ekler. Seçenekte -ydw
, y
yan-yana içindir, w
boşlukları göz ardı etmek ve d
minimum diff üretmektir (genellikle fark olarak daha iyi bir sonuç almak)
-y
atlamak için ekleyin Launch 'colordiff' [Y/n]:
.
git alias diffy "difftool --extcmd=\"colordiff -ydw\""
? Olmamalı mı git config --global alias.diffy "difftool --extcmd=\"colordiff -ydw\""
?
Unix için, sadece git
ve yerleşik olanı birleştirin diff
:
git show HEAD:path/to/file | diff -y - path/to/file
Tabii ki, HEAD'i başka bir git referansıyla değiştirebilirsiniz ve muhtemelen -W 170
diff komutuna benzer bir şey eklemek istersiniz .
Bu, dizin içeriğinizi geçmiş bir işlemle karşılaştırdığınızı varsayar. İki taahhüt arasında karşılaştırma yapmak daha karmaşıktır. Kabuğunuz ise bash
"işlem ikamesi" ni kullanabilirsiniz:
diff -y -W 170 <(git show REF1:path/to/file) <(git show REF2:path/to/file)
Burada REF1
ve REF2
git referanslarıdır - etiketler, dallar veya karmalar.
Şahsen icdiff'i çok seviyorum !
Üzerinde iseniz Mac OS X
ile HomeBrew
, sadece yap brew install icdiff
.
Dosya etiketlerini ve diğer harika özellikleri doğru bir şekilde almak için ~/.gitconfig
:
[pager]
difftool = true
[diff]
tool = icdiff
[difftool "icdiff"]
cmd = icdiff --head=5000 --highlight --line-numbers -L \"$BASE\" -L \"$REMOTE\" \"$LOCAL\" \"$REMOTE\"
Ve şu şekilde kullanıyorum: git difftool
Bu soru, farkları bulmak için git yerleşik yolunu kullanmanın hızlı bir yolunu ararken ortaya çıktı. Çözüm kriterlerim:
Git içinde renk almak için bu cevabı buldum .
Çizgi farkı yerine yan yana fark almak için mb14'ün bu soruya mükemmel cevabını aşağıdaki parametrelerle değiştirdim:
$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]"
Ekstra [- veya {+ 'yı beğenmediyseniz seçenek --word-diff=color
kullanılabilir.
$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]" --word-diff=color
Bu, hem json hem de xml metin ve java kodu ile uygun karşılaştırmanın elde edilmesine yardımcı oldu.
Özetle, --word-diff-regex
küçük satır değişikliklerine sahip büyük dosyalara göz atarken, standart satır farkına kıyasla renklendirilmiş yan yana kaynak kodu deneyimi elde etmek için seçenekler renk ayarlarıyla birlikte yararlı bir görünüme sahiptir.
Bazıları git git yan yana difüzyon için cdiff'den bahsetti, ancak hiç kimse tam bir uygulama vermedi.
Kurulum cdiff:
git clone https://github.com/ymattw/cdiff.git
cd cdiff
ln -s `pwd`/cdiff ~/bin/cdiff
hash -r # refresh your PATH executable in bash (or 'rehash' if you use tcsh)
# or just create a new terminal
Bu satırları ekleyerek ~ / .gitconfig dosyasını düzenleyin:
[pager]
diff = false
show = false
[diff]
tool = cdiff
external = "cdiff -s $2 $5 #"
[difftool "cdiff"]
cmd = cdiff -s \"$LOCAL\" \"$REMOTE\"
[alias]
showw = show --ext-dif
CDiff'in Diff ile çalışması için çağrı cihazı kapalıdır, aslında zaten bir çağrı cihazıdır, bu yüzden bu iyidir. Difftool bu ayarlardan bağımsız olarak çalışacaktır.
Gösteri takma adı gereklidir, çünkü git show yalnızca bağımsız diff araçlarını bağımsız değişken aracılığıyla destekler.
Diff harici komutunun sonundaki '#' önemlidir. Git'in diff komutu diff komutuna $ @ (tüm kullanılabilir fark değişkenleri) ekler, ancak yalnızca iki dosya adını istiyoruz. Bu yüzden bu ikisini açıkça $ 2 ve $ 5 ile çağırıyoruz ve sonra $ @ 'ı aksi takdirde sdiff'i karıştıracak bir yorumun arkasına saklıyoruz. Şuna benzer bir hatayla sonuçlanıyor:
fatal: <FILENAME>: no such path in the working tree
Use 'git <command> -- <path>...' to specify paths that do not exist locally.
Şimdi yan yana farklılıklar üreten Git komutları:
git diff <SHA1> <SHA2>
git difftool <SHA1> <SHA2>
git showw <SHA>
Cdiff kullanımı:
'SPACEBAR' - Advances the page of the current file.
'Q' - Quits current file, thus advancing you to the next file.
Artık git diff ve difftool ile yan yana farkınız var. Ve ihtiyacınız varsa, güçlü kullanıcı özelleştirmesi için cdiff python kaynak koduna sahipsiniz.
İşte bir yaklaşım. Daha az boru kullanırsanız, xterm genişliği 80'e ayarlanır ve bu çok sıcak değildir. Ancak, komutu COLS = 210 ile devam ettirirseniz, genişletilmiş xterm'inizi kullanabilirsiniz.
gitdiff()
{
local width=${COLS:-$(tput cols)}
GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@"
}
Intellij IDEA'yı açın , "Sürüm Denetimi" araç penceresinde bir veya birden fazla işlem seçin, değiştirilen dosyalara göz atın ve her dosya için değişiklikleri yan yana incelemek üzere çift tıklayın.
Birlikte verilen komut satırı başlatıcısı ile IDEA'yı istediğiniz yerde idea some/path
Bu konuda çok iyi cevaplar var. Bu konudaki çözümüm bir senaryo yazmaktı.
Bu 'git-scriptname' olarak adlandırın (ve çalıştırılabilir yapın ve PATH'nize, herhangi bir komut dosyası gibi koyun) ve çalıştırarak normal bir git komutu gibi çağırabilirsiniz.
$ git scriptname
Gerçek işlevsellik sadece son satır. İşte kaynak:
#!/usr/bin/env zsh
#
# Show a side-by-side diff of a particular file how it currently exists between:
# * the file system
# * in HEAD (latest committed changes)
function usage() {
cat <<-HERE
USAGE
$(basename $1) <file>
Show a side-by-side diff of a particular file between the current versions:
* on the file system (latest edited changes)
* in HEAD (latest committed changes)
HERE
}
if [[ $# = 0 ]]; then
usage $0
exit
fi
file=$1
diff -y =(git show HEAD:$file) $file | pygmentize -g | less -R
Bu biraz sınırlı bir çözüm olabilir, ancak diff
harici komutlar olmadan sistemin komutunu kullanan iş :
diff -y <(git show from-rev:the/file/path) <(git show to-rev:the/file/path)
--suppress-common-lines
( diff
seçenekleriniz destekliyorsa).diff
işaretleyiciler--width=term-width
; Bash içinde genişliği $COLUMNS
veya olarak alabilirsiniz tput cols
.Bu, daha fazla kolaylık sağlamak için yardımcı bir git komut dosyasına da sarılabilir, örneğin, aşağıdaki gibi kullanım:
git diffy the/file/path --from rev1 --to rev2