คอมไพล์ดึงจากต้นแบบลงในสาขาการพัฒนา


495

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

git checkout dmgr2
git pull origin master

สิ่งนี้ควรดึงการเปลี่ยนแปลงที่มีชีวิตเข้าสู่สาขาการพัฒนาของฉันหรือฉันทำสิ่งนี้ผิด


1
ก่อนอื่นยอมรับการเปลี่ยนแปลงทั้งหมดของคุณในสาขา dmgr2 จากนั้นชี้ไปที่ต้นแบบการชำระเงินหลัก 1.git แล้วได้รับการเปลี่ยนแปลงล่าสุด 2.git ดึง 3.git ผสาน dmgr2 4.git push -u ต้นแบบต้นแบบและจากนั้นกลับไปที่ dmgr2 ของคุณ 5.git การชำระเงิน dmgr2
mat_vee

ฉันได้กระทำการเปลี่ยนแปลงทั้งหมดของฉันไปยังสาขา dmgr2 ขออภัยลืมที่จะเพิ่ม
Matthew Colley

1
ถ้าฉันทำตามขั้นตอนที่ 4 จะไม่ผลักดันการเปลี่ยนแปลงการพัฒนาของฉันให้เป็นต้นแบบหรือไม่? ฉันไม่ต้องการทำอย่างนั้น
Matthew Colley

ดังนั้นสิ่งที่คุณพูดคือคุณต้องการที่จะนำการเปลี่ยนแปลงจากสาขาหลักของคุณมาที่สาขา dev ของคุณ?
JcKelley

9
สลับไปที่สาขาด้วยdev แล้วก็git checkout dev git pull --rebase origin masterหากคุณโชคดีจะไม่มีข้อขัดแย้งและ dev จะมีการเปลี่ยนแปลงล่าสุดจากผู้เชี่ยวชาญ
jww

คำตอบ:


724

ขั้นตอนที่คุณระบุไว้จะใช้งานได้ แต่มีวิธีอีกมากมายที่ให้ตัวเลือกเพิ่มเติมแก่คุณ:

git checkout dmgr2      # gets you "on branch dmgr2"
git fetch origin        # gets you up to date with origin
git merge origin/master

fetchคำสั่งที่สามารถทำได้ที่จุดใดก่อนmergeเช่นคุณสามารถสลับคำสั่งของดึงข้อมูลและเช็คเอาท์เพราะfetchเพียงแค่ไปมากกว่าที่จะตั้งชื่อระยะไกล ( origin) และบอกว่ามัน "ทุกอย่างไม่น่าเชื่อคุณได้ว่าฉันทำไม่ได้ "คือทั้งหมดกระทำในทุกสาขา พวกมันจะถูกคัดลอกไปยังที่เก็บของคุณ แต่ตั้งชื่อorigin/branchให้กับสาขาใด ๆ ที่ตั้งชื่อbranchบนรีโมต

ณ จุดนี้คุณสามารถใช้ตัวแสดงใด ๆ ( git log, gitkฯลฯ ) เพื่อดู "สิ่งที่พวกเขามี" ที่คุณทำไม่ได้และในทางกลับกัน บางครั้งสิ่งนี้มีประโยชน์สำหรับ Warm Fuzzy Feelings ("อ๊ะใช่นั่นคือสิ่งที่ฉันต้องการ") และบางครั้งมันมีประโยชน์สำหรับการเปลี่ยนกลยุทธ์ทั้งหมด ("โอ้โหฉันยังไม่ต้องการสิ่งนั้น")

สุดท้ายmergeคำสั่งจะใช้เวลาที่กำหนดกระทำซึ่งคุณสามารถตั้งชื่อเป็นและไม่สิ่งที่มันจะนำมาในการที่กระทำและบรรพบุรุษของตนเพื่อสิ่งที่สาขาที่คุณอยู่ในเมื่อคุณเรียกใช้origin/master mergeคุณสามารถแทรก--no-ffหรือ--ff-onlyป้องกันการกรอไปข้างหน้าหรือรวมเฉพาะในกรณีที่ผลลัพธ์เป็นการกรอไปข้างหน้าหากต้องการ

เมื่อคุณใช้ลำดับ:

git checkout dmgr2
git pull origin master

pullสั่งคำสั่ง git วิ่งแล้วเทียบเท่าคุณธรรมของgit fetch git merge origin/masterดังนั้นนี่เกือบจะเหมือนกับการทำสองขั้นตอนด้วยมือ แต่มีความแตกต่างเล็กน้อยที่อาจไม่เกี่ยวข้องกับคุณ (โดยเฉพาะอย่างยิ่งfetchขั้นตอนที่ดำเนินการโดยpullนำมาเท่านั้น origin/masterและจะไม่อัปเดตการอ้างอิงใน repo ของคุณ: 1มีความมุ่งมั่นใหม่ ๆ ที่อ้างถึงโดยFETCH_HEADอ้างอิงพิเศษเท่านั้น)

หากคุณใช้ความชัดเจนมากขึ้นgit fetch origin(จากนั้นเลือกดูรอบ ๆ ) จากนั้นgit merge origin/masterเรียงลำดับคุณยังสามารถนำท้องถิ่นของคุณmasterมาอัพเดทด้วยรีโมทด้วยการfetchวิ่งเพียงครั้งเดียวผ่านเครือข่าย:

git fetch origin
git checkout master
git merge --ff-only origin/master
git checkout dmgr2
git merge --no-ff origin/master

เช่น


1ส่วนที่สองนี้ได้รับการเปลี่ยนแปลง - ฉันพูดว่า "แก้ไข" - ใน git 1.8.4 ซึ่งตอนนี้อัปเดตการอ้างอิง "remote branch" อ้างอิงอย่างฉวยโอกาส (ตามที่บันทึกในรีลีสกล่าวว่าการตัดสินใจออกแบบโดยเจตนาเพื่อข้ามการอัปเดต แต่ปรากฎว่ามีคนชอบ git มากกว่านั้นหากคุณต้องการ SHA-1 สาขาระยะไกลเก่าค่าเริ่มต้นจะถูกบันทึกไว้ใน และสามารถกู้คืนได้จาก reflog ซึ่งจะช่วยให้คุณลักษณะ git 1.9 / 2.0 ใหม่สำหรับการค้นหา rebases ต้นน้ำ)


28
ฉันแค่ขอ a, uh, เพื่อน - วิธีที่คุณจะไปเกี่ยวกับการเลิกบล็อกรหัสแรกที่คุณมีที่นี่ (ชำระเงิน / ดึงข้อมูล / ผสาน)?
Rich Bradshaw

10
@RichBradshaw: git checkoutโดยทั่วไปจะไม่เป็นการทำลายและโดยทั่วไปจะไม่มีเหตุผลในการเลิกทำgit fetchดังนั้นดูเหมือนว่าคุณกำลังถามว่าจะทำอย่างไรกับการผสาน คำตอบคือเช่นเดียวกับการกระทำอื่น ๆ : ทั้งหรือgit reset git revertสำหรับการเปลี่ยนแปลงที่ไม่ได้เผยแพร่git resetมักเป็นวิธีที่ดีที่สุด สำหรับการเปลี่ยนแปลงอื่น ๆ มีอยู่แล้วgit revertอาจจะดีกว่า แต่ดูคำแนะนำ Linus Torvald ในการคืนค่าการผสาน: kernel.org/pub/software/scm/git/docs/howto/...
torek

2
@ WeDoTDD: ฉันไม่เข้าใจคำถาม มีจำนวนของคำสั่งที่มีการดูกราฟกระทำ ( gitk, git log --graphมีหรือไม่มี--oneline, และอื่น ๆ ) และคุณก็สามารถgit showหรือผสานกระทำหรือการใช้งานgit show -m git diffในทุกกรณีคุณกำลังระบุโปรแกรมขณะที่คุณป้อนคำสั่งบนบรรทัดคำสั่ง
58

1
@torek: ลองใช้วิธีการของคุณ: git checkout Branch แล้ว git pull master origin แต่มันดึงการเปลี่ยนแปลงต้นแบบทั้งหมดเป็นการเปลี่ยนแปลงครั้งเดียวซึ่งควรจะกระทำในพื้นที่อีกครั้งแทนที่จะดึงพวกเขาด้วยประวัติการกระทำและข้อความของพวกเขาดังนั้นหลังจากอัพเดต local หลักและสลับไปที่สาขา "git rebase master" ทำงานด้วยความขัดแย้งทั้งหมดเพื่อแก้ไขจากนั้นฉันเพิ่ม "git pull --rebase" และจัดการความขัดแย้งทั้งหมดอีกครั้งจากนั้น git push กิ่งกำเนิดเพื่อให้ได้แนวทั้งหมด ฉันเดาว่าควรจะมีวิธีที่ดีกว่าสำหรับมัน - ฉันถูกไหม
user10556443

1
@torek: ฉันเห็นด้วยกับผลที่ได้รับเป็นกระบวนการที่น่าเบื่อซึ่งบังคับให้ฉันต้องจัดการ rebase & ผสานซ้ำ & ... ทุกครั้งที่ฉันต้องการได้รับการอัปเดตจากต้นแบบ ... แต่วิธีที่เสนอซึ่งฉันยอมรับมาก ง่ายขึ้นรับการเปลี่ยนแปลงทั้งหมดภายใต้การเปลี่ยนแปลงที่ไม่มีข้อผูกมัดเพียงครั้งเดียวที่สาขาในพื้นที่โดยไม่ต้องเก็บคำสั่งหรือประวัติการกระทำของต้นแบบไว้ ฉันยินดีที่จะเรียนรู้คำแนะนำที่ดีกว่าวิธีการใช้ "ดึงข้อมูล" และติดตามเจ้านายโดยไม่จำเป็นต้องใช้ "ดึง" ฯลฯ
user10556443

14

สถานการณ์ : การทำงานในสาขาท้องถิ่นของฉัน devแต่ฉันรักที่จะให้ขึ้นการปรับปรุงในสาขาการพัฒนาที่มีชื่อ

วิธีแก้ปัญหา : โดยปกติฉันชอบทำ:

git fetch
git rebase origin/dev

15
ด้วยข้อจำกัดความรับผิดชอบตามปกติว่าการรีบูตควรทำเฉพาะในกรณีที่สาขาในพื้นที่เป็นแบบโลคัลเท่านั้นนั่นคือยังไม่ได้รับการผลักดันที่ใดก็ได้ในขณะที่มันเขียนประวัติศาสตร์
ที

8

สิ่งนี้ได้ผลสำหรับฉัน สำหรับการรับรหัสล่าสุดจากต้นแบบไปยังสาขาของฉัน

git rebase origin/master


อย่าลืมgit fetch originก่อน
lenooh

3

สถานการณ์สมมติ :

ฉันมีการอัปเดตหลักและการอัปเดตสาขาของฉันฉันต้องการให้สาขาของฉันติดตามมาสเตอร์ด้วยการรีบูตเพื่อให้มีการติดตามประวัติทั้งหมดอย่างถูกต้องลองโทรหาสาขาของฉัน Mybranch

วิธีแก้ปัญหา :

git checkout master    
git pull --rebase    
git checkout Mybranch    
git rebase master
git push -f origin Mybranch
  • จำเป็นต้องแก้ไขข้อขัดแย้งทั้งหมดกับ git mergetool &, git rebase - ยุติ, rebit git --skip, git add -u, ตามสถานการณ์และคำแนะนำ git, จนกระทั่งทั้งหมดได้รับการแก้ไข

(การแก้ไขไปยังขั้นตอนสุดท้ายโดยความช่วยเหลือของ Tzachi Cohen โดยใช้ "-f" บังคับให้คอมไพล์ไปที่ "update history" ที่เซิร์ฟเวอร์)

ตอนนี้สาขาควรจะสอดคล้องกับหลักและ rebased เช่นเดียวกับการปรับปรุงจากระยะไกลดังนั้นที่บันทึก git ไม่มี "หลัง" หรือ "ข้างหน้า" เพียงแค่ต้องลบความขัดแย้งในท้องถิ่นทั้งหมด * ไฟล์. orig เพื่อให้โฟลเดอร์ "สะอาด"

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