จะจัดการกับคำเตือนคอมไพล์นี้อย่างไร? “ การดึงโดยไม่ระบุวิธีการกระทบยอดแตกแขนงเป็นสิ่งที่ไม่ควรทำ”


167

หลังจากนั้นgit pull origin masterฉันได้รับข้อความต่อไปนี้:

warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:

  git config pull.rebase false  # merge (the default strategy)
  git config pull.rebase true   # rebase
  git config pull.ff only       # fast-forward only

You can replace "git config" with "git config --global" to set a default
preference for all repositories. You can also pass --rebase, --no-rebase,
or --ff-only on the command line to override the configured default per
invocation.

remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 51.49 KiB | 850.00 KiB/s, done.

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


1
ยื่นรายงานข้อบกพร่องที่คำเตือนสร้างความสับสน ตัวเลือกหนึ่งควรเป็น "แนะนำ" และคำเตือนควรแสดงตามคำขอเท่านั้นไม่ใช่เพียงเพราะมีการเปลี่ยนแปลงเวอร์ชันเกิดขึ้น สคริปต์อัตโนมัติจำนวนมากอาจหยุดทำงานด้วยพฤติกรรมที่ไม่คาดคิดนี้
Wolfgang Fahl

1
@WolfgangFahl คำเตือนไม่ควรส่งผลต่อสคริปต์ใด ๆ เนื่องจากยังคงลักษณะการทำงานเริ่มต้นไว้จนกว่าจะมีการเปลี่ยนแปลงอย่างชัดเจน ไม่ควรทำให้ pull ส่งคืนรหัสออกที่ไม่ใช่ศูนย์ (เนื่องจากเป็นคำเตือนไม่ใช่ข้อผิดพลาด) สคริปต์ CI / CD สองสามตัวที่ฉันได้ปรับใช้ในเซิร์ฟเวอร์ต่างๆยังคงทำงานต่อไปโดยที่อัตราความสำเร็จไม่ได้รับผลกระทบ
Qumber

@Qumber - ขอบคุณสำหรับความคิดเห็น รายการ Crontab จะเริ่มส่งอีเมลหากผลลัพธ์ปรากฏว่าไม่มีอยู่หรืออาจถูกกรองด้วย grep อย่างง่าย ผลลัพธ์ที่ไม่คาดคิดอาจมีผลข้างเคียงทุกประเภท
Wolfgang Fahl

@WolfgangFahl ทุกครั้งที่ดึงมักจะมีผลลัพธ์ที่แตกต่างกัน ดังนั้นสคริปต์ใด ๆ ที่ขึ้นอยู่กับสิ่งนั้นเพียงอย่างเดียวอาจเขียนได้ไม่ดี นอกจากนี้ไม่ควรอัพเกรดสภาพแวดล้อมการใช้งานจริงโดยไม่มีการทดสอบอย่างละเอียด ฉันไม่ต้องการอัพเกรดผลิตภัณฑ์ใด ๆ เลย แต่ฉันสร้างอินสแตนซ์ใหม่ที่มีทุกอย่างล่าสุดโฮสต์แอปของฉันที่นั่นทดสอบทุกอย่างจากนั้นทำการผลิต
Qumber

คำตอบ:


198

ในโหมดเริ่มต้น git pull เป็นชวเลขสำหรับการดึงข้อมูลคอมไพล์ตามด้วย git ผสาน FETCH_HEAD

เมื่อคุณทำ a git pull origin masterให้
git pullทำการผสานซึ่งมักจะสร้างคอมมิตการผสาน ดังนั้นโดยค่าเริ่มต้นการดึงจากรีโมทจึงไม่ใช่การดำเนินการที่ไม่เป็นอันตราย แต่อย่างใดมันสามารถสร้างคอมมิตใหม่ที่ไม่เคยมีมาก่อน พฤติกรรมนี้อาจสร้างความสับสนให้กับผู้ใช้เนื่องจากสิ่งที่รู้สึกว่าควรจะเป็นการดำเนินการดาวน์โหลดที่ไม่เป็นอันตรายจะเปลี่ยนประวัติการคอมมิตในรูปแบบที่คาดเดาไม่ได้

เพื่อหลีกเลี่ยงปัญหานี้คุณต้อง

git pull --ff-only

(หรือไม่อ่านเพื่อดูว่าอันไหนเหมาะกับความต้องการของคุณ)

ด้วยgit pull --ff-onlyGit จะอัปเดตสาขาของคุณก็ต่อเมื่อสามารถ "ส่งต่ออย่างรวดเร็ว" ได้โดยไม่ต้องสร้างคอมมิตใหม่ หากไม่สามารถทำได้git pull --ff-onlyเพียงแค่ยกเลิกด้วยข้อความแสดงข้อผิดพลาด

คุณสามารถกำหนดค่าไคลเอ็นต์ Git ของคุณให้ใช้--ff-onlyตามค่าเริ่มต้นได้เสมอดังนั้นคุณจะได้รับพฤติกรรมนี้แม้ว่าคุณจะลืมแฟล็กบรรทัดคำสั่ง:

git config --global pull.ff only

หมายเหตุ: --globalแฟล็กจะใช้การเปลี่ยนแปลงสำหรับที่เก็บทั้งหมดบนเครื่องของคุณ หากคุณต้องการลักษณะการทำงานนี้เฉพาะสำหรับที่เก็บที่คุณอยู่ให้ละเว้นแฟล็ก

นำมาจากที่นี่



คำเตือนนี้ถูกเพิ่มใน Git 2.27 ตามที่ Joe ชี้ให้เห็นในคำตอบของเขา

นี่คือลักษณะของคำเตือนทั้งหมด:

การดึงโดยไม่ระบุวิธีการกระทบยอดแตกแขนงเป็นสิ่งที่ไม่ควรทำ คุณสามารถบีบอัดข้อความนี้ได้โดยเรียกใช้คำสั่งต่อไปนี้ก่อนที่จะดึงครั้งต่อไป:

git config pull.rebase false # merge (กลยุทธ์เริ่มต้น)
git config pull.rebase true # rebase
git config pull.ff เฉพาะ # fast-forward เท่านั้น

คุณสามารถแทนที่ "git config" ด้วย "git config --global" เพื่อตั้งค่ากำหนดดีฟอลต์สำหรับที่เก็บทั้งหมด คุณยังสามารถส่ง --rebase, --no-rebase หรือ --ff-only บนบรรทัดคำสั่งเพื่อแทนที่ค่าดีฟอลต์ที่กำหนดค่าไว้ต่อการเรียกใช้

คำเตือนจะแสดงคำสั่งสามคำสั่งเป็นตัวเลือกซึ่งทั้งหมดนี้จะระงับคำเตือน แต่มีวัตถุประสงค์ที่แตกต่างกัน:

git config pull.rebase false     # merge (the default strategy)

ซึ่งจะคงลักษณะการทำงานเริ่มต้นและระงับคำเตือน

git config pull.rebase true      # rebase

สิ่งนี้กระทำที่ด้านบนของสาขาระยะไกลโดยรักษาสาขาเดียวทั้งในประเทศและจากระยะไกล (ซึ่งแตกต่างจากลักษณะการทำงานเริ่มต้นที่มีสองสาขาที่แตกต่างกันซึ่งเกี่ยวข้องกับสาขาหนึ่งในท้องถิ่นและอีกสาขาหนึ่งในระยะไกลและในการรวมทั้งสองสาขาจะมีการผสาน ).

git config pull.ff only          # fast-forward only

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


อัปเดต:

ถ้าคุณมีGit 2.29หรือสูงกว่าตอนนี้คุณสามารถตั้งค่าpull.ffการfalse, trueหรือonlyการกำจัดของคำเตือน

git config pull.ff true

true- นี่คือพฤติกรรมเริ่มต้น Pull จะถูกส่งต่ออย่างรวดเร็วหากเป็นไปได้มิฉะนั้นจะรวมเข้าด้วยกัน

git config pull.ff false

false - Pull ไม่เคยส่งต่ออย่างรวดเร็วและการผสานจะถูกสร้างขึ้นเสมอ

git config pull.ff only

only - Pull จะถูกส่งต่ออย่างรวดเร็วหากเป็นไปได้มิฉะนั้นการดำเนินการจะถูกยกเลิกโดยมีข้อความแสดงข้อผิดพลาด


9
ฉันขอขอบคุณที่สละเวลาและความพยายามในคำตอบของคุณ แต่ตรงไปตรงมาสิ่งนี้ยังไม่สามารถเข้าใจได้อย่างสมบูรณ์สำหรับฉัน
Jared Nedzel

1
ในฐานะที่เป็นความเห็นเกี่ยวกับที่นี่คำเตือนที่ไม่ได้รับผลกระทบจากหรือไม่ว่าสาขาเป็นจริงแยก คำเริ่มต้น "สาขาของคุณอาจแตกต่างกัน" อาจทำให้เข้าใจผิด
โจ

3
ฉันต้องบอกว่าตัวเลือกสามตัวในข้อความไม่ได้ผลสำหรับฉันที่จะกดทับข้อความ แต่คำตอบที่นี่ ( git config --global pull.ff only) ไม่ได้
DiskJunky

1
อ๊าาา! ขอบคุณ @Qumber ฉันได้ลองแล้วpull.rebase falseแต่ไม่ได้ผลตามที่อธิบายไว้ มันก็มักจะสร้างการผสานกระทำและไม่เคยส่งต่ออย่างรวดเร็ว สาเหตุที่แท้จริงคือฉันมีการmerge.ff falseตั้งค่า หลังจากล้างการตั้งค่านั้นแล้วระบบจะส่งต่ออย่างรวดเร็วเมื่อควร เอกสารที่นี่ (เกือบจะเหมือนกับgit pull docs)
stwr667

2
คุณได้รวมตัวเลือก Git 2.29 ที่ฉันกล่าวถึงด้านล่างเป็นจุดที่ดี โหวตแล้ว
VonC

65

นี่คือคำเตือนใหม่ที่เพิ่มเข้ามาในGit 2.27 :

 * "git pull" issues a warning message until the pull.rebase
   configuration variable is explicitly given, which some existing
   users may find annoying---those who prefer not to rebase need to
   set the variable to false to squelch the warning.

เพื่อลบคำเตือนตั้งค่าใดค่าหนึ่งข้อเสนอแนะเพื่อการทำงานเริ่มต้นที่คุณต้องการสำหรับgit pullถ้าคุณไม่ได้ระบุพฤติกรรมในบรรทัดคำสั่ง (ใช้--ff, --no-ff, --ff-only, --rebase) ในทุกกรณีgitจะพยายามรวมกรอไปข้างหน้า ( git fast-forwarding คืออะไร? ) รวมเข้าด้วยกันถ้าเป็นไปได้ การตั้งค่าจะควบคุมสิ่งที่เกิดขึ้นเมื่อมีการเปลี่ยนแปลงในสาขาของคุณ แต่ไม่ปรากฏในสาขาระยะไกล

  git config pull.rebase false  # merge (the default strategy)

นี่คือลักษณะการทำงานเริ่มต้นที่มีอยู่ ตั้งค่านี้โดยไม่มีการเตือนและไม่มีการเปลี่ยนแปลงพฤติกรรม gitจะรวมสาขาระยะไกลเข้ากับสาขาในพื้นที่ของคุณ

  git config pull.rebase true   # rebase

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

  git config pull.ff only       # fast-forward only

หากไม่สามารถทำการรวมแบบกรอไปข้างหน้าได้gitจะปฏิเสธที่จะดำเนินการต่อ ในฐานะที่เป็นความแตกต่างระหว่างคอมไพล์ดึง --rebase และดึงคอมไพล์ --ff เท่านั้นคำพูด:

ปฏิเสธที่จะรวมและออกด้วยสถานะที่ไม่ใช่ศูนย์เว้นแต่ว่า HEAD ปัจจุบันจะเป็นปัจจุบันอยู่แล้วหรือการผสานสามารถแก้ไขได้เป็นการกรอไปข้างหน้า


20
นี่เป็นคำตอบที่ถูกต้องที่สุดเพราะมันอธิบายได้ว่าทำไมผู้คน (เช่นฉัน) ถึงเห็นคำเตือนนี้หลังจากใช้คอมไพล์มาเกือบทศวรรษ อย่างไรก็ตามจะมีประโยชน์หากได้รับคำแนะนำเกี่ยวกับตัวเลือกที่มีให้ ตัวอย่างเช่นการชี้ให้เห็นว่าการตั้งค่า pull.ff เป็น "only" ไม่ได้ป้องกันไม่ให้คุณทำการ "pull --rebase" เพื่อแทนที่
kdopen

อะไรคือความแตกต่างระหว่างpull.rebase = trueและbranch.autoSetupRebase = always?
tekumara


1
"เมื่อมีการเปลี่ยนแปลงในสาขาของคุณ แต่ไม่มีอยู่ในสาขาระยะไกล" สำหรับฉันแล้วดูเหมือนว่าคอมไพล์ควรส่งคำเตือนนี้หากเป็นเช่นนั้น ถ้าฉันดึงเมนไลน์ของฉัน (และเมนไลน์ถูกใช้อย่างถูกต้อง) ฉันไม่ควรกังวลเรื่องนั้น
Keith Tyler

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

7

git config pull.ff onlyหรือเทียบเท่าgit pull --ff-onlyเป็นสิ่งที่ปลอดภัยที่สุด เหตุผลก็คือ rebase สามารถเขียนทับประวัติและอาจทำให้สูญเสียการคอมมิตหากนักพัฒนารายอื่นมีการบังคับให้ไปที่สาขาเดียวกัน

แต่ทั้งหมดนั้นใช้ได้


3

หมายเหตุ: ก่อนหน้านี้เราได้สอน " git pull" ( man )เพื่อเตือนเมื่อผู้ใช้ไม่ได้บอกว่าต้องรวมประวัติใหม่หรือยอมรับเฉพาะการส่งต่ออย่างรวดเร็ว แต่คำเตือนจะทริกเกอร์สำหรับผู้ที่ตั้งpull.ffค่าตัวแปรการกำหนดค่า

ไม่เป็นเช่นนั้นอีกต่อไป (หมายถึง: ไม่มีคำเตือนอีกต่อไป ) ด้วย Git 2.29 (Q4 2020)

ดูกระทำ 54200ce (24 กันยายน 2020) โดยอเล็กซ์ Henrie (alexhenrie )
(รวมโดยJunio C Hamano - gitster-ในการกระทำ 299deea , 29 กันยายน 2020)

pull: ไม่เตือนหากpull.ffตั้งค่าไว้

ลงนามโดย: Alex Henrie

ผู้ใช้ที่เข้าใจเพียงพอในการตั้งค่าpull.ffไม่ต้องการคำแนะนำเพิ่มเติม


ก่อน Git 2.31 (Q1 2021) เมื่อผู้ใช้ไม่บอก " git pull" ( man )ให้ใช้ rebase หรือ merge คำสั่งจะให้ข้อความดังเพื่อบอกให้ผู้ใช้เลือกระหว่าง rebase หรือ merge แต่จะสร้างการผสานต่อไปโดยบังคับให้ผู้ใช้ที่จะ ต้องการ rebase เพื่อทำซ้ำการดำเนินการ

แก้ไขส่วนต้นของปัญหานี้ด้วยการกระชับเงื่อนไขเพื่อให้ข้อความ --- ไม่มีเหตุผลใดที่จะหยุดหรือบังคับให้ผู้ใช้เลือกระหว่างฐานใหม่หรือรวมหากประวัติส่งต่ออย่างรวดเร็ว

ดูกระทำ 7539fdc , กระทำ b044db9 (14 ธันวาคม 2020) โดยJunio C Hamano (gitster )
ดูกระทำ c525de3 , กระทำ 278f4be , กระทำ 77a7ec6 (12 ธันวาคม 2020) โดยเฟลิคอน (felipec )
(ผสานโดยJunio ​​C Hamano - gitster-ในการกระทำ d3fa84d , 06 ม.ค. 2021)

pull: แสดงคำเตือนเริ่มต้นเฉพาะเมื่อไม่ใช่ ff

คำแนะนำโดย: Junio ​​C Hamano
ลงนามโดย: Felipe Contreras

ไม่จำเป็นต้องแสดงคำเตือนที่น่ารำคาญในทุกครั้งที่ดึง ... เฉพาะคำเตือนที่ไม่กรอไปข้างหน้า

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

ตอนนี้เราจำเป็นต้องทดสอบสถานการณ์ที่ไม่ใช่การกรอไปข้างหน้า

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