ดึงสาขา Git อื่นโดยไม่เปลี่ยน


55

เมื่อเร็ว ๆ นี้เราได้เปลี่ยนจาก SVN เป็น Git และในเวลาเดียวกันก็ทำให้ระบบที่ใช้งานจริงของเราเข้าสู่การควบคุมเวอร์ชัน

ในโครงการที่ฉันได้รับมอบหมายเราทุกคนเข้าถึงที่เก็บเดียวกันและเพื่อรับการเปลี่ยนแปลงสดเราแค่git pullอยู่ที่นั่น สิ่งนี้ทำให้เกิดปัญหาเนื่องจากนักออกแบบเว็บของเราผลักดันการเปลี่ยนแปลงใน VCS ที่ยังไม่ควรเผยแพร่ แต่ควรอยู่ในสภาพแวดล้อมการทดสอบเว็บ

เมื่อนักพัฒนาคนใดคนหนึ่งดึงเข้ามาใช้งานจริงเขาจะได้รับการเปลี่ยนแปลงทั้งหมด (อาจยังไม่เสร็จ)

ฉันคิดว่าการเปลี่ยนสดเป็นสาขาพิเศษและรวมสิ่งที่เปลี่ยนแปลง แต่เนื่องจากขาดความรู้คอมไพล์ของฉันฉันไม่มีความคิดอย่างไร

ความคิดของฉันคือ:

  • สร้างสาขาใหม่ในการถ่ายทอดสด ( git branch live)
  • ทุกครั้งที่บางสิ่งบางอย่างต้องมีชีวิตอยู่
    • การเปลี่ยนแปลงในการดึงต้นแบบ (ชอบgit checkout master; git pull; git checkout live)
    • git merge master

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

มีวิธีใดบ้างในการทำสิ่งนี้หรือมีวิธีที่ดีกว่าในการจัดการระบบ Live (ยกเว้นการฝึกอบรมผู้ใช้งานเว็บเพื่อไม่ให้ผลักดันเนื้อหาที่ยังไม่เสร็จ)


git pull --allโดยค่าเริ่มต้นจะไม่ดึงต้นแบบเข้าสู่การถ่ายทอดสดมันจะดึงข้อมูลหลักและรวมเข้ากับข้อมูลหลักและ (หากมีอยู่บนเซิร์ฟเวอร์) จะดึงข้อมูลสดเพื่อรวมเข้าเป็นจริง คุณลองหรือยัง
Tobias Kienzler

ปัญหาของคุณเกิดจากไฟล์ที่ไม่ได้อยู่ภายใต้การควบคุมเวอร์ชันก่อนที่จะแยกย่อย live และ git-add หลังจากการดัดแปลงเป็น master ในภายหลังหรือไม่? นั่นคือสิ่งที่เกิดขึ้นกับผมมาก่อนมักจะควรจะพอเพียงที่จะเปลี่ยนชื่อไฟล์ว่าชั่วคราวหรือถ้ามันไม่จำเป็นที่สดใช้git checkout -fจะไม่สนใจปัญหา - แต่ให้สำรอง!
Tobias Kienzler

คำตอบ:


21

คุณสามารถใช้git stashก่อนที่จะตรวจสอบต้นแบบและการดึงและหลังจากตรวจสอบการใช้งานอีกครั้งใช้git stash pop(หรือถ้าคอมไพล์ของคุณเก่าgit stash applyและgit stash clearสมมติว่าคุณไม่ได้ซ่อนอะไรเลย)


6
git pull --allจะดึงรีโมททั้งหมด แต่จะยังคงพยายามรวมสาขา (หรือสาขาเริ่มต้น) เข้ากับสาขาปัจจุบันเช่นกัน
mipadi

@mipadi ใช่ แต่มีเพียงสาขาปัจจุบันเท่านั้นที่พยายามเช็คเอาต์ต้นแบบและก่อให้เกิดความขัดแย้งใช่ไหม?
Tobias Kienzler

มันจะรวมสาขาใดก็ตามที่ถูกกำหนดค่าให้รวมเข้ากับสาขาปัจจุบันโดยอัตโนมัติ (หากสาขานั้นได้รับการกำหนดค่า)
mipadi

1
@ Superole มีการบันทึกเป็น "เรียกใช้การควบคุมระยะไกลทั้งหมด" ซึ่งรวมถึงไม่เพียง แต่ที่เก็บหลายแห่ง แต่ยังแยกสาขาด้วย แม้ว่าจะเข้าใจถึงปัญหาหลังเหตุการณ์ แต่git fetch --allอาจเป็นคำตอบที่ดีกว่า
Tobias Kienzler

2
@TobiasKienzler มันสั่งให้ git ดึงข้อมูลจากรีโมทที่ตั้งค่าไว้ทั้งหมดเท่านั้น กรณีที่พบบ่อยที่สุดคือการมีต้นกำเนิดชื่อระยะไกลเพียงคนเดียว หากคุณมีรีโมทมากกว่าหนึ่งสาขาที่มีสาขาเดียวกันกับสาขาปัจจุบันของคุณและพวกเขาไม่ได้มีความสัมพันธ์ที่รวดเร็วต่อกันสำหรับแต่ละคนจากนั้นการใช้--allตัวเลือกนี้จะทำให้คุณสามารถรวมปลาหมึกยักษ์ของสาขาต่าง ๆ เข้ากับกระแส ! ดังนั้นคำแนะนำของฉันคืออยู่ให้ห่างจาก--allสิ่งที่คุณทำหลังจากนั้นเพราะในกรณีอื่น ๆ ส่วนใหญ่มันจะไม่ให้อะไรคุณ
Superole

74

ฉันสามารถดึงการเปลี่ยนแปลงจากorigin/masterในmasterขณะที่ทำงานในสาขาอื่นโดยใช้คำสั่งนี้:

git fetch origin master:master

6
! น่ากลัว สิ่งที่ฉันกำลังมองหา - สิ่งนี้จะต้องมีเอกสารที่ชัดเจนมากขึ้น ...
Markus Shepherd

2
คุณสามารถหาเอกสารได้ที่นี่: git-scm.com/docs/git-fetch#_examples
c1moore

fetch! =pull
D. Kovács

5

แก้ไขปัญหาก่อน พวกเขาไม่ควรผลักดันสาขาที่พวกเขาไม่มีธุรกิจผลักดัน

สิ่งที่คุณดูเหมือนจะถามจะเป็นเช่นนั้น

git checkout live
git pull origin master

สิ่งนี้จะพยายามรวมกันของต้นแบบระยะไกลและสาขาสดของคุณ


ปัญหาคือในปัจจุบันเรามีสาขาเดียวและจะไม่สามารถเปลี่ยนแปลงได้เพราะทุกคนคุ้นเคยกับ SVN มากเกินไปและไม่เต็มใจที่จะเรียนรู้ข้อดีของสิ่งใหม่ ๆ มันจะเป็นไปได้ที่จะสร้างสาขาใหม่ในไดเรกทอรีสด การรวมต้นแบบระยะไกลเข้ากับสาขาสดเป็นสิ่งที่ฉันต้องการหลีกเลี่ยงเนื่องจากฉันไม่สามารถป้องกันไม่ให้ใครผลักดันรหัสการดีบัก, ฟังก์ชันที่ไม่สมบูรณ์, ข้อผิดพลาดทางไวยากรณ์และสิ่งอื่นใดให้กับต้นแบบ ขอบคุณสำหรับคำแนะนำของคุณ
Morfildur

2
@ dbeme: คุณสามารถใช้ tarballs และ patches ;) นอกจากว่าพวกเขายินดีที่จะเรียนรู้คอมไพล์ (และมันก็ไม่ยากเลยที่จะแยกสาขาและรวม) คุณจะมีปัญหา
Josh K

0

ฉันขอแนะนำให้คุณสร้าง repo คอมไพล์ทดสอบสำหรับทุกคนที่จะกระทำ repos ทั้งหมดรวมถึงเว็บไซต์สดของคุณจะเป็นโคลนของ repo ทดสอบ ในลักษณะนี้ทุกคนสามารถกดเพื่อทดสอบโดยไม่ต้องแตะเว็บไซต์สด เมื่อมีคนต้องการอัปเดตไซต์สดคุณสามารถดึงไซต์สดจาก repo การทดสอบ git เวิร์กโฟลว์นี้ค่อนข้างคล้ายกับ SVN เพื่อความยืดหยุ่นเป็นพิเศษฉันขอแนะนำให้ใช้สาขา "สด" ที่คุณอธิบาย

สรุป repo คอมไพล์ของทุกคนเป็นโคลนของ repo ทดสอบ เว็บไซต์การผลิตสดเป็นเพียงโคลนของ repo ทดสอบเช่นกัน อีกวิธีหนึ่งคือการทดสอบอาจเป็นโคลนของกระบวนการผลิตสดเพื่อให้ "git push" เคลื่อนที่ไปสู่การผลิตเสมอ

ตัวเลือกอื่น ๆ รวมถึงการเพิ่มสาขา "สด" ในข้อตกลงนี้หรือรวมถึง "การจัดเตรียม" repo ระหว่างการทดสอบและการผลิต เพื่อความปลอดภัยเป็นพิเศษฉันขอแนะนำให้ จำกัด การเข้าถึง repo สด git และบังคับให้ผู้คนใช้สคริปต์ที่ปลอดภัยที่จะดึงการผลิตสด

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