Git และ“ สาขา 'x' ไม่ได้ถูกผสานอย่างสมบูรณ์ "ข้อผิดพลาด


295

นี่คือคำสั่งที่ฉันใช้จากสาขาหลัก

git branch experiment
git checkout experiment

จากนั้นฉันทำการเปลี่ยนแปลงบางอย่างกับไฟล์ของฉันยืนยันการเปลี่ยนแปลงและผลักสาขาใหม่ไปที่ GitHub

git commit . -m 'changed files'
git push -u origin experiment

ต่อมาฉันตัดสินใจรวมสาขาการทดสอบของฉันเข้ากับสาขาหลัก

git checkout master
git merge experiment

ในที่สุดฉันก็ผลักดันการเปลี่ยนแปลงให้ GitHub

git push -u origin master

ทุกอย่างเป็นไปด้วยดีจนกระทั่งฉันพยายามลบสาขาการทดสอบโดยใช้

git branch -d experiment

ฉันได้รับข้อความแสดงข้อผิดพลาดerror: The branch 'experiment' is not fully merged.ฉันยังใหม่กับคอมไพล์และฉันไม่รู้ว่าฉันจะรวมสองสาขาเข้าด้วยกันได้อีกมากเพียงใด ฉันหายไปนี่อะไร


2
โพสต์นี้ช่วยคุณได้ไหม stackoverflow.com/questions/1710894/…
Chrisdigital

2
บางครั้งสิ่งนี้เกิดขึ้นเมื่อฉันทำ agit commit --amend
Arcolye

12
นอกจากนี้ - โปรดระวังว่าข้อความนี้จะปรากฏหลังจากsquash: stackoverflow.com/q/41946475/109941
Jim G.

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

คำตอบ:


314

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

ในทางปฏิบัติหมายความว่าคุณอาจแก้ไขกระทำการคัดค้านหรือกรองแล้วและดูเหมือนจะไม่เหมือนกัน

ดังนั้นคุณสามารถหลีกเลี่ยงคำเตือนได้โดยการตรวจสอบสาขาที่มีข้อผูกพันที่คุณไม่ได้อ้างอิงโดยการลบสาขาอื่น ๆ ออก²

คุณจะต้องยืนยันว่าในความเป็นจริงคุณจะไม่พลาดข้อผูกพันที่สำคัญ:

git log --graph --left-right --cherry-pick --oneline master...experiment

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

--cherry-pick

งดการคอมมิชชันใด ๆ ที่แนะนำการเปลี่ยนแปลงเช่นเดียวกับการคอมมิชชันอื่นที่ด้านอื่น ๆ เมื่อชุดของการคอมมิทนั้นถูก จำกัด ด้วยความแตกต่างแบบสมมาตร ตัวอย่างเช่นหากคุณมีสองสาขา A และ B วิธีปกติในการแสดงรายการทั้งหมดที่กระทำในด้านเดียวเท่านั้นคือ - ซ้ายขวาเช่นตัวอย่างด้านบนในคำอธิบายของตัวเลือกนั้น อย่างไรก็ตามมันแสดงให้เห็นถึงความมุ่งมั่นที่เชอร์รี่เลือกจากสาขาอื่น ๆ (ตัวอย่างเช่น "อันดับ 3 บน b" อาจถูกเลือกโดยเชอร์รี่จากสาขา A) ด้วยตัวเลือกนี้คู่ของการกระทำดังกล่าวจะถูกแยกออกจากผลลัพธ์


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

² (การตั้งค่าของฉันที่นี่คือเพียงบังคับการลบแทน แต่คุณอาจต้องการความมั่นใจเป็นพิเศษ)


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

35
-1 "หมายถึงสาขาที่คุณกำลังจะลบมีการกระทำที่ไม่สามารถเข้าถึงได้จากหัวอ้างอิงอื่น ๆ " สิ่งนี้ไม่ถูกต้อง คำเตือนหมายความว่าสาขาไม่สามารถเข้าถึงได้จากทั้งต้นน้ำ (ถ้ามี) หรือจาก HEAD ปัจจุบัน ดู manpage ของ git-branch
sleske

3
@TachyonVortex Nice link คำสั่ง git branch -vv ชี้แจงให้ชัดเจนว่าเกิดอะไรขึ้นกับฉัน
Jason Massey

11
@sleske ขอบคุณสำหรับความคิดเห็น - คำตอบนี้ควรได้รับการแก้ไข มันเป็นความอัปยศที่มีการยกระดับสูงเนื่องจากประโยคคำอธิบายหลักไม่ถูกต้อง ฉันเพิ่งมีปัญหานี้และใช้เวลานานน่ารำคาญในการพยายามค้นหาว่าปัญหาคืออะไรและเป็นเพียงว่าสาขาการติดตามระยะไกลถูกลบไปเป็นส่วนหนึ่งของคำขอการดึงและในเวลานั้นตั้งแต่ฉันดึงการเปลี่ยนแปลงจากต้นแบบ ในสาขาท้องถิ่น 'ปัญหา' เพียงอย่างเดียวไม่พบสาขาการติดตามระยะไกลซึ่งถูกลบ (และฉันพยายามลบสาขาท้องถิ่นด้วยเหตุผลเดียวกัน)
ely

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

80

ดังที่ Drew Taylor ชี้ให้เห็นว่าการลบสาขาด้วย -d จะพิจารณาเฉพาะHEAD ปัจจุบันในการพิจารณาว่าสาขานั้นเป็น "ผสานอย่างสมบูรณ์" หรือไม่ มันจะบ่นแม้ว่าสาขาจะรวมกับสาขาอื่น ข้อความแสดงข้อผิดพลาดอาจชัดเจนขึ้นในเรื่องนี้ ... คุณสามารถชำระเงินสาขาที่ผสานก่อนที่จะลบหรือเพียงแค่ใช้สาขา git -D ทุน -D จะแทนที่เช็คทั้งหมด


2
ส่วนเกี่ยวกับ HEAD ปัจจุบันแก้ไขให้ฉัน เจ้านายของฉันแตกต่างจากสาขาคุณลักษณะซึ่งฉันสร้างสาขาที่ขัดแย้งกัน: D
viki.omega9

1
สำหรับใครบางคนเรียนรู้คอมไพล์คำว่า "ปัจจุบัน" ดูเหมือนจะซ้ำซ้อนกับ "HEAD" หรือไม่? ไม่มีสิ่งดังกล่าวในฐานะหัวหน้า uncurrent เป็น - หัวโดยความหมายคือปัจจุบันสาขา ฉันพลาดอะไรไปรึเปล่า? ฉันคิดว่าคุณสามารถพูดว่า "สาขาปัจจุบัน" หรือ "หัว" แต่ไม่ใช่ "หัวปัจจุบัน"
Mark Lakata

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

15

ฉันลองคำตอบของเซ่และไม่ได้ผล

หากต้องการค้นหาข้อผูกพันที่ไม่ได้รวมเพียงใช้:

git log feature-branch ^master --no-merges

14

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


7
ดูเหมือนจะไม่ใช่ปัญหาเฉพาะที่นี่ แต่ฉันพบปัญหาที่คุณอธิบายในตอนนี้ขอบคุณมาก!
Daniel Buckmaster

4

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

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

Git ไม่ได้ตรวจสอบสาขาอื่น ๆ ในที่เก็บ แค่สอง:

  1. สาขาปัจจุบัน (HEAD)
  2. สาขาต้นน้ำถ้ามี

“การสาขาต้นน้ำ” สำหรับเช่นในกรณีของคุณน่าจะเป็นexperiment origin/experimentหากexperimentรวมอยู่ในสาขาปัจจุบันอย่างสมบูรณ์ Git จะลบโดยไม่มีการร้องเรียน หากไม่ใช่ แต่ถูกรวมเข้าด้วยกันอย่างเต็มที่ในสาขาต้นน้ำ Git จะดำเนินการโดยมีคำเตือนที่ดูเหมือน:

warning: deleting branch 'experiment' that has been merged
to 'refs/remotes/origin/experiment', but not yet merged to
HEAD.
Deleted branch experiment (was xxxxxxxx).

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

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


1
กุญแจสำคัญคือ "ผสานอย่างเต็มที่ในสาขาปัจจุบัน " ฉันมีสาขา X 'จาก X ที่รวมกันกลับเข้าที่ X อย่างสมบูรณ์และได้ลบต้นกำเนิด / X' ไปแล้ว แต่เมื่อ Y เช็คเอาท์ฉันได้รับคำเตือนนี้ เมื่อฉันเช็คเอาต์ XI ก็สามารถที่จะลบ X ' ฉันคิดว่าค่อนข้างโง่
Lawrence Dol

2
คำตอบนี้จะถูกลอกเลียนแบบจากที่นี่โดยไม่ต้องระบุแหล่งที่มาchimera.labs.oreilly.com/books/1230000000561/...
มาร์ค Lakata

4

โซลูชันที่ง่ายที่สุดพร้อมคำอธิบาย (โซลูชันที่ตรวจสอบซ้ำแล้วซ้ำอีก) (ต้องเผชิญกับปัญหาก่อน)

ปัญหาคือ:

1- ฉันไม่สามารถลบสาขาได้

2- เทอร์มินัลแสดงข้อความเตือนว่ามีคอมมิตบางอย่างที่ยังไม่ได้รับการอนุมัติ

3- ฉันรู้ว่าฉันตรวจสอบเจ้านายและสาขาและพวกเขาเหมือนกัน (ทันสมัย)

สารละลาย:

git checkout master
git merge branch_name
git checkout branch_name
git push
git checkout master
git branch -d branch_name

คำอธิบาย:

เมื่อสาขาของคุณเชื่อมต่อกับสาขาระยะไกล upstream (บน Github, bitbucket หรืออะไรก็ตาม) คุณจะต้องรวม (push) เข้ากับมาสเตอร์และคุณจะต้องผลักดันการเปลี่ยนแปลงใหม่ (กระทำ) ไปยัง repo ระยะไกล (Github, bitbucket หรือ อะไรก็ตาม) จากสาขา

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

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


3

เพื่อดูการเปลี่ยนแปลงที่ไม่ได้ผสานฉันทำสิ่งนี้:

git checkout experiment
git merge --no-commit master

git diff --cached

หมายเหตุ: การแสดงนี้การเปลี่ยนแปลงในที่ไม่อยู่ในmasterexperiment

อย่าลืม:

git merge --abort

เมื่อคุณดูเรียบร้อย


@IgorGanapolsky Dunno แน่นอน แต่โดยปกติman git-resetแล้วคำสั่ง git reset ก็เพียงพอที่จะกู้คืนจากปัญหาสถานะ
ThorSummoner

3

คุณสามารถคิดออก:

git log --cherry master ... ทดลองใช้

--cherry ตัวเลือกเป็นคำพ้องสำหรับ --right-only --cherry-mark --no-merges

หน้าคน git-log กล่าวว่า

มันมีประโยชน์ที่จะ จำกัด การส่งออกไปยังคอมมิชชันที่อยู่ด้านข้างของเราและทำเครื่องหมายสิ่งที่ถูกนำไปใช้กับอีกด้านหนึ่งของประวัติศาสตร์ที่ถูกแยกด้วยบันทึก git - cherry upstream ... mybranch คล้ายกับ git cherry upstream mybranch

FYI --cherry-pickละเว้นการกระทำที่เทียบเท่า แต่--cherry-marksไม่ เป็นประโยชน์ในการค้นหาการคืนเงินและบังคับให้มีการเปลี่ยนแปลงที่อัปเดตระหว่างสาขาต้นน้ำและสาขาสาธารณะที่ทำงานร่วมกัน


1

ฉันไม่ได้มีสาขาต้นน้ำในคอมไพล์ท้องถิ่นของฉัน ฉันได้สร้างสาขาท้องถิ่นจากต้นแบบชำระ git -b mybranch ฉันสร้างสาขาด้วย bitbucket GUI บน git upstream และผลักสาขาท้องถิ่นของฉัน (mybranch) ไปที่ branch upstream เมื่อฉันได้รับ git ในคอมไพล์ในพื้นที่ของฉันเพื่อดึงสาขาต้นน้ำฉันสามารถทำ git branch -d mybranch


0

ฉันเชื่อว่าธง--forceเป็นสิ่งที่คุณกำลังมองหา เพียงใช้git branch -d --force <branch_name>เพื่อลบสาขาโดยการบังคับ

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