แสดงไฟล์ที่มีการเปลี่ยนแปลงระหว่างการแก้ไขสองครั้ง


2105

ฉันต้องการรวมสองสาขาที่ได้รับการแยกเป็นระยะเวลาหนึ่งและต้องการที่จะรู้ว่าไฟล์ใดได้รับการแก้ไข

มาที่ลิงค์นี้: http://linux.yyz.us/git-howto.htmlซึ่งมีประโยชน์มาก

เครื่องมือในการเปรียบเทียบสาขาที่ฉันเจอคือ:

  • git diff master..branch
  • git log master..branch
  • git shortlog master..branch

สงสัยว่ามีบางอย่าง "git status master .. สาขา" หรือไม่เพื่อดูไฟล์ที่แตกต่างระหว่างสองสาขาเท่านั้น

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

  • git diff master..branch | grep "^diff"

สงสัยว่ามีบางอย่างที่ฉันพลาดไปหรือไม่ ...


12
มีคนอื่นอีกกี่คนที่รู้ว่าชื่อของคำถามนี้ทำให้เข้าใจผิด? เป็นเรื่องเกี่ยวกับการค้นหาความแตกต่างของไฟล์ระหว่างสองสาขา สิ่งที่ฉันมาที่นี่กำลังมองหาคือวิธีดูความแตกต่างของไฟล์ระหว่างสองรุ่นในสาขาเดียวกัน หรือฉันเป็นคนเดียว?
Sandeepan Nath

4
@SandeepanNath: มีคอมไพล์ไม่มีความแตกต่าง คุณหมายถึงการกระทำของแต่ละคนอยู่เสมอ
Samuel O'Malley

@ SamuelO'Malley ฉันยังใหม่กับการคอมไพล์และพิจารณากลยุทธ์การแยกสาขาที่ดูเหมือนทั่วไปซึ่งในที่สุดทุกสาขาจะรวมเข้ากับสาขาหลักและท้ายที่สุดเจ้านายก็แผ่ออกไป ตอนนี้เมื่อพิจารณาถึงเหตุการณ์ของการเปิดตัวซึ่งการผลิตอยู่ที่ระดับผู้เชี่ยวชาญอยู่แล้ว แต่อยู่หลังส่วนปลาย (โดยการแก้ไขหนึ่งครั้งหากการเปิดตัวครั้งล่าสุดเกิดขึ้นหลังจากการรวมต้นแบบครั้งสุดท้าย) ฉันต้องการเห็นความแตกต่างระหว่างการแก้ไขทั้งสองนี้ ค้นหาสิ่งที่จะรีดออก ฉันไม่ต้องการดูสาขาที่รวมกันครั้งล่าสุด ถูกต้องฉันถ้าฉันผิด
Sandeepan Nath

2
@SandeepanNath: แทนที่จะใช้ชื่อสาขาคุณสามารถรับคำตอบด้านล่างและเพียงแค่ระบุรหัสการกระทำแทน หรืออ้างอิงคอมมิชชันด้วยชื่อแท็กถ้าคุณสร้างแท็กเมื่อเปิดใช้งาน
Samuel O'Malley

1
@SandeepanNath คุณไม่สามารถเปรียบเทียบ 2 สาขาคุณต้องระบุการแก้ไข ดังนั้นการเปรียบเทียบ 2 สาขาคือการเปรียบเทียบ 2 รุ่น
Bastien Vandamme

คำตอบ:


2574

วิธีเปรียบเทียบสาขาปัจจุบันกับmasterสาขา:

$ git diff --name-status master

หากต้องการเปรียบเทียบสองสาขาใด ๆ :

$ git diff --name-status firstbranch..yourBranchName

อ่านข้อมูลเกี่ยวกับgit diffในเอกสารที่เป็นทางการ


2
แต่ละดัชนีทางซ้ายมือหมายถึงอะไร (ฉันเห็น M's และ D's จำนวนมาก)
gogogadgetinternet

15
@ user446936 - คุณสามารถดูความหมายของตัวอักษรในหน้า man สถานะ git @ kernel.org/pub/software/scm/git/docs/git-status.html - โดยเฉพาะ M ==, D == ลบ
James Manning

12
git diff --name-status your_branch...masterแสดงผลการเปลี่ยนแปลงที่เกิดขึ้นกับต้นแบบตั้งแต่ your_branch ถูกสร้างขึ้นจากมัน
Radu

1
โอเปอเรเตอร์จุดสองจุดฟุ่มเฟือยที่นี่เพราะ diffs เป็นจำนวนเต็ม
jub0bs

2
ฉันไม่ได้รับการแก้ไขหรือเส้นทางที่ไม่รู้จักในแผนผังการทำงาน
SuperUberDuper

408

ลอง

$ git diff --stat --color master..branchName

วิธีนี้จะให้ข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงแต่ละรายการในขณะที่ยังคงใช้จำนวนบรรทัดเท่ากัน

นอกจากนี้คุณยังสามารถพลิกกิ่งเพื่อให้ได้ภาพที่แตกต่างที่ชัดเจนยิ่งขึ้นหากคุณรวมวิธีอื่น:

$ git diff --stat --color branchName..master

77
หากคุณมีสี git (แนะนำเป็นอย่างยิ่ง imho) เปิดอยู่ ( config --global color.ui true) คุณสามารถข้าม --color (ฉันมี lks - ซินโดรมของแป้นพิมพ์ขี้เกียจ)
Art Swri

25
ฉันอยู่กับคุณในสี! BTW ฉันหมายถึงว่าgit config --global color.ui trueจะเสร็จสมบูรณ์
Art Swri

2
ใช้งานไม่ได้ส่งข้อผิดพลาด:fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.
Tomáš Zato - Reinstate Monica

7
@ TomášZatoขออภัย แต่คุณต้องสลับ "branchName" ด้วยชื่อสาขาของคุณ
Gerry

161

โปรดจำไว้ว่าคอมไพล์นั้นแยกได้ง่ายและราคาถูก ถ้าฉันคิดว่าการผสานอาจเป็นปัญหาได้ฉันจะสร้างสาขาสำหรับการผสาน ดังนั้นหากmasterมีการเปลี่ยนแปลงที่ฉันต้องการผสานและbaเป็นสาขาของฉันที่ต้องการรหัสจากต้นแบบฉันอาจทำสิ่งต่อไปนี้:

git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master

ผลลัพธ์ที่ได้คือฉันต้องลองผสานกับสาขาที่โยนทิ้งก่อนที่จะทำการสกรูกับสาขาของฉัน หากตัวเองยุ่งเหยิงฉันสามารถลบba-mergeกิ่งก้านแล้วเริ่มใหม่ได้


4
น่ากลัว ฉันไม่เคยคิดจะแยกทางนั้น ฉันคิดว่าสิ่งนี้ควรได้รับการพิจารณาว่าเป็นส่วนหนึ่งของ "แนวทางปฏิบัติที่ดีที่สุด" เมื่อทำการผสาน
egelev

เมื่อคุณรวม ba-marge กลับไปที่ ba ไม่มีโอกาสที่จะแก้ไขข้อขัดแย้งอีกครั้งหรือไม่
Josef.B

2
@EricAnderson ใช่แล้วมันเป็นกราฟ SVN เกาะติดหมากฝรั่งใต้โต๊ะเรียน ขอบคุณ.
Josef.B

1
ทำไมคุณต้องทำขั้นตอนสุดท้าย 'git merge master' ถ้า ba-merge มี master อยู่แล้ว
qwebek

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

58

หากใครพยายามสร้างไฟล์ต่างจากสองสาขา:

git diff master..otherbranch > myDiffFile.diff

2
สิ่งนี้มีประโยชน์โดยเฉพาะกับสาขาขนาดใหญ่ที่มีความแตกต่างมากมาย
vandsh

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

42

นอกจากนี้ยังมีวิธีการตาม GUI

คุณสามารถใช้gitk

  1. วิ่ง:

    $ gitk --all
    
  2. คลิกขวาที่การกระทำของสาขาและเลือกทำเครื่องหมายการกระทำนี้ในเมนูป๊อปอัพ

  3. คลิกขวาที่กระทำของสาขาอื่นและเลือกDiff นี้ -> ทำเครื่องหมายกระทำหรือDiff เครื่องหมายกระทำ -> นี้

จากนั้นจะมีรายการไฟล์ที่เปลี่ยนแปลงในแผงด้านล่างขวาและรายละเอียดต่าง ๆ ในแผงด้านล่างซ้าย


3
@Orwellophile ฉันอัพโหลดวิดีโอเพื่อแสดงวิธีการ ฉันหวังว่ามันจะช่วยคุณ
Yantao Xie

ว้าวสำหรับฉันฉันรู้สึกพิเศษ ฉันได้ทำบุ๊กมาร์กไว้ใน Delicious.com สำหรับการอ้างอิงในอนาคตและ google-foo เพิ่มเติม
Orwellophile

คำตอบที่ถูกประเมินต่ำเกินไป ขอบคุณ!
Koshinae

36

อีกหนึ่งตัวเลือกโดยใช้ meld ในกรณีนี้:

git difftool -d master otherbranch

สิ่งนี้ช่วยให้ไม่เพียง แต่จะเห็นความแตกต่างระหว่างไฟล์ แต่ยังมีวิธีที่ง่ายต่อการชี้และคลิกลงในไฟล์เฉพาะ


6
อาจต้องการตั้งค่า meld เป็นค่าเริ่มต้น difftool: git config --global diff.tool meld
bwv549

1
นี่คือสิ่งที่ฉันชอบเพราะมันจะใช้สิ่งที่แตกต่างจากที่คุณกำหนด
Josiah

OSX ไม่รองรับ :-(
Mike S.

@MikeS กรุณาชำระเงินคำตอบนี้ stackoverflow.com/a/12815806/151918มันมีคำแนะนำสำหรับ OSX มันใช้งานได้สำหรับฉันอย่างน้อยก็หวังว่าจะช่วยได้
rsilva4

ดี แต่-dตัวเลือกคืออะไร
Scotty.NET

29

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


10
เดวิดว่าเป็นจุดที่ดีถึงแม้ว่ามันจะเป็นความสุขที่จะเพียงแค่รู้ว่าสิ่งที่เกิดขึ้นก่อนที่มือ ...
johannix

18

และหากคุณกำลังมองหาการเปลี่ยนแปลงเฉพาะในบางไฟล์แล้ว:

git diff branch1 branch2 -- myfile1.js myfile2.js

branch1 เป็นทางเลือกและสาขาปัจจุบันของคุณ (สาขาที่คุณเปิดอยู่) จะถูกพิจารณาตามค่าเริ่มต้นหากไม่ได้ระบุ branch1 เช่น:

git diff master -- controller/index.js

15

เมื่อทำงานร่วมกันหรือใช้คุณสมบัติหลายอย่างพร้อมกันเป็นเรื่องปกติที่ upstream หรือแม้กระทั่งต้นแบบของคุณจะมีงานที่ไม่รวมอยู่ในสาขาของคุณและจะปรากฏอย่างผิดปกติใน diffs พื้นฐาน

หากอัปสตรีมของคุณอาจย้ายคุณควรทำสิ่งนี้:

git fetch
git diff origin/master...

เพียงใช้ git diff master สามารถรวมหรือไม่รวมการเปลี่ยนแปลงที่เกี่ยวข้อง


10

หากคุณใช้IntelliJ IDEAคุณสามารถเปรียบเทียบสาขาใดก็ได้กับสาขาที่ทำงานปัจจุบันของคุณ ดูhttp://www.jetbrains.com/idea/webhelp/merging-deleting-and-comparing-branches.html#d288093e3827สำหรับข้อมูลเพิ่มเติม นี้มีอยู่ในรุ่นฟรีเช่นกัน


8

มีสองสาขาให้พูด

  • A (สาขาที่คุณทำงาน)
  • B (สาขาอื่นที่คุณต้องการเปรียบเทียบ)

อยู่ในสาขา A คุณสามารถพิมพ์

git diff --color B

จากนั้นจะให้ผลลัพธ์ของ

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

จุดสำคัญเกี่ยวกับเรื่องนี้คือ

  1. ข้อความสีเขียวมีอยู่ในสาขา A

  2. ข้อความสีแดงมีอยู่ในสาขา B


8

มีคำตอบมากมายที่นี่ แต่ฉันต้องการเพิ่มสิ่งที่ฉันมักใช้ หากคุณอยู่ในหนึ่งในสาขาที่คุณต้องการเปรียบเทียบฉันมักจะทำอย่างใดอย่างหนึ่งต่อไปนี้ เพื่อประโยชน์ของคำตอบนี้เราจะบอกว่าเราอยู่ในสาขาที่สองของเรา ขึ้นอยู่กับว่าคุณต้องการอะไรในเวลานั้นจะขึ้นอยู่กับว่าคุณเลือกอะไร แต่ส่วนใหญ่ฉันใช้ตัวเลือกที่สองของทั้งสอง ตัวเลือกแรกอาจมีประโยชน์หากคุณพยายามที่จะย้อนกลับไปใช้สำเนาต้นฉบับ - ไม่ว่าด้วยวิธีใดทั้งสองทำงานให้เสร็จ!

สิ่งนี้จะเปรียบเทียบข้อมูลหลักกับสาขาที่เราอยู่ (ซึ่งเป็นข้อมูลรอง) และรหัสต้นฉบับจะเป็นบรรทัดที่เพิ่มและรหัสใหม่จะถูกพิจารณาว่าเป็นสายที่ถูกลบออก

git diff ..master

หรือ

นี่จะเป็นการเปรียบเทียบข้อมูลหลักกับสาขาที่เราอยู่ (ซึ่งเป็นข้อมูลรอง) และรหัสต้นฉบับจะเป็นบรรทัดเก่าและรหัสใหม่จะเป็นบรรทัดใหม่

git diff master..

1

หากคุณกำลังใช้ Github / Github องค์กรคุณสามารถใช้เว็บ UI โดยการกดปุ่มที่ url /compareของเส้นทางพื้นที่เก็บข้อมูลของคุณตัวอย่างเช่นhttps://github.com/http4s/http4s/compare คุณสามารถเลือก branch / commit / tag ที่คุณต้องการเปรียบเทียบ: Github เปรียบเทียบภาพหน้าจอ

และส่วนต่างจะถูกนำเสนอในอินเทอร์เฟซ github ที่ url /compare/{x1}...{x2}ซึ่งเป็นx2และx1เป็นสาขา / กระทำ / แท็กที่คุณต้องการเปรียบเทียบเช่น: https://github.com/http4s/http4s/compare/release-0.18.x ... ต้นแบบ

ท่านสามารถดูรายละเอียดเพิ่มเติมในเอกสาร Github



-1
git diff revision_n revision_m

ถ้าrevision_nและrevision_mต่อเนื่องกันกระทำมันจะออกมาเหมือนกัน git show revision_m


-1

นอกจากนี้คุณยังสามารถใช้diff ภาพ

ตัวอย่างเช่นถ้าคุณกำลังใช้Sourcetreeคุณสามารถเพียงแค่เลือกที่สองกระทำในมุมมองของการเข้าสู่ระบบ

(โดยส่วนตัวแล้วฉันชอบใช้ GUI ในกรณีนี้และฉันโพสต์สิ่งนี้สำหรับผู้ที่อาจไม่คุ้นเคยกับตัวเลือก GUI)


-2

ถ้าคุณชอบ GUI และใช้ Windows นี่เป็นวิธีที่ง่าย

  1. ดาวน์โหลด WinMerge
  2. ลองดูสองสาขาในโฟลเดอร์ต่างๆ
  3. เปรียบเทียบโฟลเดอร์ด้วยโฟลเดอร์โดยใช้ WinMerge คุณสามารถแก้ไขได้อย่างง่ายดายหากสาขาใดสาขาหนึ่งเป็นสาขาที่คุณกำลังทำอยู่

มันไม่ใช่วิธีที่ง่ายที่สุดที่จริงแล้วไม่จำเป็นต้องดาวน์โหลด repos เพื่อแยกความแตกต่างระหว่างสาขา
stefgosselin

มันย่อมไม่ได้วิธีที่ง่ายที่สุด แต่มันเป็นวิธีที่ GUI ซึ่งมักจะเป็นมากขึ้นโดยเฉพาะอย่างยิ่งสำหรับการมองเห็น diffs ในทุกไฟล์
Marius Matioc

-3

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

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

Remmber ว่าคุณจะมีผลแตกต่างกันถ้าคุณเปรียบเทียบต้นแบบที่มีสาขาของคุณและคุณสาขากับต้นแบบ


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