Lihat perbedaan cabang dengan berbaur?


159

Saya tahu bahwa saya dapat melihat perbedaan antara KEPALA dan kondisi saat ini meld .. Tetapi bagaimana saya bisa melihat perbedaan antara cabang, misalnya masterdan develdengan berbaur?

Saat ini saya melakukan langkah-langkah berikut:

  1. Ganti nama folder dari copy pekerjaan
    misalnya mv /projectA /projectA_master)
  2. Kloning proyek lagi
    git clone url
  3. Beralih ke develcabang
    cd projectA && git -b devel origin/devel
  4. Lihat perbedaan dengan berbaur
    meld /projectA_Master projectA

Apakah tidak ada cara yang lebih mudah untuk mendapatkan hasil yang sama dalam berbaur? Saya hanya perlu meninjau perubahan dan bukan terutama untuk menggabungkan.


Jawaban:


55

Saya juga menemukan masalah ini mengganggu jadi saya telah membuat git berbaur yang memungkinkan cara yang lebih nyaman untuk melakukan komitmen sewenang-wenang terhadap pohon kerja atau area pementasan. Anda dapat menemukannya di https://github.com/wmanley/git-meld . Agak mirip dengan skrip Mark, tetapi berfungsi untuk membandingkan komit sembarang atau area pementasan atau direktori kerja dengan yang lain. Jika salah satu hal yang Anda bandingkan adalah pohon kerja maka itu baca-tulis juga sehingga Anda tidak kehilangan perubahan Anda.


1
Alat luar biasa, Will. Terima kasih! Benar-benar direkomendasikan ... sekarang jika hanya bekerja pada penggabungan juga.
Dipstick

TYVM untuk alat hebat - (pengingat untuk diri sendiri untuk menambahkan!
Ke

26
Mengutip Will, dari repositori hit github: "CATATAN: git-meld sudah usang karena git difftool mempelajari opsi --dir-diff di git 1.7.11."
oluc

318

Pendek & manis:

git config --global diff.tool meld

Ini mengkonfigurasi Git untuk digunakan meldsebagai alat diff. (Anda tidak perlu menentukan argumen baris perintah, dukungan untuk melddibangun ke Git.)

Kemudian, jika Anda menginginkan diff grafis daripada yang tekstual, Anda cukup memanggil git difftoolbukan git diff(keduanya mengambil argumen yang sama). Dalam kasus Anda:

git difftool master..devel

Update: Jika Anda tidak ingin diff satu-file-di-a-waktu, melainkan ingin menggunakan berbaur ini "subdirektori" tampilan dengan semua perubahan antara dua cabang, perhatikan -datau --dir-diffpilihan untuk git difftool. Misalnya, ketika saya berada di cabang XYZ dan saya ingin melihat apa yang berbeda antara ini dan cabang ABC, saya menjalankan ini:

git difftool -d ABC

3
Bukan itu yang saya cari. Ini menunjukkan kepada saya perbedaan file dengan file. Saya mengarsipkannya dengan script diff.py dan 'git diff master..devel' sebelumnya. Saya ingin melihat semua perbedaan dan susunan direktori seperti 'folder berbaur A / folderB /' tidak.
Marten Bauer

Marten, begitulah cara git bekerja. Ini hanya melacak file, jadi Anda hanya dapat melihat perbedaan file per file. Di git, Anda tidak bisa melakukan dir kosong sendirian. Adakah alasan khusus yang ingin Anda tampilkan perbedaan antar dir?
Donny Kurnia

@ DonnyKurnia: Butuh sedikit waktu untuk mencari tahu apa yang OP coba lakukan: Meld memiliki UI terpisah untuk melihat semua perubahan dalam direktori. Anda dapat memfilter melihat file berdasarkan jika mereka sama, diubah, baru. OP ingin menggunakan UI itu untuk menunjukkan perubahan. (Ini memungkinkan Anda melihat daftar semua perubahan dan memilih yang ingin Anda bedakan.) Jadi ini bukan perbandingan antara direktori, tetapi perbandingan antara komit tetapi dipandang sebagai keseluruhan.
idbrii

17
@MartenBauer Saya pikir ini yang Anda inginkan: git difftool --dir-diff master devel
Stéphane

3
Apakah ini dapat dilakukan sehingga cabang saat ini tidak ada dalam folder tmp dan karenanya mengizinkan pengeditan?
zkent

100

Dimulai dengan git v1.7.11, Anda dapat menggunakan git difftool --dir-diffuntuk melakukan diff direktori. Yang bekerja cukup baik dengan skrip berbaur tanpa https://github.com/wmanley/git-meld skrip.

Konfigurasikan git

git config --global diff.tool meld

Gunakan

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

Untuk 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
Saya pikir inilah yang diinginkan OP. Perhatikan opsi -g untuk menggunakan alat guidiff dan opsi -d untuk menggunakan --dir-diff. Ini bagus untuk melakukan tinjauan kode. Nit: opsi difftool.prompt tidak diperlukan saat menentukan -d, setidaknya untuk Git 1.8.
Michael Percy

1
Ini luar biasa. Apa yang saya butuhkan. Terima kasih!
Nicholas

5
Apakah ini dapat dilakukan sehingga cabang saat ini tidak ada dalam folder tmp dan karenanya mengizinkan pengeditan?
zkent

2
Saya akan menghargai jawaban untuk pertanyaan @zkent juga ... :(
tavlima

3
@zkent @tavlima: Perintah ini, sudah, memungkinkan pengeditan pada versi Anda saat ini. Bahkan jika Anda melihat tmp floder menjadi berbaur, jika Anda menyimpan - Ctrl+s- bagian yang tepat, file Anda dimodifikasi.
Benjamin

13

Penting untuk mengatakan bahwa menggunakan git difftool -dAnda masih dapat mengedit file yang berfungsi di Meld dan menyimpannya . Untuk mencapai itu, Anda perlu membandingkan beberapa cabang dengan pohon kerja Anda saat ini, misalnya:

git difftool -d branchname

Meld akan menunjukkan bahwa direktori kiri dan kanan berada di / tmp. Namun, file di direktori yang benar sebenarnya adalah tautan simbolis ke file Anda di direktori kerja saat ini (tidak berlaku untuk Windows). Jadi, Anda dapat mengeditnya di Meld dan saat Anda menyimpannya, perubahan Anda akan disimpan di direktori kerja Anda.

Namun pilihan yang lebih menarik adalah perbandingan direktori kerja saat ini dengan simpanan. Anda dapat melakukannya dengan hanya mengetik:

git difftool -d stash

Kemudian Anda dapat mentransfer beberapa perubahan dari simpanan (jendela kiri) ke copy pekerjaan Anda saat ini (jendela kanan), tanpa menggunakan git stash pop/applydan menghindari resolusi konflik yang mengganggu yang mungkin disebabkan oleh perintah ini.

Saya pikir itu secara signifikan dapat meningkatkan alur kerja dengan simpanan. Anda dapat secara bertahap mentransfer perubahan dari simpanan ke copy pekerjaan dan komit satu per satu, memperkenalkan beberapa perubahan lain jika Anda mau.


Piotr, ini adalah persis apa yang saya coba lakukan, tetapi dalam kasus saya (di CentOS), tidak ada symlink yang dibuat. Apakah ada pengaturan konfigurasi yang diperlukan, atau versi min berbaur yang mendukung ini?
wrjohns

Saya pikir Git bertanggung jawab atas pembuatan symlink, bukan Meld. Periksa manual Git untuk perintah difftool. Mungkin Anda harus memperbaruinya ke versi yang lebih baru?
Piotr Jurkiewicz

2
salin file baru dari cabang ke dir bekerja tidak bekerja :(
pykiss

5

Walaupun tampaknya dari jawaban lain seolah-olah tidak ada cara untuk melakukan ini secara langsung di repositori git saat ini, mudah (terima kasih atas jawaban untuk pertanyaan lain :)) untuk menulis skrip yang akan mengekstrak pohon dua komitmen. ke direktori sementara dan jalankan berbaur dengannya, hapus kedua direktori saat berbaur keluar:

http://gist.github.com/498628

Tentu saja, Anda akan kehilangan perubahan yang dibuat melalui berbaur, tapi itu cukup bagus untuk tinjauan singkat perbedaannya, saya pikir.


3

Saya pikir cara mudah untuk melakukan ini adalah menggunakan git reset --soft :

Sasaran: membandingkan perbedaan antara branch_a dan branch_b dengan berbaur

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

0

Di git V1.7.9 Anda dapat membandingkan dua commit tanpa commandline:

Anda harus mengonfigurasi dalam opsi edit 'git gui', global: "Gunakan alat gabungan: meld".

Mulai gitk , pilih komit, klik kanan komit lain> " beda ini -> dipilih ". Di bawah 'patch' klik kanan file> " diff eksternal ".

berbaur akan mulai dan menampilkan yang masih dipilih, komit pertama di sisi kanan.


0

Untuk Meld di macOS, tambahkan ini ke Anda ~/.gitconfigseperti yang direkomendasikan oleh pengelola aplikasi 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\"

Anda dapat menghilangkan mergekonfigurasi jika Anda mau.

@ Jawaban GutenYe tidak berhasil untuk saya karena melarikan diri secara otomatis dan / atau sesuatu dengan zsh.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.