ฉันต้องทำ“ git pull” ก่อนหรือหลัง“ git add, git Commit” เมื่อใด


93

วิธีที่ถูกต้องคืออะไร?

git add foo.js
git commit foo.js -m "commit"
git pull
git push

หรือ

git pull
git add foo.js
git commit foo.js -m "commit"
git push

หรือ

git add foo.js
git pull
git commit foo.js -m "commit"
git push

UPD:

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


คำถามที่เกี่ยวข้อง: stackoverflow.com/questions/813822/…
leo9r

คำตอบ:


97

ฉันคิดว่าวิธีที่ดีที่สุดคือ:

ซ่อนการเปลี่ยนแปลงในท้องถิ่นของคุณ:

git stash

อัปเดตสาขาเป็นรหัสล่าสุด

git pull

รวมการเปลี่ยนแปลงในเครื่องของคุณเข้ากับรหัสล่าสุด:

git stash apply

เพิ่มยอมรับและผลักดันการเปลี่ยนแปลงของคุณ

git add
git commit
git push

จากประสบการณ์ของฉันนี่เป็นเส้นทางไปสู่การต่อต้านน้อยที่สุดกับ Git (ในบรรทัดคำสั่งอยู่ดี)


4
คุณอธิบายได้ไหมว่าทำไมถึงดีกว่านี้ ปัญหานี้หลีกเลี่ยงอะไร? โดยเฉพาะอย่างยิ่งเหตุใดสิ่งนี้จึงดีกว่าการกระทำแบบง่ายๆ> ดึง> ดัน (ฉันรู้สึกว่านี่อาจเป็นคำตอบที่ดีที่สุด แต่ตอนนี้ยังไม่มีข้อมูลเพียงพอที่จะถือว่าเป็นคำตอบที่ดี)
dallin

7
บางทีนี่อาจเป็นเรื่องเล็ก ๆ น้อย ๆ แต่ฉันมักจะพบวิธีนี้ (ในบรรทัดคำสั่งแทนที่จะใช้อะไรอย่างเช่น sourcetree) ง่ายกว่ามาก การคอมมิตแล้วดึงในขณะที่ทำงานในทีมขนาดใหญ่มักจะนำไปสู่ความขัดแย้งในการผสานขนาดใหญ่เนื่องจากคอมไพล์ไม่ค่อยดีนักในการรวมการเปลี่ยนแปลงของฉันไปยังไฟล์กับไฟล์ที่เข้ามา การซ่อนทำให้ฉันสามารถดึงการเปลี่ยนแปลงใหม่จากนั้นใช้รหัสที่อัปเดตเป็นฐานในการเพิ่มการเปลี่ยนแปลงของฉัน การจัดการกับความขัดแย้งนั้นง่ายขึ้นเนื่องจากพวกเขาชัดเจนสำหรับฉัน (เนื่องจากการเปลี่ยนแปลงของฉันตอนนี้เป็นความขัดแย้ง) ในการมองย้อนกลับไปมันอาจจะง่ายกว่าสำหรับสถานการณ์ของฉัน
johnjo

1
ฟังดูเหมือนเป็น "ช้างกินยังไงให้กัดทีละครั้ง" กล่าวคือการแบ่งกระบวนการออกเป็นขั้นตอนอื่น ๆ เพื่อลดความซับซ้อนของการผสานเพื่อให้มีการเปลี่ยนแปลงน้อยลงและชัดเจนขึ้น มีเหตุผล.
dallin

git add จำเป็นไหมที่นี่ หากไฟล์ทั้งหมดถูกเพิ่มลงในการจัดเตรียมแล้ว!
Sharp Edge

แล้วถ้าคุณไม่ได้ใช้git stashล่ะ?
Aaron Franke

76

ดึง = ดึง + ผสาน

คุณต้องยอมรับสิ่งที่คุณทำก่อนที่จะรวมเข้าด้วยกัน

ดังนั้นดึงหลังจากกระทำ


8
นี่หมายความว่าคุณต้องทำข้อตกลงเพิ่มเติมสำหรับแต่ละข้อผูกพันที่คุณทำและทำให้ repo เลอะเทอะหรือไม่? นอกจากนี้ข้อความคอมมิตเริ่มต้นของคุณจะลงเอยด้วยการรวมความคิดเห็นทุกครั้ง ถ้าเป็นเช่นนั้นฉันมีแนวโน้มที่จะใช้วิธีการซ่อนที่ระบุไว้ด้านล่างโดย @johnjo
จันทร์ที่

3
@DanielM ใช่มีการคอมมิตพิเศษสำหรับการผสาน (พร้อมด้วยข้อความคอมมิตดีฟอลต์ที่ชัดเจน) นี่เป็นสิ่งที่ดีทีเดียวเพราะช่วยให้คุณสามารถชำระเงินครั้งสุดท้ายของคุณหรือการกระทำครั้งสุดท้ายของเพื่อนร่วมงานของคุณหรือการรวมคอมมิต ถ้าคุณต้องการที่จะหลีกเลี่ยงได้และถ้าคุณต้องการที่จะวางกระทำของคุณหลังจากที่กระทำเพื่อนร่วมงานของคุณคุณสามารถแทนrebase mergeคุณสามารถทำได้โดยใช้git commit && git rebaseหรือgit pull --rebase.
Arnaud Denoyelle

ขอบคุณสำหรับเคล็ดลับ @Arnaud หลังจากอ่านคำถาม SO ต่างๆมากมายความคิดเห็นนี้ก็ทำให้มัน ตัวเลือกที่ฉันต้องการเมื่อเพื่อนร่วมงานกำลังทำงานกับไฟล์ต่างๆคือgit pullหลังจากจัดเตรียมการเปลี่ยนแปลงของฉันแล้วเนื่องจากฉันพบว่ามันเป็นธรรมชาติที่สุด แม้ว่าฉันจะรู้ว่าขั้นตอนการทำงานที่แตกต่างกันจำนวนมาก (การซ่อนก็ดีเช่นกัน) ดังนั้นจึงอาจเป็นเรื่องของรสนิยม
nephewtom

51

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

ต้องบอกว่าฉันจะเลือกตัวเลือกแรก:

git add foo.js
git commit foo.js -m "commit"
git pull
git push

ยอมรับการเปลี่ยนแปลงของคุณก่อนที่จะดึงเพื่อให้คอมมิตของคุณรวมเข้ากับการเปลี่ยนแปลงระยะไกลระหว่างการดึง ซึ่งอาจส่งผลให้เกิดความขัดแย้งซึ่งคุณสามารถเริ่มจัดการได้โดยรู้ว่ารหัสของคุณได้รับการยอมรับแล้วหากมีสิ่งผิดปกติเกิดขึ้นและคุณต้องยกเลิกการผสานไม่ว่าด้วยเหตุผลใด

ฉันแน่ใจว่าจะมีคนไม่เห็นด้วยกับฉันฉันไม่คิดว่าจะมีวิธีใดที่ถูกต้องในการทำขั้นตอนการผสานนี้เฉพาะสิ่งที่ดีที่สุดสำหรับผู้คน


1
คุณช่วยดูการอัปเดตคำถามของฉันได้ไหม ฉันลืมอธิบายว่าใช้เพื่ออะไรgit addในตัวอย่างของฉัน
กรีน

1
ไม่ควรสร้างความแตกต่างไม่ว่าจะเป็นไฟล์ใหม่หรือไฟล์ที่ติดตาม / แก้ไข ยังคงกระทำแล้วดึง
Jasarien

7

ฉันคิดว่าgit pull --rebaseเป็นวิธีที่สะอาดที่สุดในการตั้งค่าคอมมิตล่าสุดในเครื่องของคุณบนการคอมมิตระยะไกลซึ่งคุณไม่มี ณ จุดใดจุดหนึ่ง

วิธีนี้ทำให้คุณไม่ต้องดึงทุกครั้งที่ต้องการเริ่มทำการเปลี่ยนแปลง


นี่คือสิ่งที่ฉันทำเช่นกัน แต่เพียงเพื่อชี้ให้เห็นว่ามีสำนักคิดหลักสองแห่งในเรื่องนี้ (โดยเน้นที่การแก้ไขความขัดแย้งระหว่างการกระทำแต่ละครั้งที่ดีที่สุดหรือครั้งเดียวในการรวมการกระทำ) กับ Linus เองในค่ายผสาน . โชคดีที่เครื่องมือนี้ไม่ได้รับการพิจารณาดังนั้นควรใช้ แต่จะดีที่สุดสำหรับคุณและความต้องการของโครงการของคุณ :-)
Luke Usherwood

3

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

ไฟล์ในเครื่อง "สกปรก" ไม่ใช่ปัญหาตราบใดที่ไม่มีความขัดแย้งใด ๆ กับสาขาระยะไกล หากมีข้อขัดแย้งการรวมจะล้มเหลวดังนั้นจึงไม่มีความเสี่ยงหรืออันตรายใด ๆ ในการดึงออกก่อนที่จะทำการเปลี่ยนแปลงในท้องถิ่น


1
จะไม่ได้ผลดังที่ Arnaud กล่าวถึงการดึงคุณต้องยอมรับการเปลี่ยนแปลงก่อน
Jasarien

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

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