บางคำสั่ง Git ใช้กระทำช่วงหนึ่งและไวยากรณ์ที่ถูกต้องคือการแยกสองกระทำชื่อที่มีจุดสองจุดและไวยากรณ์อื่นใช้จุดสามจุด.....
ความแตกต่างระหว่างสองคืออะไร
บางคำสั่ง Git ใช้กระทำช่วงหนึ่งและไวยากรณ์ที่ถูกต้องคือการแยกสองกระทำชื่อที่มีจุดสองจุดและไวยากรณ์อื่นใช้จุดสามจุด.....
ความแตกต่างระหว่างสองคืออะไร
คำตอบ:
ขึ้นอยู่กับว่าคุณกำลังใช้logคำสั่งหรือdiffคำสั่ง ในlogกรณีที่อยู่ในman git-rev-parseเอกสารประกอบ:
ในการแยกการคอมมิทที่เข้าถึงได้จากการคอมมิตจะมีการใช้เครื่องหมายคำนำหน้า ^ เช่น ^ r1 r2 หมายถึงกระทำการเข้าถึงได้จาก r2 แต่ไม่รวมสิ่งที่เข้าถึงได้จาก r1
การดำเนินการของชุดนี้ปรากฏขึ้นบ่อยครั้งจนมีชวเลข เมื่อคุณมีสองคอมมิท r1 และ r2 (ตั้งชื่อตามซินดิเคทที่อธิบายไว้ใน REVISIONS REVISIONS ด้านบน) คุณสามารถขอคอมมิทที่เข้าถึงได้จาก r2 ยกเว้นที่สามารถเข้าถึงได้จาก r1 โดย "^ r1 r2" และสามารถเขียนเป็น "r1..r2"
สัญกรณ์ที่คล้ายกัน "r1 ... r2" เรียกว่าความแตกต่างสมมาตรของ r1 และ r2 และถูกกำหนดเป็น "r1 r2 - ไม่ $ (git ผสานฐาน - ทั้งหมด r1 r2)" มันเป็นชุดของการกระทำที่สามารถเข้าถึงได้จากอย่างใดอย่างหนึ่งของ r1 หรือ r2 แต่ไม่ได้มาจากทั้งสอง
ซึ่งโดยทั่วไปหมายความว่าคุณจะได้รับการกระทำทั้งหมดที่อยู่ในทั้งสองสาขา แต่ไม่ใช่ในทั้งสอง
ในdiffกรณีที่อยู่ในman git-diffเอกสารประกอบ:
git diff [--options] <commit>...<commit> [--] [<path>...] This form is to view the changes on the branch containing and up to the second <commit>, starting at a common ancestor of both <commit>. "git diff A...B" is equivalent to "git diff $(git-merge-base A B) B". You can omit any one of <commit>, which has the same effect as using HEAD instead.
ซึ่งค่อนข้างเลือน โดยทั่วไปหมายถึงมันแสดงให้เห็นถึงความแตกต่างในสาขานั้นเมื่อเปรียบเทียบกับสาขาอื่น: มันจะมองหาคอมมิชชันล่าสุดที่มีคอมมิชชันแรกที่คุณให้ไว้และจากนั้นก็คอมมิชชันที่สองที่แตกต่าง เป็นวิธีง่ายๆในการดูว่ามีการเปลี่ยนแปลงอะไรในสาขานั้นเปรียบเทียบกับสาขานี้โดยไม่ต้องแจ้งให้ทราบการเปลี่ยนแปลงในสาขานี้เท่านั้น
สิ่งที่..ค่อนข้างง่ายกว่า: ในgit-diffกรณีนี้มันเหมือนกับ a git diff A Bและเพิ่งแตกต่างกับ A ในlogกรณีที่มันแสดงการกระทำทั้งหมดที่อยู่ใน B แต่ไม่ใช่ใน A
..และ...สลับตรงสำหรับ log และ diff: log A..Bเปลี่ยนจากผสานฐานเป็น B ซึ่งเป็นสิ่งที่diff A...Bทำ
git diffผมขอแนะนำที่จะไม่ใช้เครื่องหมายจุดสำหรับ
A...B== A..B + B..A?
git logสิ่งนี้แน่นอนใช่
เมื่อคุณใช้ช่วงคอมมิชชันที่ชอบ..และ...ด้วยgit logความแตกต่างระหว่างพวกมันคือสำหรับสาขา A และ B
git log A..B
จะแสดงให้คุณเห็นถึงความมุ่งมั่นทั้งหมดที่ B ไม่มีที่ Aในขณะนั้น
git log A...B
จะแสดงให้คุณเห็นทั้งข้อผูกพันที่ A มีและ B ไม่มีและการกระทำที่ B ไม่มี A หรือในคำอื่น ๆก็จะกรองการกระทำทั้งหมดที่ทั้ง A และ B ใช้ร่วมกัน ดังนั้นจะแสดงเฉพาะการกระทำที่พวกเขาไม่ได้แบ่งปันกัน
git log A..Bนี่คือการแสดงออกของ คอมมิชชันที่สาขา B มีที่ไม่มีอยู่ใน A คือสิ่งที่ถูกส่งคืนโดยช่วงการส่งข้อมูลและถูกไฮไลต์ด้วยสีแดงในแผนภาพ Venn และวงกลมสีน้ำเงินในแผนผังการส่งข้อมูล:


git log A...Bเหล่านี้เป็นแผนภาพสำหรับ โปรดสังเกตว่าคำสั่งที่แบ่งใช้โดยสาขาทั้งสองจะไม่ถูกส่งคืนโดยคำสั่ง:


...มีประโยชน์มากขึ้นคุณสามารถทำให้ช่วงการมอบหมายสามจุด...มีประโยชน์มากขึ้นในคำสั่งบันทึกโดยใช้--left-rightตัวเลือกเพื่อแสดงการกระทำที่เป็นของสาขาใด:
$ git log --oneline --decorate --left-right --graph master...origin/master
< 1794bee (HEAD, master) Derp some more
> 6e6ce69 (origin/master, origin/HEAD) Add hello.txt
ในการส่งออกดังกล่าวข้างต้นคุณจะเห็นกระทำที่เป็นmasterจะมีคำนำหน้า<ในขณะที่กระทำที่เป็นจะมีคำนำหน้าorigin/master>
สักวันหนึ่งฉันอาจเพิ่มคำอธิบายของตัวเองสำหรับวิธีการทำงานของช่วงคอมมิตgit diffแต่สำหรับตอนนี้คุณอาจต้องการตรวจสอบความแตกต่างระหว่าง double-dot ".. " และ "dot-dot" ... "ใน Git diff commit คืออะไร ช่วง? .