ความแตกต่างระหว่าง git remote update และ fetch ใช่ไหม


คำตอบ:


112

อัพเดท: ข้อมูลเพิ่มเติม!

ฉันควรทำสิ่งนี้ตั้งแต่เริ่มต้น: ฉันทำบันทึกประจำรุ่นของ Git ใน Git's repo Git (ดังนั้น meta!)

grep --color=always -R -C30 fetch Documentation/RelNotes/* | less

จากนั้นฉันก็lessทำการค้นหา--allและนี่คือสิ่งที่ฉันพบภายใต้บันทึกย่อประจำรุ่นสำหรับ Git เวอร์ชัน 1.6.6 :

git fetchเรียนรู้--allและ--multipleตัวเลือกต่าง ๆ เพื่อทำการดึงข้อมูลจากที่เก็บข้อมูลจำนวนมากและ--pruneตัวเลือกในการลบสาขาการติดตามระยะไกลที่ค้างอยู่ สิ่งเหล่านี้สร้างgit remote updateและgit remote pruneจำเป็นน้อยกว่า (ไม่มีแผนจะลบremote updateหรือremote pruneแม้กระทั่ง)

เวอร์ชั่น 1.6.6 ยังไม่ออกจนถึงวันที่ 23 ธันวาคม 2552และโปสเตอร์ต้นฉบับถามคำถามของเขาเมื่อวันที่ 6 ธันวาคม 2009

ดังนั้นอย่างที่คุณเห็นจากบันทึกประจำรุ่นผู้แต่งของ Git ทราบถึงความจริงที่ว่าgit remote updateฟังก์ชั่นคำสั่งนั้นทำซ้ำบ้างgit fetchแต่พวกเขาตัดสินใจที่จะไม่ลบมันอาจจะเป็นเพราะความเข้ากันได้ย้อนหลังกับสคริปต์และโปรแกรมที่มีอยู่หรืออาจเป็นเพราะ มันทำงานมากเกินไปและมีรายการที่มีลำดับความสำคัญสูงกว่า


คำตอบเดิมพร้อมรายละเอียดเพิ่มเติม

คำตอบของ xenoterracideอายุ 3.5 ปีในขณะนี้และ Git ได้ผ่านหลายรุ่นตั้งแต่นั้นมา (มันได้จากv1.6.5.5ถึง v1.8.3.2 ตามที่เขียนนี้) และดูที่เอกสารปัจจุบันของgit remote updateและgit fetchดูเหมือนว่า เหมือนกับที่พวกเขาทั้งสองสามารถปฏิบัติหน้าที่ได้เหมือนกันกับการดึงข้อมูลคอมมิทใหม่จากรีโมตหลาย ๆตัวเลือกทางเลือกและอาร์กิวเมนต์ที่ถูกต้อง

กำลังดึงรีโมททั้งหมด

วิธีหนึ่งในการดึงข้อมูลรีโมตหลายตัวใช้--allธง:

git fetch --all

สิ่งนี้จะดึงข้อมูลจากรีโมทที่ตั้งค่าไว้ทั้งหมดของคุณโดยสมมติว่าคุณไม่ได้remote.<name>.skipFetchAllตั้งค่าไว้:

ถ้าเป็นจริงห่างไกลนี้จะถูกข้ามไปโดยปริยายเมื่อปรับปรุงโดยใช้คอมไพล์ดึงข้อมูล (1)หรือ subcommand ปรับปรุงของคอมไพล์ระยะไกล (1) - เอกสาร git-config

นี่จะเทียบเท่ากับการใช้

git remote update

โดยไม่ระบุกลุ่มรีโมตใด ๆ เพื่อดึงข้อมูลและยังไม่ได้remotes.defaultตั้งค่าในการกำหนดค่า repo ของคุณและยังไม่มีการremote.<name>.skipDefaultUpdateตั้งค่ารีโมตของคุณเป็นจริง

ปัจจุบัน 1.8.3.2 เอกสารสำหรับการกำหนดค่าของ Gitไม่ได้พูดถึงremotes.defaultการตั้งค่า แต่ผมปรึกษาผู้ทรงอำนาจของ Google เกี่ยวกับมันและพบคำอธิบายที่เป็นประโยชน์จากMislav Marohnić :

$ git config remotes.default 'origin mislav staging'
$ git remote update

# fetches remotes "origin", "mislav", and "staging"

คุณสามารถกำหนดรายการรีโมตเริ่มต้นที่จะถูกดึงโดยremote updateคำสั่ง เหล่านี้สามารถรีโมทจากเพื่อนร่วมทีมสมาชิกชุมชนที่เชื่อถือได้ของโครงการโอเพนซอร์สหรือคล้ายกัน

ดังนั้นถ้าคุณremotes.defaultตั้งค่าไว้และไม่ใช่รีโมททั้งหมดที่มีอยู่ในรายการคุณgit remote updateจะไม่สามารถดึงข้อมูลรีโมททั้งหมดที่ repo ของคุณ "รู้"

สำหรับการremote.<name>.skipDefaultUpdateตั้งค่าเอกสาร Gitอธิบายได้ดังนี้:

ถ้าเป็นจริงห่างไกลนี้จะถูกข้ามไปโดยปริยายเมื่อปรับปรุงโดยใช้คอมไพล์ดึงข้อมูล (1)หรือ subcommand ปรับปรุงของคอมไพล์ระยะไกล (1)

ดึงกลุ่มรีโมทที่ระบุ

แทนที่จะดึงข้อมูลรีโมตทั้งหมดทั้งสองfetchและremote updateอนุญาตให้คุณระบุรีโมตจำนวนมากและกลุ่มของรีโมตเพื่อดึง:

git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]

git fetch [<options>] <group>ช่วยให้คุณสามารถดึงรีโมตหลายตัวที่เป็นส่วนหนึ่งของกลุ่ม (ยืมตัวอย่างอื่นจากMislav ):

$ git config remotes.mygroup 'remote1 remote2 ...'
$ git fetch mygroup

git fetch --multipleช่วยให้คุณสามารถระบุที่เก็บและกลุ่มที่เก็บหลายแห่งเพื่อดึงในครั้งเดียว (จากเอกสาร ):

อนุญาตให้ระบุ<repository>และ<group>ขัดแย้งกันหลายรายการ ไม่<refspec>sอาจระบุได้

ความคลุมเครือในgit remote updateเอกสาร

บทสรุปสำหรับgit remote updateระบุว่าไวยากรณ์คำสั่งดังต่อไปนี้:

git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…]

ขอให้สังเกตส่วนที่ผ่านมา[(<group> | <remote>)…]? จุดต่อท้าย...บ่งบอกว่าคุณสามารถระบุหลายกลุ่มและรีโมทด้วยคำสั่งซึ่งหมายความว่ามันทำงานในลักษณะเดียวกับgit fetch --multiple... ดูว่าไวยากรณ์ระหว่างทั้งสองมีความคล้ายคลึงกันอย่างไร

อย่างไรก็ตามในเอกสารเดียวกันคำอธิบายสำหรับupdateคำสั่งไม่ได้เกี่ยวกับการระบุหลายกลุ่มและการขัดแย้งระยะไกลเพียงอย่างเดียว

Fetch [e] remotes.<group>การอัปเดตสำหรับชุดที่มีชื่อของรีโมทในพื้นที่เก็บข้อมูลตามที่กำหนดโดย

ดังนั้นจึงไม่มีความชัดเจนหากใช้git remote updateงานได้เหมือนกันgit fetch --multipleกับการระบุรีโมตเดี่ยวและกลุ่มรีโมตหลายกลุ่ม

ดึงรีโมตเดี่ยว

ในที่สุดทุกคนรู้กรณีง่าย ๆ ของการดึงรีโมตเดียว:

git fetch <remote>

อาจเป็นกรณีที่คุณสามารถใช้

git remote update <remote>

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

สรุป

อย่างที่ฉันได้อธิบายไปแล้วgit fetchและมีgit remote updateพฤติกรรมคล้ายกันในการดึงข้อมูลจากรีโมทหลาย ๆ พวกเขาแบ่งปันไวยากรณ์และข้อโต้แย้งที่คล้ายคลึงกันแม้ว่าgit fetchจะสั้นกว่าดังนั้นผู้คนอาจพบว่าพิมพ์และใช้งานได้ง่ายขึ้น

อาจเป็นกรณีที่git remote updateไม่สามารถใช้ดึงรีโมทระยะไกลแบบเดียวได้git fetchแต่อย่างที่ฉันได้ชี้ให้เห็นแล้วเอกสารไม่ได้ทำให้ชัดเจน

นอกเหนือ

ความซ้ำซ้อนในการทำงานระหว่างคำสั่ง Git Porcelain ซึ่งเป็นตัวอย่างที่ดีที่สุดgit fetchและgit remote updateเหนือกว่านั้นไม่ซ้ำกัน ฉันสังเกตเห็นสถานการณ์ที่คล้ายกันกับgit rebase --ontoและgit cherry-pickในการที่ทั้งสองสามารถใช้ช่วงของความมุ่งมั่นที่จะแก้ไขบนฐานกระทำใหม่

ฉันเดาว่าเป็น Git ได้พัฒนากว่าปีที่ผ่านมาการทำงานบางอย่าง (หลีกเลี่ยงไม่ได้?) ซ้ำบางทีบางครั้งก็เป็นความสะดวกสบายสำหรับผู้ใช้ขั้นปลาย (ตัวอย่างเช่นมันง่ายที่จะผ่านช่วงไปcherry-pickกว่าที่จะผ่านเดียวกระทำซ้ำแล้วซ้ำอีก เพื่อเลือกช่วง) เห็นได้ชัดcherry-pickว่าไม่ได้ยอมรับช่วงของการกระทำตามที่อธิบายไว้ในบันทึกประจำรุ่น v1.7.2 :

git cherry-pickเรียนรู้ที่จะเลือกช่วงของการกระทำ (เช่นcherry-pick A..Bและcherry-pick --stdin) ทำเช่นนั้นgit revert; rebase [-i]แม้ว่าสิ่งเหล่านี้จะไม่สนับสนุนการควบคุมการเรียงลำดับที่ดีกว่า


4
FYI: git rebaseเป็นเหมือนmvและgit cherry-pickเป็นเช่นcpนั้น --ontoสวิทช์ไม่ได้เปลี่ยนที่ คุณสามารถรับผลกระทบการคัดลอกได้git rebaseเฉพาะเมื่อคุณระบุค่า SHA1 ไม่เช่นนั้นสาขาของคุณจะถูกย้าย!
Robert Siemer

141

ใช่และไม่. git remote updateดึงข้อมูลจากรีโมททั้งหมดไม่ใช่เพียงหนึ่งไฟล์

โดยไม่ต้องดูรหัสเพื่อดูว่าremote updateเป็นเพียงเชลล์สคริปต์ (เป็นไปได้) โดยทั่วไปแล้วจะทำการดึงข้อมูลสำหรับแต่ละรีโมท git fetchสามารถละเอียดมากขึ้น


3
คุณสามารถกำหนดค่ารีโมตที่จะดึงข้อมูลเมื่อทำงานgit remote updateดู git-remote manpage
Jakub Narębski

อนึ่งgit remoteไม่เชลล์สคริปต์ แต่มัน spawns ในระหว่างการgit fetch remote update
mipadi

1
มีgit fetchตัวเลือกคำสั่งที่เทียบเท่าgit remote updateหรือไม่?
tuler

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