ดูความแตกต่างของสาขาด้วย meld?


159

meld .ฉันรู้ว่าฉันสามารถดูความแตกต่างระหว่างหัวและรัฐในปัจจุบันมี แต่ฉันจะดูความแตกต่างระหว่างสาขาตัวอย่างmasterและdevelกับ meld ได้อย่างไร

ในขณะที่ฉันทำตามขั้นตอนต่อไปนี้:

  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 มันค่อนข้างเหมือนกับสคริปต์ของ Mark แต่ทำงานเพื่อเปรียบเทียบการกระทำใด ๆ หรือพื้นที่การจัดเตรียมหรือไดเรกทอรีการทำงานกับส่วนอื่น ๆ หากสิ่งใดสิ่งหนึ่งที่คุณกำลังเปรียบเทียบกับเป็นต้นไม้การทำงานนั่นคืออ่าน - เขียนด้วยดังนั้นคุณจะไม่สูญเสียการเปลี่ยนแปลง


1
เครื่องมือที่ยอดเยี่ยมจะ ขอบคุณ! แนะนำอย่างละเอียด ... ตอนนี้ถ้ามันใช้ได้เฉพาะในการรวมเช่นกัน
Dipstick

TYVM สำหรับเครื่องมือที่ยอดเยี่ยม - (เตือนให้เพิ่มตนเองเพื่อเพิ่มเข้าไปในนามแฝง)
kfmfe04

26
การอ้างถึงจากแหล่งเก็บข้อมูล hit 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

ปรับปรุง: หากคุณไม่ต้องการให้ diff หนึ่งไฟล์ที่มีเวลา แต่ต้องการที่จะใช้ผสมของไดเรกทอรี "" มุมมองที่มีการเปลี่ยนแปลงทั้งหมดระหว่างสองสาขาทราบ-dหรือทางเลือกสำหรับ--dir-diff git difftoolตัวอย่างเช่นเมื่อฉันอยู่ที่สาขา XYZ และฉันต้องการเห็นสิ่งที่แตกต่างระหว่างสิ่งนี้กับสาขา ABC ฉันเรียกใช้สิ่งนี้:

git difftool -d ABC

3
นั่นไม่ใช่สิ่งที่ฉันกำลังมองหา มันแสดงให้ฉันเห็นความแตกต่างของไฟล์แต่ละไฟล์ ฉันเก็บถาวรด้วยสคริปต์ diff.py และ 'git diff master..devel' ก่อนหน้านี้ ฉันต้องการเห็นความแตกต่างทั้งหมดและโครงสร้างไดเรกทอรีเช่น 'meld folderA / folderB /'
Marten Bauer

มอร์เทนนั่นคือวิธีการทำงานคอมไพล์ มันติดตามเฉพาะไฟล์ดังนั้นคุณจะเห็นได้เฉพาะไฟล์ที่แตกต่างกันเท่านั้น ในคอมไพล์คุณไม่สามารถกระทำ dir ว่างเปล่าเพียงอย่างเดียว มีเหตุผลใดที่คุณต้องการให้แสดงต่างกันระหว่าง dir หรือไม่
Donny Kurnia

@ DonnyKurnia: ฉันต้องเข้าใจว่า OP พยายามทำอะไรบ้าง: Meld มี UI แยกต่างหากสำหรับการดูการเปลี่ยนแปลงทั้งหมดในไดเรกทอรี คุณสามารถกรองการดูไฟล์โดยดูจากไฟล์เดิมเปลี่ยนใหม่ OP ต้องการใช้ UI นั้นเพื่อแสดงการเปลี่ยนแปลง (สิ่งนี้ช่วยให้คุณเห็นรายการการเปลี่ยนแปลงทั้งหมดและเลือกสิ่งที่คุณต้องการแตกต่างกัน) ดังนั้นจึงไม่ใช่การเปรียบเทียบระหว่างไดเรกทอรี แต่เป็นการเปรียบเทียบระหว่างการกระทำ แต่ดูโดยรวม
idbrii

17
@MartenBauer ฉันคิดว่านี่คือสิ่งที่คุณต้องการ: git difftool - dev-diff master devel
Stéphane

3
สามารถทำได้เพื่อให้สาขาปัจจุบันไม่อยู่ในโฟลเดอร์ tmp และอนุญาตให้แก้ไขได้หรือไม่
zkent

100

เริ่มต้นด้วย git v1.7.11 คุณสามารถใช้git difftool --dir-diffเพื่อสร้างไดเรกทอรีที่แตกต่าง ซึ่งใช้งานได้ดีกับ meld wihout https://github.com/wmanley/git-meldสคริปต์

กำหนดค่าคอมไพล์

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
ฉันคิดว่านี่เป็นสิ่งที่ OP ต้องการจริงๆ จดบันทึกตัวเลือก -g เพื่อใช้เครื่องมือ guidiff และตัวเลือก -d เพื่อใช้ --dir-diff นี่เป็นสิ่งที่ดีสำหรับการตรวจสอบโค้ด Nit: ไม่จำเป็นต้องใช้ตัวเลือก difftool.prompt เมื่อระบุ -d อย่างน้อยสำหรับ Git 1.8
Michael Percy

1
สิ่งนี้ช่างมหัศจรรย์. สิ่งที่ฉันต้องการ ขอบคุณ!
นิโคลัส

5
สามารถทำได้เพื่อให้สาขาปัจจุบันไม่อยู่ในโฟลเดอร์ tmp และอนุญาตให้แก้ไขได้หรือไม่
zkent

2
ฉันขอขอบคุณคำตอบสำหรับคำถาม @zkent เช่นกัน ... :(
tavlima

3
@zkent @tavlima: คำสั่งนี้อนุญาตการแก้ไขในเวอร์ชันปัจจุบันของคุณแล้ว แม้ว่าคุณจะเห็นไฟล์ tmp floder ในไฟล์ meld หากคุณบันทึก - Ctrl+sส่วนที่ถูกต้องไฟล์ของคุณจะถูกแก้ไข
Benjamin

13

เป็นเรื่องสำคัญที่จะต้องบอกว่าการใช้งานgit difftool -dคุณยังสามารถแก้ไขไฟล์การทำงานใน Meld และบันทึกได้ เพื่อให้บรรลุว่าคุณต้องเปรียบเทียบสาขากับแผนผังการทำงานปัจจุบันของคุณตัวอย่างเช่น

git difftool -d branchname

Meld จะแสดงว่าทั้งไดเร็กทอรีซ้ายและขวาอยู่ใน / tmp อย่างไรก็ตามไฟล์ในไดเรกทอรีที่ถูกต้องเป็นลิงก์สัญลักษณ์ไปยังไฟล์ของคุณในไดเรกทอรีทำงานปัจจุบัน (ไม่ได้ใช้กับ Windows) ดังนั้นคุณสามารถแก้ไขได้ใน Meld และเมื่อคุณบันทึกการเปลี่ยนแปลงของคุณจะถูกบันทึกไว้ใน dir ที่ทำงานของคุณ

ตัวเลือกที่น่าสนใจยิ่งกว่าคือการเปรียบเทียบ dir ที่ทำงานในปัจจุบันกับที่ซ่อน คุณสามารถทำได้โดยพิมพ์:

git difftool -d stash

จากนั้นคุณสามารถโอนการเปลี่ยนแปลงบางอย่างจากที่เก็บ (หน้าต่างด้านซ้าย) ไปยังสำเนาการทำงานปัจจุบันของคุณ (หน้าต่างด้านขวา) โดยไม่ต้องใช้git stash pop/applyและหลีกเลี่ยงการแก้ไขข้อขัดแย้งที่น่ารำคาญซึ่งอาจเกิดจากคำสั่งนี้

ฉันคิดว่ามันสามารถเพิ่มเวิร์กโฟลว์อย่างมีนัยสำคัญด้วยการหยุดทำงาน คุณสามารถถ่ายโอนการเปลี่ยนแปลงจากที่ซ่อนไปยังสำเนาที่ใช้งานได้และทำการยอมรับทีละรายการโดยแนะนำการเปลี่ยนแปลงอื่น ๆ หากคุณต้องการ


อย่างไรก็ตามนี่คือสิ่งที่ฉันพยายามทำ แต่ในกรณีของฉัน (บน CentOS) ไม่มีการสร้าง symlink มีการตั้งค่าการกำหนดค่าที่จำเป็นหรือรุ่น meld ที่สนับสนุนสิ่งนี้หรือไม่
wrjohns

ฉันคิดว่า Git รับผิดชอบการสร้าง symlink ไม่ใช่ Meld ตรวจสอบคู่มือ Git สำหรับคำสั่ง difftool บางทีคุณควรอัปเดตเป็นเวอร์ชันที่ใหม่กว่าใช่ไหม
Piotr Jurkiewicz

2
คัดลอกไฟล์ใหม่จาก branch ไปยัง dir ที่ใช้งานไม่ได้ :(
pykiss

5

แม้ว่าจะดูเหมือนว่าจากคำตอบอื่น ๆ ราวกับว่าไม่มีวิธีการทำเช่นนี้โดยตรงในพื้นที่เก็บข้อมูล git ในขณะนี้มันเป็นเรื่องง่าย (ขอบคุณคำตอบของคำถามอื่น :)) เพื่อเขียนสคริปต์ที่จะแยกต้นไม้ของทั้งสอง ไปยังไดเร็กทอรีชั่วคราวและรัน meld บนมันลบทั้งสองไดเร็กทอรีเมื่อ meld ออก:

http://gist.github.com/498628

แน่นอนคุณจะสูญเสียการเปลี่ยนแปลงใด ๆ ที่ทำผ่าน meld แต่มันก็ค่อนข้างดีสำหรับภาพรวมอย่างรวดเร็วของความแตกต่างฉันคิดว่า


3

ฉันคิดว่าวิธีง่าย ๆ ในการทำเช่นนี้คือใช้git reset --soft:

เป้าหมาย: เปรียบเทียบความแตกต่างระหว่าง branch_a และ branch_b กับ meld

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

0

ใน git V1.7.9 คุณสามารถเปรียบเทียบการคอมมิทสองรายการโดยไม่มี commandline:

คุณต้องกำหนดค่าในตัวเลือกการแก้ไข 'git gui' แบบโกลบอล: "ใช้เครื่องมือผสาน: meld"

เริ่มต้นgitkเลือกการกระทำคลิกขวาที่คอมมิทอื่น> " diff this -> selected " ในส่วนของ 'patch' ให้คลิกขวาที่ไฟล์> " external diff "

meldจะเริ่มต้นและแสดงภาพนิ่งที่เลือกไว้ก่อนส่งมอบให้ทางด้านขวา


0

สำหรับ Meld บน macOS ให้เพิ่มส่วนนี้~/.gitconfigตามที่ผู้ดูแลแอปพลิเคชัน macOS แนะนำไว้ดังนี้:

[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หรือสิ่งที่มี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.