ทำไม git จึงกลับบ่นเกี่ยวกับตัวเลือก -m ที่หายไป?


185

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

ร้ายแรง: Commit <SHA1> เป็นผสาน แต่ไม่มีการกำหนดตัวเลือก -m

นั่นหมายความว่าอย่างไร? เมื่อฉันรวมและมุ่งมั่นฉันใช้ตัวเลือก -m เพื่อพูดว่า "ผสานกับ <ชื่อผู้ใช้>"

ฉันทำอะไรผิดที่นี่

คำตอบ:


217

โดยค่าเริ่มต้นgit revertปฏิเสธที่จะคืนค่าผสานการกระทำเป็นความจริงที่ไม่ชัดเจน ฉันคิดว่าHEADในความเป็นจริงการรวมของคุณกระทำ

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

บ่อยครั้งนี้จะมีจำนวนผู้ปกครองหนึ่งเช่นถ้าคุณอยู่บนmasterและทำและก็ตัดสินใจที่จะกลับผสานของgit merge unwanted unwantedผู้ปกครองจะเป็นครั้งแรกก่อนการผสานของคุณสาขาและผู้ปกครองสองจะเป็นปลายของmasterunwanted

ในกรณีนี้คุณสามารถทำได้:

git revert -m 1 HEAD

4
โอเคขอบคุณ. ฉันพบว่าง่ายขึ้นเพียงแค่เปลี่ยนไฟล์สองไฟล์ที่ได้รับผลกระทบจากการรวมแล้วกำหนดการเปลี่ยนแปลงอื่น ๆ ของฉันด้วย
icnhzabot

43
ฉันจะหาข้อมูลได้อย่างไรว่าฉันต้องใช้ -m1 หรือ -m2, ... ?
Patrick Cornelissen

34
git cat-file -p [MERGE_COMMIT_ID]จะแสดงกิ่งแม่ตามลำดับ คนแรกที่ระบุไว้จะเป็นที่สอง-m 1 -m 2
nostromo

2
git revert [HASH] -m 2กำลังบอกฉันที่สาขา 1.x-1.x ไม่มีอะไรให้คอมมิททำงานทำความสะอาด แต่คอมมิทของฉันไม่เปลี่ยนกลับ
jenlampton

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

46

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

$ git lola
* 2582152 (HEAD, master) ผสานสาขา 'otherguy'
| \  
| * c7256de (otherguy) แถบ
* | b7e7176 baz
| /  
* 9968f79 foo

หมายเหตุ: git lolaเป็นนามแฝงที่ไม่ได้มาตรฐาน แต่มีประโยชน์

ไม่มีลูกเต๋าด้วยgit revert:

$ git ย้อนกลับ HEAD
ร้ายแรง: Commit 2582152 ... เป็นการรวมกัน แต่ไม่มีการกำหนดตัวเลือก -m

Charles Bailey ให้คำตอบที่ยอดเยี่ยมตามปกติ ใช้git revertเหมือนใน

$ git ย้อนกลับ - ไม่แก้ไข -m 1 HEAD
[master e900aad] เปลี่ยนกลับ "รวมสาขา 'otherguy'"
 มีการเปลี่ยนแปลง 0 ไฟล์, การแทรก 0 ครั้ง (+), การลบ 0 ครั้ง (-)
 โหมดลบ 100644 บาร์

ลบbarและสร้างประวัติของ

$ git lola
* e900aad (HEAD, master) เปลี่ยนกลับเป็น "รวมสาขา 'otherguy'"
* 2582152 รวมสาขา 'otherguy'
| \  
| * c7256de (otherguy) แถบ
* | b7e7176 baz
| /  
* 9968f79 foo

แต่ฉันสงสัยว่าคุณต้องการทิ้งการรวม:

$ git reset - ฮาร์ด HEAD ^
ตอนนี้ HEAD อยู่ที่ b7e7176 baz

$ git lola
* b7e7176 (HEAD, master) baz
| * c7256de (otherguy) แถบ
| /  
* 9968f79 foo

ตามที่ระบุไว้ในgit rev-parseคู่มือ

<rev>^เช่น HEAD ^v1.5.1^0
ส่วนต่อท้ายของ^พารามิเตอร์การแก้ไขหมายถึงพาเรนต์แรกของการคอมมิทวัตถุนั้น ^<n>หมายถึงผู้ปกครองn -th ( เช่น <rev>^เทียบเท่า<rev>^1) ในฐานะกฎพิเศษ<rev>^0หมายถึงการกระทำเองและใช้เมื่อ<rev>เป็นชื่อวัตถุของวัตถุแท็กที่อ้างถึงวัตถุที่กระทำ

ดังนั้นก่อนที่จะอัญเชิญgit reset, HEAD^(หรือHEAD^1) เป็น b7e7176 และHEAD^2เป็น c7256de, เช่นตามลำดับผู้ปกครองครั้งแรกและครั้งที่สองของการผสานกระทำ

ระวังด้วยgit reset --hardเพราะมันสามารถทำลายงานได้


3
มันผสมปนเปกันทำให้โลกสั่นคลอน ยกเว้นโลล่า ขอบคุณล้านนามแฝงที่ยอดเยี่ยมนี้
บาร์นีย์

วิธีง่ายๆในการเพิ่มlolaคำสั่ง git ของคุณ:git config --global alias.lola "log --graph --decorate --pretty=oneline --abbrev-commit --all"
D. Gibbs

8

ฉันมีปัญหานี้วิธีแก้ไขคือดูกราฟการกระทำ (โดยใช้ gitk) และดูว่าฉันมีสิ่งต่อไปนี้:

*   commit I want to cherry-pick (x)
|\  
| * branch I want to cherry-pick to (y)
* | 
|/  
* common parent (x)

ฉันเข้าใจแล้วว่าฉันต้องการจะทำ

git cherry-pick -m 2 mycommitsha

นี่เป็นเพราะ-m 1จะผสานกับผู้ปกครองทั่วไปที่-m 2รวมกันตามสาขา y นั่นคือสิ่งที่ฉันต้องการที่จะเลือกเชอร์รี่


1
อาจเป็นเพราะมันไม่เกี่ยวข้องgit-revertซึ่งเป็นสิ่งที่คำถามนี้เกี่ยวกับ
pnomolos

1
ผมคิดว่าคำถามนี้เป็นเรื่องเกี่ยวกับตัวเลือกที่ไม่เฉพาะเกี่ยวกับ-m git mergeนั่นคือเหตุผลที่อยู่เบื้องหลังการใช้-mตัวเลือกดูเหมือนจะคล้ายกันสำหรับการเปลี่ยนกลับและการหยิบเชอร์รี่ หากไม่เป็นจริงโปรดแจ้งให้เราทราบ เนื่องจากฉันไม่พบคำถามอื่นใดที่ตอบสนองการใช้งานของเชอร์รี่พิกต์โดยเฉพาะขอบคุณสำหรับคำตอบนี้ซึ่งอาจทำให้ Google ช่วยฉันหาคำถามนี้และมีประโยชน์อภิปรายที่เกี่ยวข้อง!
nealmcb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.