อะไรคือความแตกต่างระหว่าง double-dot“ .. ” และ triple-dot“ …” ใน Git ที่มีช่วง?


412

บางคำสั่ง Git ใช้กระทำช่วงหนึ่งและไวยากรณ์ที่ถูกต้องคือการแยกสองกระทำชื่อที่มีจุดสองจุดและไวยากรณ์อื่นใช้จุดสามจุด.....

ความแตกต่างระหว่างสองคืออะไร


คำตอบ:


251

ขึ้นอยู่กับว่าคุณกำลังใช้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


31
มันค่อนข้างไร้สาระที่ความหมายของ..และ...สลับตรงสำหรับ log และ diff: log A..Bเปลี่ยนจากผสานฐานเป็น B ซึ่งเป็นสิ่งที่diff A...Bทำ
phiresky

1
@phiresky ใช่นั่นคือการใช้งานไม่ดีจริงๆ git diffผมขอแนะนำที่จะไม่ใช้เครื่องหมายจุดสำหรับ
wisbucky

2
สิ่งนี้หมายความว่าA...B== A..B + B..A?
Danon

2
@Danon สำหรับgit logสิ่งนี้แน่นอนใช่
maoizm

659

ใช้ช่วง Commit กับบันทึก Git

เมื่อคุณใช้ช่วงคอมมิชชันที่ชอบ..และ...ด้วยgit logความแตกต่างระหว่างพวกมันคือสำหรับสาขา A และ B

git log A..B

จะแสดงให้คุณเห็นถึงความมุ่งมั่นทั้งหมดที่ B ไม่มีที่ Aในขณะนั้น

git log A...B

จะแสดงให้คุณเห็นทั้งข้อผูกพันที่ A มีและ B ไม่มีและการกระทำที่ B ไม่มี A หรือในคำอื่น ๆก็จะกรองการกระทำทั้งหมดที่ทั้ง A และ B ใช้ร่วมกัน ดังนั้นจะแสดงเฉพาะการกระทำที่พวกเขาไม่ได้แบ่งปันกัน

การสร้างภาพด้วย Venn Diagrams & Commit Trees

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

 ไดอะแกรม "git log A..B"ต้นที่ 1

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

 ไดอะแกรม "git log A ... B"ต้นที่ 2

การทำให้ช่วง Commit Triple-Dot ...มีประโยชน์มากขึ้น

คุณสามารถทำให้ช่วงการมอบหมายสามจุด...มีประโยชน์มากขึ้นในคำสั่งบันทึกโดยใช้--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>

ใช้ช่วง Commit กับ Git Diff

สักวันหนึ่งฉันอาจเพิ่มคำอธิบายของตัวเองสำหรับวิธีการทำงานของช่วงคอมมิตgit diffแต่สำหรับตอนนี้คุณอาจต้องการตรวจสอบความแตกต่างระหว่าง double-dot ".. " และ "dot-dot" ... "ใน Git diff commit คืออะไร ช่วง? .

ดูสิ่งนี้ด้วย


35
คำตอบนี้อธิบายความแตกต่างด้วยข้อความตัวอย่างและรูปภาพที่กระชับ ฉันชอบที่ดีกว่าคำตอบที่ได้รับการโหวตสูงสุดในปัจจุบันซึ่งเพิ่งอ้างถึงเอกสารที่ไม่ชัดเจน (tl; dr ขอบคุณคำตอบนี้จริง ๆ แล้วฉันเข้าใจถึงความแตกต่าง)
aerique

4
@Cupcake คุณสามารถเพิ่มความหมายออก ... ใน git diff?
Marius

1
@Marius ที่จริงตอนนี้เมื่อคุณนำมันมาฉันจะไปข้างหน้าและเชื่อมโยงกับคำถามอื่น ๆ ในคำตอบของฉันสำหรับผู้อ่านในอนาคตเช่นตัวคุณเอง

2
สิ่งนี้ตรงกันข้ามหรือไม่ diff diff a..b คือ diffs ทั้งหมดหรือโดยทั่วไปเหมือนกับ git diff a ในขณะที่คอมไพล์แตกต่าง a ... b เป็นการเปลี่ยนแปลงเพียงอย่างเดียวเท่านั้นที่ทำ b นับตั้งแต่การแยกจาก a
wejrowski

2
อย่างน้อยสำหรับบันทึก git สำหรับความแตกต่างของคอมไพล์อาจจะย้อนกลับได้: stackoverflow.com/questions/7251477/ …
Benjamin Atkin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.