วิธีการเปรียบเทียบสาขา git ท้องถิ่นกับสาขาระยะไกลได้อย่างไร


1050

ฉันจะดูdiffระหว่างสาขาในพื้นที่และสาขาระยะไกลได้อย่างไร


5
คำถามนี้ถูกถามอีกครั้งในภายหลัง มันมีคำตอบที่ดี: stackoverflow.com/questions/11935633/…
rustybeanstalk

3
ตัวอย่าง: git diff master origin / master (โดยที่ master เป็นสาขาหลักของ local และ origin / master เป็น remote master branch)
Dung

@klyngbaek คำตอบนี้โดยเฉพาะ ;-)

ตอนแรกฉันพยายามgit diff HEAD origin/HEADซึ่งดูเหมือนจะชี้ไปที่สาขาระยะไกลที่แตกต่างจากที่ฉันตั้งใจไว้ ใช้ชื่อสาขาเต็มทำงานตามที่คาดไว้
Deanna

คำตอบ:


592

หากต้องการอัปเดตสาขาติดตามระยะไกลคุณต้องพิมพ์git fetchก่อนแล้วจึง:

git diff <masterbranch_path> <remotebranch_path>

คุณสามารถgit branch -aแสดงรายการทุกสาขา (ภายในและระยะไกล) จากนั้นเลือกชื่อสาขาจากรายการ (เพียงลบremotes/จากชื่อสาขาระยะไกล

ตัวอย่าง: git diff master origin/master(โดยที่ "master" เป็นสาขาหลักของท้องถิ่นและ "origin / master" เป็นรีโมตนั่นคือ Origin และ Branch Master)


23
เขาอาจต้องเรียกข้อมูลก่อน ( git fetch)
Houssem Badri

ที่เพิ่งแสดงให้เห็นถึงการเปลี่ยนแปลงใน bash มีวิธีใดที่จะเปิดการเปลี่ยนแปลงทั้งหมดใน IDE เช่นรหัส VS?
Phoujdar Harsh

@Harsh Phoujdar เพิ่มรหัสด้านล่างในไฟล์. git / .gitconfig [diff] tool = vscode [difftool] prompt = false [difftool "vscode"] cmd = \"C:\\Program Files (x86)\\Microsoft VS Code\\Code.exe\" \"$LOCAL\" \"$REMOTE\" --diff --wait trustExitCode = falseของคุณตรวจสอบให้แน่ใจว่าพา ธ ของคุณไปยังไฟล์ code.exe นั้นถูกต้อง
อามาน

1307
git diff <local branch> <remote>/<remote branch>

ตัวอย่างเช่นgit diff master origin/masterหรือgit diff featureA origin/next

แน่นอนว่าต้องมีสาขาการติดตามระยะไกลที่คุณต้องการgit fetchก่อน และคุณต้องการให้มีข้อมูลล่าสุดเกี่ยวกับสาขาในที่เก็บระยะไกล


98
จะแม่นยำมากขึ้น: git diff <local branch> <remote> / <remote branch>
nalply

38
ฉันมักจะทำgit diff <remote>/<remote branch> <local branch>เพื่อดูสิ่งที่ผลักดันของฉันจะทำกับ repo ระยะไกล
Michał Tatarynowicz

76
ที่สั้นกว่าgit diff originนั้นก็เพียงพอแล้วถ้าคุณเพิ่งเปรียบเทียบกับสาขาต้นน้ำของคุณ
Ludder

12
โปรดเพิ่มgit fetchที่จุดเริ่มต้นมันทำให้เกิดปัญหากับมือใหม่อย่างฉัน
Saif

1
เฮ้มันไม่ควรgit diff <remote>/<remote branch> <local branch>เหรอ? มิฉะนั้นฉันได้รับการเพิ่มและลบเปิดเครื่องคอมพิวเตอร์ของฉัน (รุ่น git 2.7.0.windows.2)
Martín Coll

183

ประเภทแรก

git branch -a

เพื่อรับรายการสาขาที่มีอยู่ ในผลลัพธ์คุณอาจเห็นบางสิ่งเช่น

* master
  remotes/main/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/mt
  remotes/upstream/master
  remotes/upstream/mt

จากนั้นแสดงความแตกต่าง

git diff --stat --color remotes/main/master..origin/master
git diff remotes/main/master..origin/master

1
ไม่ควรจะเป็น...มากกว่า..หรือไม่
Eliran Malka

9
ฉันจะเลือกคำตอบนี้เป็นคำตอบแน่นอน ตามทิศทางของคุณฉันสามารถดูความแตกต่างระหว่างสาขาในพื้นที่และสาขาระยะไกล ขอบคุณ!
Tass

1
ฉันมักจะทำgit log origin/my_branch..ซึ่งจะใช้HEADเป็นอ้างอิงในท้องถิ่นซึ่งส่วนใหญ่เป็นสิ่งที่คุณหมายถึง
รูดี้

4
+1 สำหรับคำตอบที่ดีที่สุดในความเห็นต่ำต้อยของฉัน น่าจะเป็น +2 ถ้าคุณพูดถึง "ดึง" เพื่อประสานภาพ "ระยะไกล" ของแหล่งที่มาโคลน ขั้นตอนภาพรวมสถิติ / สีมีประโยชน์อย่างยิ่ง
bvj

3
ขอบคุณสำหรับคำตอบหนึ่งที่ในที่สุดก็ออกไปทำงานของเจ็ดหรือแปด "คำตอบ" ที่ส่งผลให้น้อยกว่าหรือfatal: bad revision fatal: ambiguous argumentทั้งหมดที่ฉันต้องการคือการเห็นความแตกต่างในไฟล์เดียวกันจากสาขาอื่นนั่นคือสิ่งที่มากเกินไปที่จะถาม? ใช่มันเป็น :-) ใช้git diff remotes/origin/<base branch> <current branch> -- <filename>งานได้ดีกับคอมไพล์ 1.8.3.1
Steve Bonds

143

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

git diff @{upstream}

หากอัสตรีมของคุณไม่ได้ถูกตั้งค่า (โดยทั่วไปจะเป็นกรณีนี้ขอบคุณArijoonในความคิดเห็น)

git diff @{push}

ด้วยความช่วยเหลือของคำตอบนี้เอกสารประกอบการคอมไพล์สำหรับการระบุการแก้ไขมี:

<branchname>@{upstream}เช่นmaster@{upstream}, @{u}
ต่อท้าย @{upstream}ไป BRANCHNAME (แบบสั้น<branchname>@{u}) หมายถึงสาขาที่สาขาที่ระบุโดยbranchnameการตั้งค่าเพื่อสร้างด้านบนของ (กำหนดค่าด้วยbranch.<name>.remoteและbranch.<name>.merge) branchnameค่าเริ่มต้นที่ขาดหายไปเป็นปัจจุบัน


10
คำตอบที่ดีมากหายไปเพียงเล็กน้อย git diff @ @{upstream}เปลี่ยนเส้น สิ่งที่เพิ่มขึ้น@คือHEADสิ่งที่คุณเป็นอยู่ในขณะนี้ดังนั้นคุณกำลังเปรียบเทียบHEADกับต้นน้ำที่สาขาของคุณกำลังติดตาม คุณสามารถใช้@{push}แทน
อัพสตรีม

3
คำตอบที่ดีที่สุดไม่จำเป็นต้องเรียกรีโมต ต้องการ upvotes มากขึ้น!
jcomeau_ictx

3
ในเปลือกปลาฉันได้รับผล: fatal: ambiguous argument '@upstream': unknown revision or path not in the working tree. ต้องใช้git diff @\{upstream\}แทน 😥
แลนดอนคุห์น

คุณต้องgit fetchก่อนอื่นไม่ทำอะไรเลยไม่แสดงผลลัพธ์ ทดสอบโดยการลบไฟล์ใน repo origin และรันคำสั่งนี้แบบโลคัล .. ทำงานเฉพาะหลังจากดึงข้อมูล

นอกจากนี้ตามคำตอบที่ระบุยังรวมถึงการเปลี่ยนแปลงในท้องถิ่น บางครั้งสิ่งนี้เป็นที่ต้องการในบางครั้งไม่ใช่
Deanna

44

ฉันเข้าใจผลลัพธ์ของ:

git diff <remote-tracking branch> <local branch>

ที่แสดงให้ฉันเห็นสิ่งที่จะถูกทิ้งและสิ่งที่จะเพิ่มถ้าฉันผลักสาขาท้องถิ่น แน่นอนมันเหมือนกันเพียงตรงกันข้าม แต่สำหรับฉันอ่านได้ง่ายขึ้นและฉันรู้สึกสบายใจมากขึ้นในการดูว่าจะเกิดอะไรขึ้น


ฉันได้ผลลัพธ์เดียวกันกับ: git diff <local branch> <remote-tracking branch> หรือ git diff <remote-tracking branch> <local branch>
user2928048

32

วิธีง่าย ๆ :

git fetch
git log -p HEAD..FETCH_HEAD

สิ่งนี้จะดึงการเปลี่ยนแปลงจากรีโมตเริ่มต้นของคุณ (ต้นทาง) สิ่งนี้จะถูกสร้างขึ้นโดยอัตโนมัติเมื่อคุณโคลน repo git fetch origin masterนอกจากนี้คุณยังสามารถอย่างชัดเจน:

จากนั้นใช้บันทึก git เพื่อเปรียบเทียบสาขาปัจจุบันของคุณกับข้อมูลที่เพิ่งดึง ( -pตัวเลือก (สร้างแพทช์) คือสิ่งที่แสดงให้เห็นถึงความแตกต่าง )


14

นี่คือวิธีที่ฉันทำ

#To update your local.
git fetch --all

สิ่งนี้จะดึงข้อมูลทุกอย่างจากระยะไกลดังนั้นเมื่อคุณตรวจสอบความแตกต่างมันจะเปรียบเทียบความแตกต่างกับสาขาระยะไกล

#to list all branches
git branch -a

คำสั่งดังกล่าวจะแสดงสาขาทั้งหมด

#to go to the branch you want to check difference
git checkout <branch_name>
#to check on which branch you are in, use
git branch
    (or)
git status

ตอนนี้คุณสามารถตรวจสอบความแตกต่างได้ดังนี้

git diff origin/<branch_name>

สิ่งนี้จะเปรียบเทียบสาขาในพื้นที่ของคุณกับสาขาระยะไกล


2
git fetch - จะดึงทุกอย่างจากรีโมททั้งหมด การเรียก git ควรเพียงพอหากคุณใช้รีโมทเริ่มต้นเริ่มต้น
Christophe Keller

น่าอัศจรรย์ที่หลังจาก 8 ปีเราได้รับคำตอบที่สมบูรณ์ซึ่งอธิบายขั้นตอนอย่างถูกต้อง เราสามารถทำ - ช่วยเพื่อรับคำสั่ง ดังนั้นเกี่ยวกับการทำความเข้าใจพวกเขา
gdbj

11

ให้สาขาการทำงานของคุณคือการพัฒนาและต้องการแยกความแตกต่างระหว่างสาขาการพัฒนาท้องถิ่นและสาขาการพัฒนาระยะไกลกรณีเช่นนั้นไวยากรณ์ควรเป็นเช่นgit diff remotes/origin/development..development
หรือ

git fetch origin git diff origin/development


11

tl; dr :git diff <local branch> <remote branch>

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

$ git branch -a  # (or git branch --all) 
* my-branch
  master
  remotes/origin/some-branch
  remotes/origin/HEAD -> origin/master
  remotes/origin/my-branch
  remotes/origin/some-other-branch
  remotes/origin/master

นี่ฉันมีสองสาขาในประเทศ ( my-branchและmaster) และ 4 ระยะไกล ( some-branch, some-other-branch, masterและmy-branch)

นอกจากนี้ดอกจันติดกับmy-branchสัญญาณความจริงที่ว่าฉันอยู่ในปัจจุบันในสาขาที่ (คุณจะยังไม่ทราบว่าด้วยการใช้คำสั่งgit statusว่าจะเอาท์พุท: On branch my-branch.)

หมายเหตุ: กิ่งก้านยาวในเปลือกทุบตี git จะแสดงเป็นสีแดงในขณะที่กิ่งท้องถิ่นจะแสดงเป็นสีเขียว

หากคุณต้องการแสดงสาขาระยะไกล :

$ git branch -r # (or git branch --remotes)
  origin/some-branch
  origin/HEAD -> origin/master
  origin/my-branch
  origin/some-other-branch
  origin/master

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

$ git branch
* my-branch 
  master

ในการตรวจสอบตัวเลือกสาขาพื้นฐานให้เสร็จสมบูรณ์--listนั้นตรงกันข้ามกับสิ่งที่คุณคาดหวังว่าจะมีเพื่อให้สามารถกรองได้ ใช้กับรูปแบบเช่นนี้:

$ git branch --list 'my*'
* my-branch

นอกจากนี้คุณยังสามารถรวม--listกับตัวเลือก-aและ-rให้แน่ใจว่าได้ปรับรูปแบบของคุณให้สอดคล้องกัน ( จำไว้ว่า: สาขาระยะไกลเริ่มต้นด้วย "รีโมท" ) ตัวอย่าง:

# this will show all branches (local & remote) that start with my
$ git branch --list 'my*' -a
* my-branch

# better: the pattern includes the remote
$ git branch --list '*my*' -a
* my-branch
  remotes/origin/my-branch

เอกสาร: https://git-scm.com/docs/git-branch

ตอนนี้คุณสามารถเปรียบเทียบสองสาขาจากสาขาที่มีอยู่ทั้งหมด (คุณสามารถเปรียบเทียบสองท้องถิ่นหรือสองรีโมท)

ที่นี่ฉันกำลังเปรียบเทียบโลคัลกับรีโมตmy-branchพวกเขาซิงโครไนซ์ดังนั้นฉันไม่ได้รับผลลัพธ์ใด ๆ :

$ git diff my-branch remotes/origin/my-branch

หมายเหตุ: คุณต้องให้ชื่อเต็มของสาขาที่ไม่มีเครื่องหมายคำพูด

ฉันยังสามารถเปรียบเทียบในท้องถิ่นระยะไกลmy-branch masterที่นี่ฉันได้รับผลลัพธ์บางอย่างเนื่องจากระยะไกลmy-branchไม่ได้ถูกรวมเข้ากับสาขาหลัก

$ git diff my-branch remotes/origin/master
diff --git a/src/controllers/call.controller.js b/src/controllers/call.controller.js
index fd79b98..df3d798 100644
--- a/src/controllers/call.controller.js
+++ b/src/controllers/call.controller.js
@@ -261,7 +261,7 @@ function callController() {
   /*
    *  Function: doCall
[ . . . ]

11

หากคุณต้องการที่จะเห็นความแตกต่างเป็นเพียงแค่ชื่อของไฟล์ที่มีการเปลี่ยนแปลงแล้วใช้งาน:

git diff --name-status <remote-branch> <local-branch>,

อื่นนี้จะแสดงให้เห็นความแตกต่างทั้งหมดระหว่างสองสาขา:

git diff <remote-branch> <local-branch>


9

git pullนี่คือคำตอบที่จดชวเลขถ้าคุณกำลังเปรียบเทียบสาขาปัจจุบันของคุณและเพื่อสิ่งที่คุณต้องการ

git fetch
git diff FETCH_HEAD

คำสั่งแรกจะคิดออกว่าสาขาระยะไกลตรงกับสาขาปัจจุบันของคุณ สิ่งประดิษฐ์ของการคำนวณนั้นในการFETCH_HEADอ้างอิง จากนั้นคำสั่งที่สองใช้การอ้างอิงนั้นเปรียบเทียบกับสิ่งที่สาขาปัจจุบันของคุณมี


6

ฉันรู้ว่ามีคำตอบหลายข้อสำหรับคำถามนี้อยู่แล้ว แต่ฉันได้รับข้อผิดพลาดแปลก ๆ เมื่อพยายามส่วนใหญ่

ในกรณีของฉันฉันมีสองเรียกว่าระยะไกลherokuที่เป็นไม่originและเพราะมันไม่ได้อยู่ในการซิงค์ผมได้รับข้อผิดพลาดนี้เมื่อพยายามที่จะเรียกใช้git diff master heroku/master:

fatal: ambiguous argument 'heroku/master': unknown revision or path not in the working tree.

หรือสิ่งนี้เมื่อลองวิธีอื่นgit diff master..heroku/master:

fatal: bad revision 'master..heroku/master'

การแก้ปัญหาได้กล่าวถึงชื่อระยะไกลอย่างชัดเจนgit fetchก่อนที่จะทำงานgit diffในกรณีของฉัน:

$ git fetch heroku
$ git diff master heroku/master

หวังว่าจะช่วยผู้อื่นด้วยปัญหาเดียวกันนี้


4
git difftool <commit> .

สิ่งนี้จะเปรียบเทียบการกระทำที่คุณต้องการกับไฟล์ในเครื่องของคุณ อย่าลืมจุดในที่สุด (สำหรับท้องถิ่น)

ตัวอย่างเช่นในการเปรียบเทียบไฟล์ในเครื่องของคุณกับการคอมมิท:

git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341

(และคุณไม่จำเป็นต้องดึงข้อมูลคอมไพล์ยกเว้นว่าจำเป็นต้องทำการเปรียบเทียบกับคอมมิทใหม่)


ฉันคิดว่ามอก. นั้นน่าสนใจเพราะเป็นการเปรียบเทียบที่ฉันสามารถทำได้ก่อนที่จะลงมือทำและผลักดัน น่าเสียดายที่ windows vimdiff ที่แสดงน่าเกลียด มีวิธีใดที่จะใช้สิ่งที่ดีกว่าเช่น notepad ++?
Stefano Scarpanti

3

ตัวอย่าง

git diff 'master' 'testlocalBranch'

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

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

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


2
สิ่งนี้เพิ่มอะไรมากกว่าคำตอบที่ยอมรับในอายุ 7.5 ปีที่มี upvotes มากกว่า 170+
Mark Rotteveel

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

2
ในกรณีนั้นควรแสดงความคิดเห็นของคำตอบนั้น
rachit

1

ใน VS 2019 เพียงทำ FETCH อย่าดึงรหัส

นี่คือสิ่งที่ฉันทำ เพิ่มด้านล่างในไฟล์. gitconfig เพื่อให้ฉันสามารถใช้ Beyond Compare

File location: C:\Users\[username]\.gitconfig

เพิ่มด้านล่าง

[diff]
    tool = bc
[difftool "bc"]
    path = c:/Program Files/Beyond Compare 4/bcomp.exe

เปิดพร้อมท์คำสั่งแล้วไปที่ไดเรกทอรีทำงาน ฉันให้ด้านล่างเพื่อเปรียบเทียบสาขา DEV ท้องถิ่นกับสาขา DEV ระยะไกล

git difftool dev origin/dev --dir-diff

สิ่งนี้จะเปิดนอกเหนือจากการเปรียบเทียบและเปิดไดเรกทอรีที่มีไฟล์ที่แตกต่างกัน หากไม่มีการเปลี่ยนแปลงใด ๆ ที่นอกเหนือจากการเปรียบเทียบจะไม่เริ่มต้น


0

ฉันสงสัยว่าจะมีการเปลี่ยนแปลงในสาขาหลักของฉัน...

  1. ประการแรกคุณต้องเปลี่ยนสาขาของคุณ (หากคุณอยู่ภายใต้สาขานี้คุณไม่จำเป็นต้องทำเช่นนี้!)

git หลักการชำระเงิน

  1. คุณสามารถดูว่าไฟล์ใดได้รับการแก้ไขภายใต้สาขาหลักของคุณโดยคำสั่งนี้

สถานะคอมไพล์

  1. รายการสาขา

git branch -a


  • รีโมทหลัก/ แหล่งกำเนิด / ต้นแบบ
  1. ค้นหาความแตกต่าง

git diff origin / master


0

ติดตั้ง

git config alias.udiff 'diff @{u}'

การกระจาย HEAD ด้วย HEAD @ {upstream}

git fetch  # Do this if you want to compare with the network state of upstream; if the current local state is enough, you can skip this
git udiff

การกระจายด้วยสาขาระยะไกลโดยพลการ

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

git branch -r

คุณสามารถดูรีโมตที่กำหนดค่าไว้ทั้งหมดได้ดังต่อไปนี้:

git remote show

คุณสามารถดูการกำหนดค่าสาขา / การติดตามสำหรับรีโมทเดียว (เช่นจุดเริ่มต้น) ดังนี้:

git remote show origin

เมื่อคุณกำหนดสาขาต้นกำเนิดที่เหมาะสมให้ทำ diff ต่าง ๆ แบบปกติ :)

git diff [MY_LOCAL] MY_REMOTE_BRANCH


0

มันค่อนข้างง่าย คุณสามารถใช้ได้:git diff remote/my_topic_branch my_topic_branch

my_topic_branchสาขาหัวข้อของคุณอยู่ที่ไหน


0

สมมติว่าคุณได้ตั้งค่าของคุณoriginเป็นที่เก็บระยะไกลแล้ว จากนั้น

git diff <local branch> <origin>/<remote branch name>


0

ลอง:

git diff origin HEAD

สมมติว่าคุณต้องการกระจายสาขาท้องถิ่นปัจจุบันของคุณHEADกับต้นกำเนิด และสมมติว่าคุณอยู่ในสาขาท้องถิ่น :)


-3

ถ้าคุณใช้TortoiseGit (มันให้ GUI สำหรับ Git) คุณสามารถคลิกขวา Git ของคุณ repo Git Syncโฟลเดอร์แล้วคลิก

คุณสามารถเลือกสาขาของคุณเพื่อเปรียบเทียบถ้าไม่ได้เลือก กว่าที่คุณจะเห็นความแตกต่างกระทำ นอกจากนี้คุณยังสามารถคลิกขวาที่การส่งมอบCompare with previous revisionเพื่อดูความแตกต่างแบบเคียงข้างกันเต่าคอมไพล์ซิงค์เพื่อเปรียบเทียบสาขาระยะไกลและท้องถิ่น

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