ฉันแค่ไม่เข้าใจสิ่งนี้ ฉันอ่านเว็บและหนังสือมากมายและบางสิ่งก็ไม่ได้อยู่ในหัวของฉัน ใครช่วยได้โปรดให้หุ่นจำลองต่อไปนี้กับฉัน:
- git fetch เทียบกับ pull
- คอมไพล์ผสานกับ rebase
ฉันแค่ไม่เข้าใจสิ่งนี้ ฉันอ่านเว็บและหนังสือมากมายและบางสิ่งก็ไม่ได้อยู่ในหัวของฉัน ใครช่วยได้โปรดให้หุ่นจำลองต่อไปนี้กับฉัน:
คำตอบ:
fetch จะดาวน์โหลดการเปลี่ยนแปลงใด ๆ จากสาขาระยะไกล * อัปเดตข้อมูลที่เก็บของคุณ แต่จะไม่เปลี่ยนแปลงสาขา * ในเครื่องของคุณ
pullจะดำเนินการfetchและเพิ่มเติมmergeการเปลี่ยนแปลงในสาขาท้องถิ่นของคุณ
ความแตกต่างคืออะไร? pullอัพเดตสาขาท้องถิ่นของคุณด้วยการเปลี่ยนแปลงจากสาขาที่ดึง fetchไม่ก้าวหน้าสาขาในประเทศของคุณ
รับประวัติศาสตร์ต่อไปนี้:
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การเปลี่ยนแปลงในสาขาปัจจุบัน
ดึงและดึง
Git fetch เพียงแค่อัปเดตข้อมูล repo ของคุณ แต่โดยทั่วไป git pull จะทำการดึงข้อมูลและจากนั้นทำการรวมการดึง branch
อะไรคือความแตกต่างระหว่าง 'git pull' และ 'git fetch'?
ผสาน vs Rebase
จากบล็อก Atlassian SourceTree, ผสานหรือ rebase :
การผสานนำการพัฒนาสองบรรทัดมารวมกันในขณะที่รักษาบรรพบุรุษของแต่ละประวัติศาสตร์ที่กระทำ
ในทางกลับกันการรีบูตเป็นการรวมบรรทัดของการพัฒนาโดยการเขียนการเปลี่ยนแปลงใหม่จากสาขาต้นทางเพื่อให้พวกเขาปรากฏเป็นลูกของสาขาปลายทางได้อย่างมีประสิทธิภาพโดยแกล้งทำเป็นว่าคอมมิทเหล่านั้นถูกเขียนไว้ด้านบนของสาขาปลายทางตลอด
นอกจากนี้ลองดูLearn Git Branchingซึ่งเป็นเกมที่ยอดเยี่ยมที่เพิ่งโพสต์ไปที่ HackerNews ( ลิงก์ไปยังโพสต์ ) และสอนเทคนิคการแยกย่อยและการรวมเข้าด้วยกันมากมาย ฉันเชื่อว่ามันจะมีประโยชน์มากในเรื่องนี้
git merge <remote>/<branch>. git merge origin/masterตัวอย่างเช่นถ้าคุณเป็นสาขาหลักและระยะไกลของคุณเป็นชื่อแหล่งกำเนิดที่คุณสามารถทำได้
ดึง 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 - เขียนการเปลี่ยนแปลงของสาขาหนึ่งไปยังอีกสาขาหนึ่งโดยไม่ต้องสร้างการคอมมิทใหม่ ประวัติรหัสนั้นง่ายขึ้นเป็นเส้นตรงและอ่านได้ แต่ไม่สามารถใช้กับคำขอดึงได้เนื่องจากคุณไม่สามารถเห็นสิ่งที่เปลี่ยนแปลงเล็กน้อยที่เกิดขึ้น
ฉันจะใช้git mergeเมื่อจัดการกับเวิร์กโฟลว์ตามคุณลักษณะหรือหากฉันไม่คุ้นเคยกับการรีบูต แต่ถ้าฉันต้องการประวัติเชิงเส้นที่สะอาดgit rebaseมากกว่านี้ก็เหมาะสมกว่า สำหรับรายละเอียดเพิ่มเติมให้แน่ใจว่าได้ตรวจสอบการผสานหรือ rebase บทความนี้