Ketika saya mengetik "git diff", saya ingin melihat diff berdampingan, seperti dengan "diff -y", atau ingin menampilkan diff dalam alat diff interaktif seperti "kdiff3". Bagaimana ini bisa dilakukan?
Ketika saya mengetik "git diff", saya ingin melihat diff berdampingan, seperti dengan "diff -y", atau ingin menampilkan diff dalam alat diff interaktif seperti "kdiff3". Bagaimana ini bisa dilakukan?
Jawaban:
Meskipun Git memiliki implementasi internal diff, Anda dapat mengatur alat eksternal sebagai gantinya.
Ada dua cara berbeda untuk menentukan alat diff eksternal:
GIT_EXTERNAL_DIFF
dan GIT_DIFF_OPTS
variabel lingkungan.git config
Lihat juga:
git diff --help
Ketika melakukan a git diff
, Git memeriksa pengaturan variabel lingkungan di atas dan .gitconfig
file -nya .
Secara default, Git meneruskan tujuh argumen berikut ke program diff:
path old-file old-hex old-mode new-file new-hex new-mode
Anda biasanya hanya memerlukan parameter file lama dan file baru. Tentu saja sebagian besar alat diff hanya mengambil dua nama file sebagai argumen. Ini berarti bahwa Anda perlu menulis skrip wrapper kecil, yang mengambil argumen yang disediakan oleh Git ke skrip, dan menyerahkannya ke program git eksternal pilihan Anda.
Katakanlah Anda meletakkan skrip pembungkus Anda di bawah ~/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"
Anda kemudian perlu membuat skrip itu dapat dieksekusi:
chmod a+x ~/scripts/my_diff.sh
Anda kemudian perlu memberi tahu Git bagaimana dan di mana menemukan skrip pembungkus khusus Anda. Anda memiliki tiga pilihan cara melakukannya: (Saya lebih suka mengedit file .gitconfig)
Menggunakan GIT_EXTERNAL_DIFF
,GIT_DIFF_OPTS
misalnya dalam file .bashrc atau .bash_profile Anda, Anda dapat mengatur:
GIT_EXTERNAL_DIFF=$HOME/scripts/my_diff.sh
export GIT_EXTERNAL_DIFF
Menggunakan git config
gunakan "git config" untuk menentukan di mana skrip wrapper Anda dapat ditemukan:
git config --global diff.external ~/scripts/my_diff.sh
Mengedit ~/.gitconfig
file Anda
Anda dapat mengedit ~/.gitconfig
file Anda untuk menambahkan baris-baris ini:
[diff]
external = ~/scripts/my_diff.sh
catatan:
Demikian pula untuk menginstal alat diff khusus Anda, Anda juga dapat menginstal alat gabungan kustom, yang bisa menjadi alat penggabungan visual untuk lebih membantu memvisualisasikan gabungan. (lihat halaman progit.org)
Lihat: http://fredpalma.com/518/visual-diff-and-merge-tool/ dan https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
meld
,?
meld
versi ini dikonfigurasikan untuk melakukan direktori diff, di mana saya dapat memilih file mana yang ingin saya lihat? Saat ini menjalankan meld
perintah terpisah untuk setiap file, dan saya harus berhenti meld
untuk melihat file berikutnya. Saya lebih suka meld
menunjukkan daftar direktori file yang diubah seperti itu berperilaku ketika meld
digunakan dari Mercurial.
Gunakan git difftool
sebagai ganti git diff
. Anda tidak akan pernah kembali.
Berikut ini tautan ke aliran stackover lain yang membahas git difftool
: Bagaimana cara melihat output 'git diff' dengan alat / penampil diff pilihan saya?
Untuk versi yang lebih baru git
, difftool
perintah ini mendukung banyak perangkat eksternal yang berbeda. Misalnya vimdiff
didukung otomatis dan dapat dibuka dari baris perintah dengan:
cd /path/to/git/repo
git difftool --tool=vimdiff
Alat diff eksternal lain yang didukung tercantum di git difftool --tool-help
sini adalah contoh keluaran:
'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.
. Mungkin memperbarui jawaban dengan minimal cara mengkonfigurasi hal ini, sehingga ia menampilkan berdampingan di terminal yang berbeda, apa yang diminta OP? Alat GUI sangat tidak berguna di server jauh di mana Anda terhubung menggunakan ssh.
git difftool
dengan vimdiff
tidak selalu mengatur dua file / buffer dengan benar.
git difftool -y
untuk mencegah tkdiff prompt
git difftool
di Windows & Linux: stackoverflow.com/a/48979939/4561887
Anda juga bisa mencoba git diff --word-diff
. Ini tidak persis berdampingan, tapi entah bagaimana lebih baik, jadi Anda mungkin lebih suka itu daripada kebutuhan berdampingan Anda yang sebenarnya.
git diff --word-diff=color
--word-diff=color
memberiku kesalahan opsi yang tidak valid. Versi apa itu diperkenalkan?
git diff --color-words
tidak bekerja.
git diff --color-words
adalah cara untuk menggunakan versi git modern.
ydiff
Dahulu disebut cdiff
, alat ini dapat menampilkan berdampingan , tambahan , dan warna - warni .
Alih-alih melakukan git diff
, lakukan:
ydiff -s -w0
Ini akan diluncurkan ydiff
dalam mode tampilan berdampingan untuk masing-masing file dengan perbedaan.
Instal dengan:
python3 -m pip install --user ydiff
-atau-
brew install ydiff
Untuk git log
, Anda dapat menggunakan:
ydiff -ls -w0
-w0
otomatis mendeteksi lebar terminal Anda. Lihat ydiff
halaman repositori GitHub untuk detail dan demo.
Diuji dalam Git 2.18.0, ydiff 1.1.
git diff | cdiff -s
dengan icdiff?
ydiff -s
dari ruang kerja git / svn / hg, Anda tidak perlu menyalurkannya.
cd <git repo>
dan kemudian jalankanydiff -ls <path/to/file>
Anda dapat melakukan berdampingan diff
menggunakan sdiff
sebagai berikut:
$ git difftool -y -x sdiff HEAD^ | less
di mana HEAD^
adalah contoh yang harus Anda ganti dengan apa pun yang ingin Anda lawan.
Saya menemukan solusi ini di sini di mana ada beberapa saran lain juga. Namun, jawaban ini adalah pertanyaan OP secara ringkas dan jelas.
Lihat man git-difftool untuk penjelasan argumennya.
Mengambil komentar di papan tulis, Anda dapat membuat git sdiff
perintah praktis dengan menulis skrip yang dapat dieksekusi berikut:
#!/bin/sh
git difftool -y -x "sdiff -w $(tput cols)" "${@}" | less
Simpan sebagai /usr/bin/git-sdiff
dan chmod -x
itu. Maka Anda akan dapat melakukan ini:
$ git sdiff HEAD^
tput cols
sebaliknya, misalnya: git difftool -x "sdiff -s -w $(tput cols)"
.
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'
maka cukup:
git diff
Jika Anda ingin melihat perbedaan berdampingan di peramban tanpa melibatkan GitHub, Anda mungkin menikmati git webdiff , pengganti drop-in untuk git diff
:
$ pip install webdiff
$ git webdiff
Ini menawarkan sejumlah keunggulan dibandingkan difftools GUI tradisional seperti tkdiff
dalam hal ini dapat memberi Anda sorotan sintaks dan menampilkan diff gambar.
Baca lebih lanjut di sini .
Saya menggunakan colordiff .
Di Mac OS X, instal dengan
$ sudo port install colordiff
Di Linux mungkin apt get install colordiff
atau sesuatu seperti itu, tergantung pada distro Anda.
Kemudian:
$ git difftool --extcmd="colordiff -ydw" HEAD^ HEAD
Atau buat alias
$ git alias diffy "difftool --extcmd=\"colordiff -ydw\""
Maka Anda bisa menggunakannya
$ git diffy HEAD^ HEAD
Saya menyebutnya "diffy" karena diff -y
merupakan diff berdampingan dalam unix. Colordiff juga menambahkan warna, yang lebih bagus. Pada opsi -ydw
, y
is for the side-by-side, w
is untuk mengabaikan spasi putih, dan d
is untuk menghasilkan diff minimal (biasanya Anda mendapatkan hasil yang lebih baik sebagai diff)
-y
untuk melewati Launch 'colordiff' [Y/n]:
prompt.
git alias diffy "difftool --extcmd=\"colordiff -ydw\""
? Bukankah seharusnya begitu git config --global alias.diffy "difftool --extcmd=\"colordiff -ydw\""
?
Untuk unix, mengkombinasikan adil git
dan built-in diff
:
git show HEAD:path/to/file | diff -y - path/to/file
Tentu saja, Anda dapat mengganti HEAD dengan referensi git lainnya, dan Anda mungkin ingin menambahkan sesuatu seperti -W 170
perintah diff.
Ini mengasumsikan bahwa Anda hanya membandingkan konten direktori Anda dengan komit yang lalu. Membandingkan antara dua komitmen lebih kompleks. Jika shell bash
Anda, Anda dapat menggunakan "proses substitusi":
diff -y -W 170 <(git show REF1:path/to/file) <(git show REF2:path/to/file)
di mana REF1
dan REF2
git referensi - tag, cabang atau hash.
Saya pribadi sangat suka icdiff !
Jika Anda berada di Mac OS X
dengan HomeBrew
, hanya melakukan brew install icdiff
.
Untuk mendapatkan label file dengan benar, plus fitur keren lainnya, saya miliki di ~/.gitconfig
:
[pager]
difftool = true
[diff]
tool = icdiff
[difftool "icdiff"]
cmd = icdiff --head=5000 --highlight --line-numbers -L \"$BASE\" -L \"$REMOTE\" \"$LOCAL\" \"$REMOTE\"
Dan saya menggunakannya seperti: git difftool
Pertanyaan ini muncul ketika saya sedang mencari cara cepat untuk menggunakan git builtin cara untuk menemukan perbedaan. Kriteria solusi saya:
Saya menemukan jawaban ini untuk mendapatkan warna dalam git.
Untuk mendapatkan berdampingan diff bukan garis diff saya tweak mb14 's sangat baik jawaban atas pertanyaan ini dengan parameter berikut:
$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]"
Jika Anda tidak menyukai ekstra [- atau {+ opsi --word-diff=color
dapat digunakan.
$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]" --word-diff=color
Itu membantu untuk mendapatkan perbandingan yang tepat dengan teks json dan xml dan kode java.
Singkatnya, --word-diff-regex
opsi memiliki visibilitas bermanfaat bersama dengan pengaturan warna untuk mendapatkan pengalaman kode sumber berdampingan berwarna dibandingkan dengan diff garis standar, ketika menelusuri file besar dengan perubahan garis kecil.
Beberapa yang lain telah menyebutkan cdiff untuk git berdampingan secara berdampingan tetapi tidak ada yang memberikan implementasi penuh darinya.
Setup 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
Edit ~ / .gitconfig menyisipkan baris ini:
[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
Pager off diperlukan agar cdiff dapat bekerja dengan Diff, ini pada dasarnya pager, jadi ini tidak masalah. Difftool akan berfungsi terlepas dari pengaturan ini.
Alias acara diperlukan karena git show hanya mendukung alat diff eksternal melalui argumen.
Tanda '#' pada akhir perintah eksternal diff adalah penting. Perintah diff Git menambahkan $ @ (semua variabel diff yang tersedia) ke perintah diff, tetapi kami hanya menginginkan dua nama file. Jadi kami memanggil keduanya secara eksplisit dengan $ 2 dan $ 5, dan kemudian menyembunyikan $ @ di belakang komentar yang jika tidak akan membingungkan sdiff. Menghasilkan kesalahan yang terlihat seperti:
fatal: <FILENAME>: no such path in the working tree
Use 'git <command> -- <path>...' to specify paths that do not exist locally.
Perintah Git yang sekarang menghasilkan pembedaan berdampingan:
git diff <SHA1> <SHA2>
git difftool <SHA1> <SHA2>
git showw <SHA>
Penggunaan Cdiff:
'SPACEBAR' - Advances the page of the current file.
'Q' - Quits current file, thus advancing you to the next file.
Anda sekarang memiliki diff berdampingan melalui git diff dan difftool. Dan Anda memiliki kode sumber python cdiff untuk kustomisasi pengguna listrik jika Anda membutuhkannya.
Inilah pendekatannya. Jika Anda menyalurkan lebih sedikit, lebar xterm diatur ke 80, yang tidak terlalu panas. Tetapi jika Anda melanjutkan perintah dengan, misalnya COLS = 210, Anda dapat memanfaatkan xterm Anda yang diperluas.
gitdiff()
{
local width=${COLS:-$(tput cols)}
GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@"
}
Buka Intellij IDEA , pilih satu atau beberapa komit di jendela alat "Kontrol Versi", telusuri file yang diubah, dan klik dua kali untuk memeriksa perubahan berdampingan untuk setiap file.
Dengan peluncur baris perintah yang dibundel, Anda dapat membawa IDEA ke mana saja dengan sederhana idea some/path
Ada banyak jawaban bagus di utas ini. Solusi saya untuk masalah ini adalah menulis naskah.
Beri nama 'git-scriptname' ini (dan jadikan itu dapat dieksekusi dan letakkan di PATH Anda, seperti skrip apa pun), dan Anda dapat menjalankannya seperti perintah git normal dengan menjalankan
$ git scriptname
Fungsionalitas aktual hanyalah baris terakhir. Inilah sumbernya:
#!/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
Ini mungkin solusi yang agak terbatas, tetapi apakah pekerjaan menggunakan perintah sistem diff
tanpa alat eksternal:
diff -y <(git show from-rev:the/file/path) <(git show to-rev:the/file/path)
--suppress-common-lines
(jika Anda diff
mendukung opsi).diff
spidol biasa--width=term-width
; di Bash bisa mendapatkan lebar sebagai $COLUMNS
atau tput cols
.Ini juga dapat dibungkus dengan skrip pembantu helit untuk kenyamanan lebih, misalnya, penggunaan seperti ini:
git diffy the/file/path --from rev1 --to rev2