คำตอบสั้น ๆ
ตราบใดที่คุณทำการผสานอย่างรวดเร็วจากนั้นคุณก็สามารถใช้
git fetch <remote> <sourceBranch>:<destinationBranch>
ตัวอย่าง:
# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master
# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo
ในขณะที่คำตอบของแอมเบอร์จะทำงานในกรณีที่ส่งต่ออย่างรวดเร็วด้วยการใช้git fetchวิธีนี้แทนที่จะปลอดภัยกว่าการบังคับให้ย้ายการอ้างอิงสาขาเพียงเล็กน้อยเนื่องจากgit fetchจะป้องกันการไม่ส่งต่อโดยไม่ตั้งใจโดยอัตโนมัติตราบใดที่คุณไม่ได้ใช้งานโดยอัตโนมัติ+ใน refspec
คำตอบยาว ๆ
คุณไม่สามารถรวมสาขา B เข้ากับสาขา A โดยไม่ต้องเช็คเอาท์ A ก่อนหากว่าจะส่งผลให้เกิดการรวมกันที่ไม่ใช่แบบส่งต่ออย่างรวดเร็ว นี่เป็นเพราะจำเป็นต้องใช้สำเนาการทำงานเพื่อแก้ไขข้อขัดแย้งที่อาจเกิดขึ้น
อย่างไรก็ตามในกรณีของการผสานการกรอไปข้างหน้านี่เป็นไปได้เพราะการผสานดังกล่าวจะไม่ส่งผลให้เกิดข้อขัดแย้งตามคำจำกัดความ ในการทำเช่นนี้โดยไม่ต้องเช็คสาขาก่อนคุณสามารถgit fetchกับ refspec
นี่คือตัวอย่างของการอัปเดตmaster(ไม่อนุญาตการเปลี่ยนแปลงที่ไม่ใช่การกรอไปข้างหน้า) หากคุณมีสาขาอื่นfeatureเช็คเอาต์:
git fetch upstream master:master
กรณีการใช้งานนี้เป็นเรื่องธรรมดามากที่คุณอาจต้องการสร้างนามแฝงในไฟล์กำหนดค่า git ของคุณเช่นนี้
[alias]
sync = !sh -c 'git checkout --quiet HEAD; git fetch upstream master:master; git checkout --quiet -'
นามแฝงนี้ทำอะไรได้บ้างดังต่อไปนี้:
git checkout HEAD: สิ่งนี้ทำให้สำเนาการทำงานของคุณเข้าสู่สถานะแยกหัว สิ่งนี้มีประโยชน์หากคุณต้องการอัปเดตmasterในขณะที่คุณเช็คเอาต์ ฉันคิดว่ามันจำเป็นที่จะต้องทำด้วยเพราะไม่เช่นนั้นการอ้างอิงสาขาmasterจะไม่ย้าย แต่ฉันจำไม่ได้ว่าเป็นสิ่งที่ถูกต้องหรือไม่
git fetch upstream master:master: สิ่งนี้จะส่งต่อไปmasterยังท้องถิ่นของคุณไปยังสถานที่เดียวกันอย่างupstream/masterรวดเร็ว
git checkout -ตรวจสอบสาขาที่เช็คเอาท์ก่อนหน้าของคุณ (เป็นสิ่งที่-ทำในกรณีนี้)
ไวยากรณ์ของgit fetchการผสานอย่างรวดเร็ว (ไม่ใช่ -)
หากคุณต้องการให้fetchคำสั่งล้มเหลวหากการอัปเดตไม่ใช่การส่งต่ออย่างรวดเร็วคุณเพียงแค่ใช้ refspec ของแบบฟอร์ม
git fetch <remote> <remoteBranch>:<localBranch>
หากคุณต้องการอนุญาตการอัปเดตที่ไม่ใช่การส่งต่อคุณต้องเพิ่ม a +ที่ด้านหน้าของ refspec:
git fetch <remote> +<remoteBranch>:<localBranch>
โปรดทราบว่าคุณสามารถส่งผ่าน repo ท้องถิ่นของคุณเป็นพารามิเตอร์ "ระยะไกล" โดยใช้.:
git fetch . <sourceBranch>:<destinationBranch>
เอกสารประกอบ
จากgit fetchเอกสารที่อธิบายเกี่ยวกับไวยากรณ์นี้ (การเน้นของฉัน):
<refspec>
รูปแบบของ<refspec>พารามิเตอร์เป็นบวกตัวเลือก+ตามด้วยเตะแหล่งที่มา<src>, ตามด้วยเครื่องหมายตามด้วยเตะปลายทาง:<dst>
ได้รับเตะแมตช์ระยะไกลที่<src>เป็นความจริงและถ้า<dst>ไม่ได้เป็นสตริงที่ว่างเปล่า, <src>ได้รับเตะท้องถิ่นที่ตรงกับมันเป็นอย่างรวดเร็วส่งต่อโดยใช้ หากใช้เครื่องหมายบวก+เป็นทางเลือกการอ้างอิงในท้องถิ่นจะได้รับการอัปเดตแม้ว่าจะไม่ส่งผลให้มีการอัปเดตอย่างรวดเร็ว
ดูสิ่งนี้ด้วย
ชำระเงิน Git และผสานโดยไม่ต้องสัมผัสต้นไม้ทำงาน
ผสานโดยไม่ต้องเปลี่ยนไดเรกทอรีทำงาน