git pull VS VS git fetch Vs git rebase


294

คำถามก็กล่าวว่าgit pullเป็นเหมือน+git fetchgit merge

แต่อะไรคือความแตกต่างระหว่างgit pullVS git fetch+ git rebase?


2
บางคนควรทำความสะอาดลิงก์ ... และฉันประหลาดใจที่มีคนโหวตให้คำถามอื่น ๆ อีกกี่คน
xenoterracide

13
@xeno: ผมคิดว่าเป็นเพียงแค่การนับจำนวนของวิธีการที่หลายคนไป "ผมมีคำถามนี้เกินไป"
bobobobo

45
บางวันฉันจะหาเวลาอ่านเอกสารคอมไพล์จริง ๆ แต่จนถึงตอนนี้ฉันจะเพิ่มคะแนนโหวตให้กับคำถามประเภทนี้
Eran Medan

คำตอบ:


336

มันควรจะเห็นได้ชัดสวยจากคำถามของคุณที่คุณจริงเพียงแค่ถามเกี่ยวกับความแตกต่างระหว่างและgit mergegit rebase

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

- o - o - o - H - A - B - C (master)
               \
                P - Q - R (origin/master)

หากคุณรวมที่จุดนี้ (พฤติกรรมเริ่มต้นของการดึง git) โดยสมมติว่าไม่มีข้อขัดแย้งใด ๆ คุณจะพบกับสิ่งนี้:

- o - o - o - H - A - B - C - X (master)
               \             /
                P - Q - R --- (origin/master)

หากในอีกทางหนึ่งคุณได้ทำการ rebase ที่เหมาะสมคุณจะได้รับสิ่งนี้:

- o - o - o - H - P - Q - R - A' - B' - C' (master)
                          |
                          (origin/master)

เนื้อหาของแผนผังการทำงานของคุณควรจะเหมือนกันทั้งสองกรณี คุณเพิ่งสร้างประวัติศาสตร์ที่แตกต่างกันนำขึ้นไป การปฏิเสธจะเขียนประวัติของคุณใหม่ทำให้ดูเหมือนว่าคุณได้ทำสัญญากับสาขาต้นแบบใหม่ของต้นกำเนิด ( R) แทนที่จะเป็นที่ที่คุณส่งมอบ แต่เดิม ( H) คุณไม่ควรใช้วิธีการคืนเงินหากมีคนดึงข้อมูลจากสาขาหลักของคุณแล้ว

สุดท้ายโปรดทราบว่าคุณสามารถตั้งค่าจริงgit pullสำหรับสาขาที่กำหนดให้ใช้ rebase แทนการรวมโดยการตั้งค่าพารามิเตอร์ config branch.<name>.rebaseเป็นจริง git pull --rebaseนอกจากนี้คุณยังสามารถทำเช่นนี้เพื่อดึงเดียวโดยใช้


39
จะเกิดอะไรขึ้นถ้าคุณต้องลดระดับใหม่หลังจากมีคนถอนตัวจากสาขาหลักของคุณไปแล้ว? นั่นจะทำลาย repo หรือไม่?
Didier A.

12
คุณจะรู้ได้อย่างไรว่ามีคนถอนตัวจากสาขาหลักของคุณ
แฟรงค์

29
หากคุณไม่แน่ใจว่ามีใครบางคนไม่ได้คุณควรถือว่าพวกเขามี
Chris Down

4
ฉันแค่คิดว่าเว้นแต่คุณจะผลักดันการเปลี่ยนแปลงที่อื่นนอกเหนือจากที่มา / ต้นแบบฉันไม่เห็นเลยว่าเคยเจอปัญหาของคนอื่นที่ดึงการเปลี่ยนแปลงมาจากคำถามเพราะถ้าคุณผลักการเปลี่ยนแปลงเหล่านี้ไปที่จุดเริ่มต้น / ท่านอาจารย์ไม่มีอะไรจะลดระดับได้ในตอนแรก สำหรับฉันแล้วดูเหมือนว่าการเตือนสำคัญเฉพาะในกรณีที่คุณมีสิ่งที่ซับซ้อนกว่า X -> กำเนิด / X แต่ฉันอาจผิด หากมีคนรู้ถึงสถานการณ์ที่ฉันมองเห็นโปรดแบ่งปัน
neverfox

1
@SteveChambers ไม่นั่นไม่ใช่ผลลัพธ์ บรรทัดที่แสดงถึงการผูกมัดบรรพบุรุษคือ A คือพ่อแม่ของ B ไม่มีความหมายใด ๆ เกี่ยวกับว่า Q หรือ B เป็นครั้งแรกในเวลา การดำเนินการทั้งหมดเหล่านี้ขึ้นอยู่กับกราฟการกระทำไม่ใช่เวลา Rebase เพียงแค่ปลูกถ่ายความมุ่งมั่นบางอย่างกับผลลัพธ์ที่ฉันแสดงให้เห็นไม่ว่าการประทับเวลากระทำคืออะไร
Cascabel

9

TLDR:

git pullก็เหมือนวิ่ง git fetchแล้วgit merge
git pull --rebaseก็เหมือนgit fetchแล้วgit rebase

ในการตอบกลับข้อความแรกของคุณ

git pullเป็นเหมือน+git fetchgit merge

"ในโหมดเริ่มต้นการดึง git นั้นเป็นการจดชวเลขสำหรับgit fetchตามด้วย git mergeFETCH_HEAD" แม่นยำยิ่งขึ้นgit pullทำงานgit fetchด้วยพารามิเตอร์ที่กำหนดจากนั้นgit mergeจะเรียกเพื่อผสานส่วนหัวสาขาที่ดึงมาเข้ากับสาขาปัจจุบัน "

(Ref: https://git-scm.com/docs/git-pull )


สำหรับคำสั่งที่สอง / คำถามของคุณ:

'แต่อะไรคือความแตกต่างระหว่างgit pullVS git fetch+ git rebase'

อีกครั้งจากแหล่งเดียวกัน:
git pull --rebase

"ด้วย --rebase มันจะเรียกใช้การรีต Git แทนการคอมไพล์ Git"


ตอนนี้ถ้าคุณต้องการที่จะถาม

'ความแตกต่างระหว่างmergeและrebase'

นั่นคือคำตอบที่นี่ด้วย:
https://git-scm.com/book/en/v2/Git-Branching-Rebasing
(ความแตกต่างระหว่างการเปลี่ยนแปลงวิธีบันทึกประวัติเวอร์ชัน)


2
ฉันต้องการพูดถึงว่า "git pull --rebase" เป็นเหมือน "git fetch แล้ว git rebase" ส่วนใหญ่เวลา - แต่ไม่เสมอไป ในบางสถานการณ์ "git pull --rebase" ทำงานได้อีกเล็กน้อย ดูตัวอย่างอ้างอิงนี้ได้ที่นี่: gitolite.com/git-pull--rebase
Daniel K.

1
ขอบคุณมากสำหรับคำตอบของคุณ ฉันเข้าใจจริงๆว่าวิธีการgit fetch + git rebaseทำงานของคำสั่งต่อจากนี้ ไม่มีความขัดแย้งมากขึ้นในทรีคอมไพล์ของเราจากตอนนี้ :)
Travis Le
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.