ในคอมไพล์การดึงข้อมูลนั้นแตกต่างจากการดึงและการผสานแตกต่างอย่างไรกับการรีบูต


160

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

  • git fetch เทียบกับ pull
  • คอมไพล์ผสานกับ rebase

24
ฉันเห็นอกเห็นใจกับผู้ถาม เอกสารและคำแนะนำนั้นหนักหนาสาหัสและเป็นไปได้ที่การเปลี่ยนแปลงขั้นตอนการทำงานมีขนาดใหญ่มากจนคนสับสนมาก หัวของพวกเขาเพิ่งจะระเบิดและไม่มีใครรู้ว่าจะถามอะไรมันไม่ชัดเจน
Ed Randall

3
เหตุใดจึงไม่เลือกเพสเทลล่าตอบตามที่ยอมรับ?
Arashsoft

@Arashsoft เพราะเขาไม่เห็นตั้งแต่ปี 2013
VdeX

คำตอบ:


415

ดึงและดึง

fetch จะดาวน์โหลดการเปลี่ยนแปลงใด ๆ จากสาขาระยะไกล * อัปเดตข้อมูลที่เก็บของคุณ แต่จะไม่เปลี่ยนแปลงสาขา * ในเครื่องของคุณ

pullจะดำเนินการfetchและเพิ่มเติมmergeการเปลี่ยนแปลงในสาขาท้องถิ่นของคุณ

ความแตกต่างคืออะไร? pullอัพเดตสาขาท้องถิ่นของคุณด้วยการเปลี่ยนแปลงจากสาขาที่ดึง fetchไม่ก้าวหน้าสาขาในประเทศของคุณ

ผสาน vs rebase

รับประวัติศาสตร์ต่อไปนี้:

          C --- D --- E ในพื้นที่
         /
    A --- B --- F --- G ระยะไกล

mergeรวมสองประวัติการพัฒนาเข้าด้วยกัน มันเป็นเช่นนี้โดยการเล่นซ้ำการเปลี่ยนแปลงที่เกิดขึ้นในสาขาท้องถิ่นของคุณหลังจากที่มันถูกแยกออกจากด้านบนของสาขาระยะไกลและบันทึกผลในการกระทำใหม่ การดำเนินการนี้รักษาบรรพบุรุษของแต่ละการกระทำ

ผลของ a mergeจะเป็น:

          C --- D --- E ในพื้นที่
         / \
    A --- B --- F --- G --- H ระยะไกล

rebaseจะรับภาระที่มีอยู่ในสาขาในพื้นที่ของคุณและนำไปใช้อีกครั้งที่ด้านบนของสาขาระยะไกล การดำเนินการนี้เขียนบรรพบุรุษของการกระทำในพื้นที่ของคุณอีกครั้ง

ผลของ a rebaseจะเป็น:

                  C '- D' - E 'ในพื้นที่
                 /
    A --- B --- F --- G ระยะไกล

ความแตกต่างคืออะไร? A mergeไม่เปลี่ยนบรรพบุรุษของการผูกมัด rebase ปรับเปลี่ยนบรรพบุรุษของกระทำท้องถิ่นของคุณ

*คำอธิบายนี้อนุมานว่าสาขาในปัจจุบันเป็นสาขาในประเทศและที่สาขาที่ระบุไว้เป็นอาร์กิวเมนต์เพื่อfetch, pull, mergeหรือrebaseเป็นสาขาที่ห่างไกล นี่เป็นกรณีปกติ pullตัวอย่างเช่นจะดาวน์โหลดการเปลี่ยนแปลงใด ๆ จากสาขาที่ระบุอัปเดตที่เก็บของคุณและmergeการเปลี่ยนแปลงในสาขาปัจจุบัน


31
นี่คือคำอธิบายที่ง่ายที่สุดและดีที่สุดโดยไม่ต้องเข้าร่วมการอภิปรายเบื้องหลังการฝึกฝนแต่ละครั้ง ขอบคุณ!
Jonathan S. Fisher

3
คำตอบทองคำอย่างแน่นอน
ChaseMoskal

5
หวังว่าฉันจะ "ชื่นชอบ" คำตอบนี้ บางทีฉันอาจจะพิมพ์มันและแปะลงบนกำแพง
LarsH

2
ฉันจะบอกคำตอบที่ดีที่สุดที่ฉันมีใน stackoverflow ขอบคุณ
Shahab J

1
หากการดึงข้อมูลดาวน์โหลดเฉพาะการเปลี่ยนแปลงจากสาขาระยะไกลและอัปเดตข้อมูลที่เก็บ แต่ปล่อยให้สาขาในท้องถิ่นไม่เปลี่ยนแปลงดังนั้นสิ่งที่เป็นจุดของการดึงข้อมูลถ้าไดเรกทอรีการทำงานไม่แสดง / สะท้อนการเปลี่ยนแปลง? แต่เดิมคำถามของฉันคือฉันจะเห็นการเปลี่ยนแปลงที่คนอื่นทำไปแล้วได้หรือไม่และตัดสินใจว่าฉันจะรวมพวกเขาไว้ในไดเรกทอรีการทำงานของฉันหรือไม่ (เช่นการทดสอบกับการเปลี่ยนแปลงของคนอื่น ๆ เพื่อให้แน่ใจว่า สับสนว่าจะทำอย่างไร ฉันควรแค่ pul และทดลอง / สำรวจและหากเป็นปัญหาให้ทำการรีเซ็ตแบบยากหรือไม่

28

ดึงและดึง

Git fetch เพียงแค่อัปเดตข้อมูล repo ของคุณ แต่โดยทั่วไป git pull จะทำการดึงข้อมูลและจากนั้นทำการรวมการดึง branch

อะไรคือความแตกต่างระหว่าง 'git pull' และ 'git fetch'?


ผสาน vs Rebase

จากบล็อก Atlassian SourceTree, ผสานหรือ rebase :

การผสานนำการพัฒนาสองบรรทัดมารวมกันในขณะที่รักษาบรรพบุรุษของแต่ละประวัติศาสตร์ที่กระทำ

ในทางกลับกันการรีบูตเป็นการรวมบรรทัดของการพัฒนาโดยการเขียนการเปลี่ยนแปลงใหม่จากสาขาต้นทางเพื่อให้พวกเขาปรากฏเป็นลูกของสาขาปลายทางได้อย่างมีประสิทธิภาพโดยแกล้งทำเป็นว่าคอมมิทเหล่านั้นถูกเขียนไว้ด้านบนของสาขาปลายทางตลอด

นอกจากนี้ลองดูLearn Git Branchingซึ่งเป็นเกมที่ยอดเยี่ยมที่เพิ่งโพสต์ไปที่ HackerNews ( ลิงก์ไปยังโพสต์ ) และสอนเทคนิคการแยกย่อยและการรวมเข้าด้วยกันมากมาย ฉันเชื่อว่ามันจะมีประโยชน์มากในเรื่องนี้


ขอบคุณ Felips .. ดังนั้นถ้าฉันดึงข้อมูลจากระยะไกลสาขาหลักของฉันจะไม่มีการปรับปรุงหรือไม่ นอกจากนี้ดูเหมือนว่าฉันควรจะทำการรีบูทมากกว่าเดิมแล้วผสาน
techsjs2013

rebase vs merge นั้นขึ้นอยู่กับความตั้งใจของคุณโดยคำนึงถึงว่า rebase จะเขียนประวัติการกระทำทั้งหมด และใช่ถ้าคุณเรียกเท่านั้นสาขาหลักจะไม่เปลี่ยนแปลงคุณจะต้องรวม (หรือดึง) เพื่อใช้การเปลี่ยนแปลงระยะไกล
เฟลิเป้ซาบิโน

git merge <remote>/<branch>. git merge origin/masterตัวอย่างเช่นถ้าคุณเป็นสาขาหลักและระยะไกลของคุณเป็นชื่อแหล่งกำเนิดที่คุณสามารถทำได้
เฟลิเป้ซาบิโน

ดังนั้นดูเหมือนว่าฉันควรจะทำการตรวจสอบหลัก git fetch git diff origin / master git rebase ต้นกำเนิด master
techsjs2013

8

ดึง vs fetch :

วิธีที่ผมเข้าใจในเรื่องนี้ก็คือว่าgit pullเป็นเพียงตามมาด้วยgit fetch git mergeคือคุณดึงข้อมูลการเปลี่ยนแปลงจากสาขาระยะไกลแล้วรวมเข้ากับสาขาปัจจุบัน


ผสานกับการรีบูต :

การผสานจะทำตามคำสั่งที่พูด ผสานความแตกต่างระหว่างสาขาปัจจุบันและสาขาที่ระบุ (ลงในสาขาปัจจุบัน) เช่นคำสั่งgit merge another_branchจะรวมanother_branchเข้าไปในสาขาปัจจุบัน

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

อย่างไรก็ตามมันไม่ได้เป็นไปโดยไม่ผิดพลาด! เนื่องจากประวัติรุ่นเป็น "เขียนใหม่" คุณควรทำสิ่งนี้เฉพาะเมื่อคอมมิชชันมีอยู่ใน repo git ในพื้นที่ของคุณเท่านั้น นั่นคือ: อย่าทำเช่นนี้หากคุณผลักภาระผูกพันไปยัง repo ระยะไกล

คำอธิบายเกี่ยวกับการได้รับใน rebasing นี้หนังสือออนไลน์เป็นสิ่งที่ดีมากกับที่ง่ายต่อการเข้าใจภาพประกอบ


ดึงด้วยการรีบูตแทนที่จะรวม

จริงๆแล้วฉันใช้ rebase ค่อนข้างมาก แต่โดยปกติแล้วมันจะใช้ร่วมกับ pull:

git pull --rebase

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


ดังนั้นถ้าฉันทำงานและสาขาและฉันต้องการที่จะรวมมันกลับเข้าที่หลักก่อนที่ฉันจะผลักดัน ฉันควรจะชำระเงินหลักแล้วจะได้รับการแก้ไข rebase?
techsjs2013

ฉันยังคงไม่ได้อยู่ภายใต้สถานะผสานรวมกับการ
รีบูต

ฉันคิดว่าภาพประกอบที่ได้จากคำตอบของเพสตาเรลล่านั้นแสดงให้เห็นถึงความแตกต่างอย่างชัดเจน นอกจากนี้ให้ตรวจสอบ: git-scm.com/book/en/Git-Branching-Rebasing - ซึ่งเป็นงานที่ค่อนข้างดีในการอธิบาย (ลิงค์เดียวกับคำตอบ แต่ให้อีกครั้งสำหรับคนขี้เกียจ)
Steinar

0

ผสาน - หัวหน้าสาขาจะสร้างการกระทำใหม่รักษาบรรพบุรุษของประวัติศาสตร์การกระทำแต่ละครั้ง ประวัติศาสตร์อาจกลายเป็นมลภาวะถ้าการรวมกลุ่มกระทำโดยคนหลายคนที่ทำงานในสาขาเดียวกันพร้อมกัน

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

ฉันจะใช้git mergeเมื่อจัดการกับเวิร์กโฟลว์ตามคุณลักษณะหรือหากฉันไม่คุ้นเคยกับการรีบูต แต่ถ้าฉันต้องการประวัติเชิงเส้นที่สะอาดgit rebaseมากกว่านี้ก็เหมาะสมกว่า สำหรับรายละเอียดเพิ่มเติมให้แน่ใจว่าได้ตรวจสอบการผสานหรือ rebase บทความนี้

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