ฉันจะดูdiffระหว่างสาขาในพื้นที่และสาขาระยะไกลได้อย่างไร
git diff HEAD origin/HEADซึ่งดูเหมือนจะชี้ไปที่สาขาระยะไกลที่แตกต่างจากที่ฉันตั้งใจไว้ ใช้ชื่อสาขาเต็มทำงานตามที่คาดไว้
ฉันจะดูdiffระหว่างสาขาในพื้นที่และสาขาระยะไกลได้อย่างไร
git diff HEAD origin/HEADซึ่งดูเหมือนจะชี้ไปที่สาขาระยะไกลที่แตกต่างจากที่ฉันตั้งใจไว้ ใช้ชื่อสาขาเต็มทำงานตามที่คาดไว้
คำตอบ:
หากต้องการอัปเดตสาขาติดตามระยะไกลคุณต้องพิมพ์git fetchก่อนแล้วจึง:
git diff <masterbranch_path> <remotebranch_path>
คุณสามารถgit branch -aแสดงรายการทุกสาขา (ภายในและระยะไกล) จากนั้นเลือกชื่อสาขาจากรายการ (เพียงลบremotes/จากชื่อสาขาระยะไกล
ตัวอย่าง: git diff master origin/master(โดยที่ "master" เป็นสาขาหลักของท้องถิ่นและ "origin / master" เป็นรีโมตนั่นคือ Origin และ Branch Master)
git fetch)
[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 นั้นถูกต้อง
git diff <local branch> <remote>/<remote branch>
ตัวอย่างเช่นgit diff master origin/masterหรือgit diff featureA origin/next
แน่นอนว่าต้องมีสาขาการติดตามระยะไกลที่คุณต้องการgit fetchก่อน และคุณต้องการให้มีข้อมูลล่าสุดเกี่ยวกับสาขาในที่เก็บระยะไกล
git diff <remote>/<remote branch> <local branch>เพื่อดูสิ่งที่ผลักดันของฉันจะทำกับ repo ระยะไกล
git diff originนั้นก็เพียงพอแล้วถ้าคุณเพิ่งเปรียบเทียบกับสาขาต้นน้ำของคุณ
git fetchที่จุดเริ่มต้นมันทำให้เกิดปัญหากับมือใหม่อย่างฉัน
git diff <remote>/<remote branch> <local branch>เหรอ? มิฉะนั้นฉันได้รับการเพิ่มและลบเปิดเครื่องคอมพิวเตอร์ของฉัน (รุ่น git 2.7.0.windows.2)
ประเภทแรก
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
...มากกว่า..หรือไม่
git log origin/my_branch..ซึ่งจะใช้HEADเป็นอ้างอิงในท้องถิ่นซึ่งส่วนใหญ่เป็นสิ่งที่คุณหมายถึง
fatal: bad revision fatal: ambiguous argumentทั้งหมดที่ฉันต้องการคือการเห็นความแตกต่างในไฟล์เดียวกันจากสาขาอื่นนั่นคือสิ่งที่มากเกินไปที่จะถาม? ใช่มันเป็น :-) ใช้git diff remotes/origin/<base branch> <current branch> -- <filename>งานได้ดีกับคอมไพล์ 1.8.3.1
หากคุณอยู่ในสาขาที่กำหนดและคุณต้องการเปรียบเทียบกับสาขาต้นน้ำที่คุณกำลังติดตามใช้
git diff @{upstream}
หากอัพสตรีมของคุณไม่ได้ถูกตั้งค่า (โดยทั่วไปจะเป็นกรณีนี้ขอบคุณArijoonในความคิดเห็น)
git diff @{push}
ด้วยความช่วยเหลือของคำตอบนี้เอกสารประกอบการคอมไพล์สำหรับการระบุการแก้ไขมี:
<branchname>@{upstream}เช่นmaster@{upstream},@{u}
ต่อท้าย@{upstream}ไป BRANCHNAME (แบบสั้น<branchname>@{u}) หมายถึงสาขาที่สาขาที่ระบุโดยbranchnameการตั้งค่าเพื่อสร้างด้านบนของ (กำหนดค่าด้วยbranch.<name>.remoteและbranch.<name>.merge)branchnameค่าเริ่มต้นที่ขาดหายไปเป็นปัจจุบัน
git diff @ @{upstream}เปลี่ยนเส้น สิ่งที่เพิ่มขึ้น@คือHEADสิ่งที่คุณเป็นอยู่ในขณะนี้ดังนั้นคุณกำลังเปรียบเทียบHEADกับต้นน้ำที่สาขาของคุณกำลังติดตาม คุณสามารถใช้@{push}แทน
fatal: ambiguous argument '@upstream': unknown revision or path not in the working tree. ต้องใช้git diff @\{upstream\}แทน 😥
git fetchก่อนอื่นไม่ทำอะไรเลยไม่แสดงผลลัพธ์ ทดสอบโดยการลบไฟล์ใน repo origin และรันคำสั่งนี้แบบโลคัล .. ทำงานเฉพาะหลังจากดึงข้อมูล
ฉันเข้าใจผลลัพธ์ของ:
git diff <remote-tracking branch> <local branch>
ที่แสดงให้ฉันเห็นสิ่งที่จะถูกทิ้งและสิ่งที่จะเพิ่มถ้าฉันผลักสาขาท้องถิ่น แน่นอนมันเหมือนกันเพียงตรงกันข้าม แต่สำหรับฉันอ่านได้ง่ายขึ้นและฉันรู้สึกสบายใจมากขึ้นในการดูว่าจะเกิดอะไรขึ้น
วิธีง่าย ๆ :
git fetch
git log -p HEAD..FETCH_HEAD
สิ่งนี้จะดึงการเปลี่ยนแปลงจากรีโมตเริ่มต้นของคุณ (ต้นทาง) สิ่งนี้จะถูกสร้างขึ้นโดยอัตโนมัติเมื่อคุณโคลน repo git fetch origin masterนอกจากนี้คุณยังสามารถอย่างชัดเจน:
จากนั้นใช้บันทึก git เพื่อเปรียบเทียบสาขาปัจจุบันของคุณกับข้อมูลที่เพิ่งดึง ( -pตัวเลือก (สร้างแพทช์) คือสิ่งที่แสดงให้เห็นถึงความแตกต่าง )
นี่คือวิธีที่ฉันทำ
#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>
สิ่งนี้จะเปรียบเทียบสาขาในพื้นที่ของคุณกับสาขาระยะไกล
ให้สาขาการทำงานของคุณคือการพัฒนาและต้องการแยกความแตกต่างระหว่างสาขาการพัฒนาท้องถิ่นและสาขาการพัฒนาระยะไกลกรณีเช่นนั้นไวยากรณ์ควรเป็นเช่นgit diff remotes/origin/development..development
หรือ
git fetch origin
git diff origin/development
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
[ . . . ]
หากคุณต้องการที่จะเห็นความแตกต่างเป็นเพียงแค่ชื่อของไฟล์ที่มีการเปลี่ยนแปลงแล้วใช้งาน:
git diff --name-status <remote-branch> <local-branch>,
อื่นนี้จะแสดงให้เห็นความแตกต่างทั้งหมดระหว่างสองสาขา:
git diff <remote-branch> <local-branch>
git pullนี่คือคำตอบที่จดชวเลขถ้าคุณกำลังเปรียบเทียบสาขาปัจจุบันของคุณและเพื่อสิ่งที่คุณต้องการ
git fetch
git diff FETCH_HEAD
คำสั่งแรกจะคิดออกว่าสาขาระยะไกลตรงกับสาขาปัจจุบันของคุณ สิ่งประดิษฐ์ของการคำนวณนั้นในการFETCH_HEADอ้างอิง จากนั้นคำสั่งที่สองใช้การอ้างอิงนั้นเปรียบเทียบกับสิ่งที่สาขาปัจจุบันของคุณมี
ฉันรู้ว่ามีคำตอบหลายข้อสำหรับคำถามนี้อยู่แล้ว แต่ฉันได้รับข้อผิดพลาดแปลก ๆ เมื่อพยายามส่วนใหญ่
ในกรณีของฉันฉันมีสองเรียกว่าระยะไกล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
หวังว่าจะช่วยผู้อื่นด้วยปัญหาเดียวกันนี้
git difftool <commit> .
สิ่งนี้จะเปรียบเทียบการกระทำที่คุณต้องการกับไฟล์ในเครื่องของคุณ อย่าลืมจุดในที่สุด (สำหรับท้องถิ่น)
ตัวอย่างเช่นในการเปรียบเทียบไฟล์ในเครื่องของคุณกับการคอมมิท:
git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341
(และคุณไม่จำเป็นต้องดึงข้อมูลคอมไพล์ยกเว้นว่าจำเป็นต้องทำการเปรียบเทียบกับคอมมิทใหม่)
ตัวอย่าง
git diff 'master' 'testlocalBranch'
หากคุณกำลังใช้โปรแกรมแก้ไขเช่น webstorm คุณสามารถคลิกขวาที่ไฟล์เลือกเปรียบเทียบกับสาขาและพิมพ์ / เลือกสาขาของคุณ
ใน 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
สิ่งนี้จะเปิดนอกเหนือจากการเปรียบเทียบและเปิดไดเรกทอรีที่มีไฟล์ที่แตกต่างกัน หากไม่มีการเปลี่ยนแปลงใด ๆ ที่นอกเหนือจากการเปรียบเทียบจะไม่เริ่มต้น
ฉันสงสัยว่าจะมีการเปลี่ยนแปลงในสาขาหลักของฉัน...
git หลักการชำระเงิน
สถานะคอมไพล์
git branch -a
รีโมทหลัก/ แหล่งกำเนิด / ต้นแบบ
git diff origin / master
git config alias.udiff 'diff @{u}'
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
มันค่อนข้างง่าย คุณสามารถใช้ได้:git diff remote/my_topic_branch my_topic_branch
my_topic_branchสาขาหัวข้อของคุณอยู่ที่ไหน
สมมติว่าคุณได้ตั้งค่าของคุณoriginเป็นที่เก็บระยะไกลแล้ว จากนั้น
git diff <local branch> <origin>/<remote branch name>
ลอง:
git diff origin HEAD
สมมติว่าคุณต้องการกระจายสาขาท้องถิ่นปัจจุบันของคุณHEADกับต้นกำเนิด และสมมติว่าคุณอยู่ในสาขาท้องถิ่น :)
ถ้าคุณใช้TortoiseGit (มันให้ GUI สำหรับ Git) คุณสามารถคลิกขวา Git ของคุณ repo Git Syncโฟลเดอร์แล้วคลิก
คุณสามารถเลือกสาขาของคุณเพื่อเปรียบเทียบถ้าไม่ได้เลือก กว่าที่คุณจะเห็นความแตกต่างกระทำ นอกจากนี้คุณยังสามารถคลิกขวาที่การส่งมอบCompare with previous revisionเพื่อดูความแตกต่างแบบเคียงข้างกัน