Git กรอไปข้างหน้า VS ไม่มีการกรอไปข้างหน้าอย่างรวดเร็ว


247

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


12
จะstackoverflow.com/questions/2850369/...ความช่วยเหลือ?
VonC

2
ฉันคิดว่าอีกมุมมองที่ดีจริงๆสามารถพบได้ที่นี่endoflineblog.com/gitflow-considered-harmful
Dmitry Minkovsky

คำถามเดียวกัน stackoverflow.com/questions/9069061
Yousha Aleayoub

คำตอบ:


290

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

หากคุณไม่สนใจเรื่องนี้ - คุณอาจเลิกกับ FF ได้ทุกครั้งที่ทำได้ ดังนั้นคุณจะมีความรู้สึกเหมือนเวิร์กโฟลว์ svn มากขึ้น

ตัวอย่างเช่นผู้เขียนบทความนี้คิดว่า--no-ffตัวเลือกควรเป็นค่าเริ่มต้นและเหตุผลของเขาอยู่ใกล้กับที่ฉันได้อธิบายไว้ข้างต้น:

พิจารณาสถานการณ์ที่มีชุดย่อยที่ทำหน้าที่ในสาขา "ฟีเจอร์" รวมกันเป็นหนึ่งในฟีเจอร์ใหม่: ถ้าคุณเพียงแค่ทำ "git merge feature_branch" โดยไม่ต้อง--no-ff"มันเป็นไปไม่ได้ที่จะเห็นจากประวัติศาสตร์ Git ซึ่งวัตถุที่กระทำร่วมกัน ใช้งานคุณสมบัติ - คุณจะต้องอ่านข้อความบันทึกทั้งหมดด้วยตนเองการย้อนกลับคุณสมบัติทั้งหมด (เช่นกลุ่มของการกระทำ) เป็นอาการปวดหัวที่แท้จริง [หาก--no-ffไม่ได้ใช้] ในขณะที่สามารถทำได้อย่างง่ายดายหากมีการใช้--no-ffธง มันเป็นเพียงหนึ่งความมุ่งมั่น]. "

กราฟฟิคแสดงให้เห็นว่ากลุ่ม --no-ff รวมกันกระทำทั้งหมดจากสาขาคุณลักษณะเป็นหนึ่งกระทำในสาขาต้นแบบ


3
และการส่งต่อที่รวดเร็วนั้นยอดเยี่ยมมากเมื่อคุณมีสาขาที่เกี่ยวข้องอย่างใกล้ชิดซึ่งตอนนี้และจากนั้นคุณต้องการที่จะย้ายไปอยู่ด้วยกัน ไม่ใช่การรวมกันทั้งหมดเป็นเหตุการณ์ประวัติศาสตร์จริง
Cascabel

3
ทำไมต้องมีหลายสาขา? หากพวกเขาใกล้ชิด - ทำไมไม่ทำทุกอย่างในสาขาเดียว?
Ivan Danilov

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

2
สำหรับการตอบกลับครั้งแรกความเข้าใจของฉันคือ OP ต้องการทราบแนวทางปฏิบัติที่ดีที่สุดในการติดตาม สิ่งต่าง ๆ เกิดขึ้นและไม่ใช่ทุกอย่างที่เป็นอุดมคติ แต่ดูเหมือนว่าจะมีการประนีประนอมกันมากกว่านี้
Ivan Danilov

1
เป็นที่น่าสังเกตว่าประโยชน์ของ--no-ffประวัติการกระทำของคุณอาจไม่ปรากฏชัดทันทีเมื่อใช้เครื่องมือพื้นฐานเช่นgit logซึ่งจะแสดงการกระทำทั้งหมดจากสาขาทั้งหมดที่รวมอยู่ในสาขาปัจจุบันของคุณ ที่กล่าวว่าผลประโยชน์ที่กลายเป็นที่ชัดเจนเมื่อใช้เช่นgit log --first-parentในสาขาบูรณาการเช่นหรือdevelop masterหากคุณใช้อย่างถูกต้องทางศาสนา--no-ffนั่นจะแสดงเฉพาะการร้องขอรวมในขณะที่git logยังคงให้ประวัติที่ครอบคลุม (เพิ่มเติม) นั่นเป็นเหตุผลที่วินเซนต์แนะนำสำหรับการใช้งานกับGitFlow
Jeremy Caney

12

ฉันสามารถยกตัวอย่างที่เห็นได้ทั่วไปในโครงการ

ที่นี่ตัวเลือก--no-ff(เช่นการผสานที่แท้จริง ) สร้างการคอมมิทใหม่กับผู้ปกครองหลายคนและให้การติดตามประวัติที่ดีขึ้น มิฉะนั้น--ff(เช่นการผสานการกรอไปข้างหน้า ) เป็นค่าเริ่มต้น

$ git checkout master
$ git checkout -b newFeature
$ ...
$ git commit -m 'work from day 1'
$ ...
$ git commit -m 'work from day 2'
$ ...
$ git commit -m 'finish the feature'
$ git checkout master
$ git merge --no-ff newFeature -m 'add new feature'
$ git log
// something like below
commit 'add new feature'         // => commit created at merge with proper message
commit 'finish the feature'
commit 'work from day 2'
commit 'work from day 1'
$ gitk                           // => see details with graph

$ git checkout -b anotherFeature        // => create a new branch (*)
$ ...
$ git commit -m 'work from day 3'
$ ...
$ git commit -m 'work from day 4'
$ ...
$ git commit -m 'finish another feature'
$ git checkout master
$ git merge anotherFeature       // --ff is by default, message will be ignored
$ git log
// something like below
commit 'work from day 4'
commit 'work from day 3'
commit 'add new feature'
commit 'finish the feature'
commit ...
$ gitk                           // => see details with graph

(*) โปรดทราบว่าที่นี่หากnewFeatureสาขาถูกนำกลับมาใช้ใหม่แทนที่จะสร้างสาขาใหม่ git จะต้องทำการ--no-ffผสานต่อไป ซึ่งหมายความว่าการผสานการกรอไปข้างหน้านั้นไม่ได้มีสิทธิ์เสมอไป


6

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


0

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

ฉันไม่ต้องการก่อให้เกิดการพัฒนาต้นแบบด้วยรหัสที่ไม่ทำงานดังนั้นการทำ --no-ff อาจเป็นสิ่งที่เรากำลังมองหา

ตามหมายเหตุด้านข้างคุณอาจไม่จำเป็นต้องส่งรหัสการทำงานในสาขาส่วนบุคคลเนื่องจากประวัติสามารถเขียนใหม่git rebase -iและบังคับใช้บนเซิร์ฟเวอร์ตราบใดที่ไม่มีใครทำงานในสาขาเดียวกันนั้น

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