git visual แตกต่างระหว่างกิ่ง


196

คำตอบนี้ดีมากสำหรับการเห็นภาพที่แตกต่างระหว่างสองไฟล์ที่ถูกตรวจสอบใน git: ฉันจะดูเอาต์พุต 'git diff' ด้วยโปรแกรม diff diff ได้อย่างไร

อย่างไรก็ตามฉันต้องการเห็นภาพที่แตกต่างระหว่างสองสาขา จนถึงตอนนี้ทางออกที่ดีที่สุดของฉันน่าจะเป็น:

git diff --name-status master dev

ซึ่งไม่ค่อยมีข้อมูลและมองไม่เห็น

มีอะไรที่ดีกว่านี้ไหม?


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

คำตอบ:


227

ใช้git diffกับช่วง

git diff branch1..branch2

นี่จะเป็นการเปรียบเทียบเคล็ดลับของแต่ละสาขา

หากคุณต้องการซอฟต์แวร์ GUI คุณสามารถลองใช้SourceTreeซึ่งรองรับ Mac OS X และ Windows


27
มันไม่ได้เป็นภาพที่มองเห็น ;)
นาวิกโยธิน

35
ในระบบ Linux ผมแนะนำให้ติดตั้งMeldแล้วตั้งเป็นค่าเริ่มต้นdifftoolด้วยgit config --global diff.tool meldและในที่สุดก็เปิดมันแทนธรรมดาด้วยdiff git difftool branch1..branch2ผลลัพธ์ที่ได้นั้นดูดีกว่ามาก
Gabriel

8
ใช้Meld visual difftool โดยไม่ต้องคอมไพล์ config:git difftool -t meld branch1..branch2
3780389

2
สำหรับผู้อ่าน: ในโพสต์ของฉันทุกคำตอบที่นี่ให้วิธีทำสิ่งที่คนขอ (แตกต่างใน GUI) ยกเว้นคำตอบนี้
G Huxley

3
@ GHuxley OP ถามถึงวิธีแก้ปัญหา GUI ที่ไหน?
alex

97

หากต้องการดูภาพที่แตกต่างของความแตกต่างทั้งหมดระหว่างสองสาขาฉันต้องการรวมสองสาขา - โดยไม่รวมการผสาน - จากนั้นใช้git guiหรือคอมไพล์ git เพื่อดูภาพรวมของความแตกต่าง

บรรทัดคำสั่ง Git สำหรับการรวมโดยไม่ต้องยอมรับ:

git checkout branchA
git merge - no-commit --no-ff branchB

จากนั้นเมื่อเสร็จแล้วคุณสามารถยกเลิกการรวมได้

git merge --abort

(h / t ถึง @ jcugat สำหรับความคิดเห็น)


10
อย่าดูถูกความเกี่ยวข้องของวิธีการนี้หากคุณต้องการใช้ IDE ของคุณ (หรืออื่น ๆ ที่ไม่เคยง่ายที่จะรวมกับ Git GUI difftool) ตัวเลือกนี้ยอดเยี่ยมสำหรับฉันเนื่องจากฉันใช้ Intellij และชอบที่จะหมุนไฟล์ที่ถูกดัดแปลงใน IDE อย่างมากมายในทุกรูปแบบที่เน้นด้วยไฮไลต์ของไวยากรณ์ ฉันใช้วิธีนี้สำหรับการตรวจสอบโค้ดทั้งหมดของฉันและฉันได้ทิ้งเครื่องมือเปรียบเทียบการดึงคำขอสุดซึ้งใน GitHub ไว้ข้างหลังแล้ว ฉันสามารถแก้ไขได้ตามปกติและเมื่อเสร็จฉันเพิ่งสร้างสาขาใหม่ด้วย "-code-review" ต่อท้ายและคอมมิท!
kghastie

2
ทำงานได้ตราบใดที่ไม่มีข้อขัดแย้งในการรวมและล้มเหลวเมื่อมีข้อขัดแย้งในการผสาน
Naga Kiran

1
ฉันชอบวิธีการนี้มาก! อย่างน้อยก็สำหรับฉันgit guiมันแสดงให้เห็นถึงความขัดแย้งในฐานะที่ไม่เป็นเวทีไม่ใช่ความขัดแย้งตามฉากดังนั้นคุณจะได้รับความแตกต่างที่ดี ช่วยฉันได้มากกว่าคำตอบยอดนิยม: D
DJGummikuh

55

ในกรณีที่คุณใช้ Intellij Idea IDE คุณสามารถใช้ตัวเลือกเปรียบเทียบในสาขา

ป้อนคำอธิบายรูปภาพที่นี่


มีการกำหนดค่า / ตัวเลือก / การตั้งค่าเพื่อแก้ไขการเปรียบเทียบนี้หรือไม่? (เช่น --ignore-space-at-eol สำหรับคอมไพล์ git)
Superole

49

คุณสามารถทำได้อย่างง่ายดายด้วย gitk

> gitk branch1 branch2

คลิกแรกที่ส่วนปลายของ branch1 ตอนนี้คลิกขวาที่ส่วนย่อย branch2 แล้วเลือก Diff this-> Selected


7
ใช้gitk branch1..branch2แสดงเฉพาะการกระทำระหว่างสองการแก้ไข
T3rm1

ใช้ gitk (ไม่มี branch1 branch2) หากคุณต้องการดูการเปลี่ยนแปลงทั้งหมดที่คุณทำในสาขาของคุณ
mikewasmike

31

สำหรับผู้ที่ใช้ Windows โดยใช้ TortoiseGit คุณสามารถเปรียบเทียบภาพได้ด้วยคุณสมบัติที่ค่อนข้างคลุมเครือ:

  1. นำทางไปยังโฟลเดอร์ที่คุณต้องการเปรียบเทียบ
  2. กดค้างshiftและคลิกขวา
  3. ไปที่ TortoiseGit -> เรียกดูข้อมูลอ้างอิง
  4. ใช้ctrlเพื่อเลือกสองสาขาเพื่อเปรียบเทียบ
  5. คลิกขวาที่การเลือกของคุณและคลิก "เปรียบเทียบ refs ที่เลือก"

ที่มา: http://wikgren.fi/compare-diff-branches-in-tortoise-git-or-how-to-preview-changes-before-doing-a-merge/


ทำไมคุณควรกดปุ่ม Shift ค้างไว้?
Zero3

1
กดปุ่ม Shift ค้างไว้ในขณะที่การคลิกขวาจะแสดงเมนู TortoiseGit แบบเต็มเสมอในกรณีที่คุณกำหนดค่า TortoiseGit ไม่ให้แสดงรายการบางอย่าง
ตรวจสอบ

นี่มันเจ๋งมาก. หวังว่ามันจะเป็นคุณสมบัติที่โดดเด่นมากขึ้น
ดึง

22

หากคุณใช้ OSX หรือ Windows 7+ Atlassian SourceTree ใช้งานได้ดีในเรื่องนี้ ว่าง.

คุณสามารถเห็นการเปลี่ยนแปลงแบบฉากในการตั้งค่า diff แบบเคียงข้างกันและคุณสามารถเปรียบเทียบโลคัลกับรีโมตและสาขาสองสาขาอื่น ๆ ได้อย่างง่ายดาย เมื่อเลือกไฟล์หลายไฟล์ diff จะแสดงดังต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

สมมติว่าคุณได้ตรวจสอบสาขาฟีเจอร์และคุณต้องการเห็นความแตกต่างกับ 'ต้นแบบ' คลิกขวาที่สาขา 'มาสเตอร์' และเลือก "Diff ต่อปัจจุบัน"

แต่น่าเสียดายที่มันไม่ได้ดูเหมือนว่าจะสามารถใช้ได้ในการกระจายระวัง * ในเร็ว ๆ นี้


3
อาจเป็น 'ฟรี' แต่แน่นอนต้องใช้เวลาอ่านข้อกำหนดการใช้งานของพวกเขา: atlassian.com/legal/customer-agreement ฉันชอบเครื่องมือนี้มาก แต่นี่อาจทำให้ฉันหลุดออกไป
akauppi

@akauppi ส่วนไหนที่ทำให้คุณไม่สนใจ? ฉันคิดว่าข้อตกลงทั้งหมดนั้นค่อนข้างเหมือนกัน
alex

นั่นเป็นเวลาหนึ่งปีที่ผ่านมา ใช่ข้อตกลงอาจคล้ายคลึงกัน แต่เป็นกระบวนการที่ SourceTree ผลักดันให้ฉันทำ มันแปลก ถึงแม้ว่า ฉันจะไม่มีรายละเอียดสำหรับคุณ ขออภัย
akauppi

16

ลองใช้ "difftool" (สมมติว่าคุณมีการตั้งค่าเครื่องมือ diff) - ดูhttps://www.kernel.org/pub/software/scm/git/docs/git-difftool.html

ฉันพบสถานะชื่อที่ดีสำหรับการสรุป แต่difftoolจะทำซ้ำการเปลี่ยนแปลง (และ-dตัวเลือกให้มุมมองไดเรกทอรี) เช่น

$ git difftool their-branch my-branch

Viewing: 'file1.txt'
Launch 'bc3' [Y/n]:
...

หรือตาม @ rsilva4 ที่กล่าวถึงด้วย-dและตั้งต้นให้กับสาขาปัจจุบันของคุณเป็นเพียง - เช่นเปรียบเทียบกับต้นแบบ:

$  git difftool -d master..

... และใช่ - มีหลายรูปแบบ - https://www.kernel.org/pub/software/scm/git/docs/git-reset.html


3
ขอบคุณนี่มีประโยชน์ การเพิ่มตัวเลือก -d จะทำให้สิ่งต่าง ๆ ดีขึ้น:git difftool -d their-abc my-abc
rsilva4

ตั้งแต่ explainshell.com ดูเหมือนจะไม่สามารถที่จะแยก -d ตัวเลือกในขณะนี้นี่คือสิ่งที่ manpage กล่าวว่า:-d --dir-diff: Copy the modified files to a temporary location and perform a directory diff on them. This mode never prompts before launching the diff tool.
waldyrious

8

หากคุณใช้ GitHub คุณสามารถใช้เว็บไซต์นี้:

github.com/url/to/your/repo/compare/SHA_of_tip_of_one_branch...SHA_of_tip_of_another_branch

ที่จะแสดงให้คุณเปรียบเทียบทั้งสอง


วิธีนี้ใช้งานได้ (ฉันทำตลอดเวลา) แต่คุณต้องส่งรหัสไปยัง repo Github แต่นั่นไม่ใช่ข้อแม้ที่ยอมรับได้ในความคิดของฉัน
adamwong246

2
หรือเพียงแค่github.com/url/to/your/repo/compare/นั้นคุณสามารถเลือกสาขา
caramba

และฉันจะได้รับ SHA นั้นได้อย่างไร ฉันหมายถึง SHA ของส่วนปลายของสาขาหมายความว่าอย่างไร
Optimus Prime

8

ในGitExtensionsคุณสามารถเลือกทั้งสองสาขาในกริดการแก้ไขด้วยการCtrlกด จากนั้นคุณสามารถดูไฟล์ที่แตกต่างระหว่างสาขาเหล่านั้น เมื่อคุณเลือกไฟล์คุณจะเห็นความแตกต่าง

ถ่ายจากที่นี่


ฉันได้เลือก 2 สาขาในกริดการแก้ไขของฉัน แต่ฉันไม่เห็นคำสั่งเปรียบเทียบใด ๆ ในเมนูที่ด้านบนหรือเมื่อฉันคลิกขวา
Eric

1
ฉันพบมันในส่วนหัวของบานหน้าต่างด้านล่าง มี Commit, File tree และ Diff
Eric

7

UPDATE

Mac: ตอนนี้ฉันใช้ SourceTree แนะนำอย่างละเอียด โดยเฉพาะอย่างยิ่งฉันชอบวิธีที่คุณสามารถขึ้นเวที / ไม่พร้อมนักล่า

Linux: ฉันประสบความสำเร็จด้วย:

  • SmartGit
  • GitKraken
  • meld

เช่นการติดตั้งsmartgitบน Ubuntu:


สิ่งนี้ทำงานได้:

git-diffall ด้วยเครื่องมือ GUI diff เหมือนที่รวมไว้ ดูจุดที่ 5 ที่นี่:

http://rubyglazed.com/post/15772234418/git-ify-your-command-line

มีโพสต์ที่ดีเกี่ยวกับคอมไพล์และหลอมรวมที่นี่: http://nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy


4

หากคุณใช้ Eclipse คุณสามารถเปรียบเทียบสาขาปัจจุบันของคุณบนเวิร์กสเปซด้วยแท็ก / สาขาอื่น:

เปรียบเทียบเวิร์กสเปซ Eclipse


โดยส่วนตัวแล้วฉันพบว่า Eclipse รองรับการกระจาย sub-par แต่ถ้านั่นคือทั้งหมดที่คุณมีมันก็โอเค
ysap

4

คุณสามารถใช้ P4Merge ฟรีจาก Perforce เพื่อทำสิ่งนี้เช่นกัน:

http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools

ป้อนคำอธิบายรูปภาพที่นี่

รายละเอียดเกี่ยวกับการรวมเข้ากับ Git สามารถพบได้ที่นี่และที่นี่

แต่สรุปอย่างรวดเร็วจากลิงค์ข้างต้นคือ:

  • ใส่บิตต่อไปนี้ใน ~ / .gitconfig ของคุณแล้วคุณสามารถทำได้$ git mergetoolและ$ git difftoolใช้ p4merge
  • โปรดทราบว่า$ git diffจะยังคงใช้ตัวแสดง diff diff แบบอินไลน์เริ่มต้น :) (ทดสอบด้วย git รุ่น 1.8.2)

การเปลี่ยนแปลง. gitconfig

[merge]
  keepBackup = false
    tool = p4merge
[mergetool "p4merge"]
    cmd = /Applications/p4merge.app/Contents/Resources/launchp4merge "\"$PWD/$BASE\"" "\"$PWD/$REMOTE\"" "\"$PWD/$LOCAL\"" "\"$PWD/$MERGED\""
    keepTemporaries = false
    trustExitCode = false
    keepBackup = false
[diff]
    tool = p4merge
[difftool "p4merge"]
    cmd = /Applications/p4merge.app/Contents/Resources/launchp4merge "\"$REMOTE\"" "\"$LOCAL\""

2

หากคุณใช้โปรแกรมแก้ไข WebStorm ที่ยอดเยี่ยมคุณสามารถเปรียบเทียบกับสาขาที่คุณต้องการ: Webstorm คอมไพล์เปรียบเทียบ


ที่จริงฉันเพิ่งสังเกต IntelliJ IDEA (สมมุติว่า WebStorm) มีความสามารถในการ "เน้น Non-Picked Commits" ซึ่งทำให้ชัดเจนมากซึ่งกระทำอยู่ในสาขา แต่ไม่ใช่อื่น
arthurakay

ใช่ฉันเพิ่งใช้ Intellij เพื่อเลือกที่จะทำการโหลดการเปลี่ยนแปลงที่เกิดขึ้นใน repo โดย "autoformat on save" เป็นเรื่องง่ายมาก ... ต้องค้นหาตัวเลือก "เปรียบเทียบก่อนหน้ากับท้องถิ่น" เพื่อที่จะทำ
Tom H

1

มองไปที่ git show-branch

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

ภาพหนึ่งที่ดูเหมือนจะไม่ได้รับการแก้ไขคือวิธีดูความมุ่งมั่นที่สาขามี (ไม่เหมือนกันหรือไม่ซ้ำกัน)

สำหรับภาพนี้ฉันเป็นแฟนตัวยงของgit show-branch; มันแบ่งออกเป็นตารางการกระทำที่ดีของการกระทำต่อสาขากลับไปที่บรรพบุรุษร่วมกัน - หากต้องการลองใช้กับ repo ที่มีหลายสาขาที่มี divergences เพียงพิมพ์git show-branchและตรวจสอบผลลัพธ์ - สำหรับการเขียนด้วยตัวอย่างดูที่เปรียบเทียบข้อผูกพันระหว่างสาขา Git


0

นี่คือวิธีการดูความแตกต่างที่มองเห็นระหว่างการกระทำทั้งหมดซึ่งตรงข้ามกับไฟล์เดียวใน Visual Studio (ทดสอบใน VS 2017) น่าเสียดายที่ใช้งานได้เฉพาะในการคอมมิชชันภายในสาขาเดียว: ใน "Team Explorer" ให้เลือกมุมมอง "Branches" คลิกขวาที่ repo และเลือก "ดูประวัติ" ดังภาพต่อไปนี้

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นประวัติของสาขาปัจจุบันจะปรากฏขึ้นในพื้นที่หลัก (ในกรณีที่สาขาที่สิ้นสุดลงก่อนหน้านี้มุ่งมั่นที่สาขาปัจจุบันจะถูกทำเครื่องหมายด้วยป้ายกำกับ) ตอนนี้เลือกสองกระทำด้วย Ctrl-Left จากนั้นคลิกขวาและเลือก "เปรียบเทียบการกระทำ ... " จากเมนูป๊อปอัพ

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเปรียบเทียบสาขาในโลกไมโครซอฟท์ดูคำถาม StackOverflow นี้: ความแตกต่างระหว่างสาขาคอมไพล์ใช้ Visual Studio


1
แสดงประวัติของสาขาเดียวเท่านั้นจึงไม่สามารถเปรียบเทียบระหว่างสาขาได้
Michał Fita

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