วิธีการเลือกเชอร์รี่จากสาขาระยะไกล?


135

ฉันมีปัญหากับการเลือกเชอร์รี่ ในเครื่องของฉันฉันอยู่ในสาขา "master" ของฉัน ฉันต้องการเชอร์รี่ที่เลือกจากสาขาอื่นที่ชื่อว่า "ม้าลาย" สาขา "ม้าลาย" เป็นสาขาระยะไกล

ดังนั้นสถานะคอมไพล์:

# On branch master
nothing to commit (working directory clean)

ตกลงตอนนี้ฉันพยายามที่จะเลือกความมุ่งมั่นของเชอร์รี่:

git cherry-pick xyz
fatal: bad object xyz

ที่ "xyz" เป็นลายเซ็นของความมุ่งมั่นที่ฉันสนใจซึ่งเกิดขึ้นในสาขา "ม้าลาย"

ดังนั้นคำถามแรกที่ชัดเจนคือทำไมไม่สามารถหาคำมั่นสัญญาที่ฉันอ้างอิงได้ ฉันไม่เข้าใจจริงๆว่าวิธีนี้ทำงานในสถานที่แรกที่จะซื่อสัตย์ คอมไพล์เก็บบางสิ่งเช่นฐานข้อมูลของคอมมิทไว้ในไดเร็คทอรี่สำหรับทำงานของสาขาอื่นหรือไม่? เมื่อรันคำสั่ง cherry-pick มันจะไปและค้นหาฐานข้อมูลท้องถิ่นเพื่อค้นหาคำสั่งที่ฉันกำลังพูดถึงหรือไม่?

เนื่องจาก "zebra" เป็นสาขาระยะไกลฉันจึงคิดว่าฉันไม่มีข้อมูลในเครื่อง ดังนั้นฉันจึงเปลี่ยนสาขา:

git checkout zebra
Switched to branch 'zebra'

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

ฉันมีความเข้าใจผิดขั้นพื้นฐานเกี่ยวกับสิ่งที่เกิดขึ้นที่นี่ความช่วยเหลือใด ๆ จะดีมาก


2
ทุกอย่างดูเหมือนจะเป็นแนวคิด คุณแน่ใจหรือว่าคุณกำลังใช้แฮชที่ถูกต้อง (ลายเซ็นที่คุณเรียกว่า) ของการกระทำ? ลอง 'git show <hash>' เพื่อยืนยัน
0xc0de

สวัสดีค่ะใช่แล้ว - ทั้งสองสาขาของฉันขึ้นไปบน GitHub และฉันสามารถใช้พวกมันเพื่อค้นหาหน้าที่รับผิดชอบในวิธีนั้น ถ้าฉันเข้าใจสถานะของเครื่องของฉันในพื้นที่นั้นเป็นสิ่งที่ git ไม่สามารถหาแฮชจาก 'zebra' ในขณะที่อยู่ในบริบทของ 'master' ฉันต้องบอกว่า 'ม้าลาย' มีอยู่ในพื้นที่ด้วยหรือไม่
user291701

โอ้และทำ 'git show xyz' ให้ข้อผิดพลาดเดียวกัน "ร้ายแรง: วัตถุที่ไม่ดี" (และฉันกำลังแทนที่ xyz ด้วยแฮชที่ถูกต้อง)
user291701

และเพื่อชี้แจงฉันสามารถใช้แฮช 'xyz' เพื่อดูคอมมิทบน github โดยไม่มีปัญหาเช่น: " github.com/me/test/commit/xyz "
user291701

คำตอบ:


195

เนื่องจาก "ม้าลาย" เป็นสาขาระยะไกลฉันจึงคิดว่าฉันไม่มีข้อมูลในเครื่อง

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

# fetch just the one remote
git fetch <remote>
# or fetch from all remotes
git fetch --all
# make sure you're back on the branch you want to cherry-pick to
git cherry-pick xyz

1
ลิงก์ที่เก็บถาวร: archive.miek.nl/blog/archives/2011/12/13/ …
brianpeiris

1
ลองใช้วิธีนี้ในการเลือกรับอัปสตรีมต้นน้ำบน Github และปรากฎว่าแฮชที่เช็คเอาต์นั้นแตกต่างจากที่ติดตั้งบน Github ดังนั้นฉันจึงต้องตรวจสอบรับกัญชาและเชอร์รี่เลือกที่
DustWolf

1
ที่นี่หายไปจริงๆตัวเลือกในการส่งผ่านระยะไกลใน Cherry-pick เช่น: git cherry-pick <remote> <hash>
Jared

ทำงานได้ดีหลังจากดึงสาขาระยะไกล ขอบคุณ :)
Adeel

ใช่ทำงานหลังจากดึงฉันด้วย เพิ่มเติมเกี่ยวกับคอมไพล์เชอร์รี่เลือกที่มีให้บริการในatlassian.com/git/tutorials/cherry-pick
Satheesh M

12

เช่นเดียวกับภาคผนวกของคำตอบที่ยอมรับ OP:

หากคุณมีปัญหากับ

fatal: bad object xxxxx

นั่นเป็นเพราะคุณไม่สามารถเข้าถึงการกระทำนั้นได้ ซึ่งหมายความว่าคุณไม่มี repo ที่เก็บไว้ในเครื่อง แล้ว:

git remote add LABEL_FOR_THE_REPO REPO_YOU_WANT_THE_COMMIT_FROM
git fetch LABEL_FOR_THE_REPO
git cherry-pick xxxxxxx

โดยที่ xxxxxxx คือแฮชคอมมิตที่คุณต้องการ


อืมเมื่อฉันเพิ่ม repo แล้วโดยไม่มีการตั้งค่าสถานะ upstream?
Gobliins

10

การเพิ่ม repo ระยะไกล (ในฐานะ "foo") ซึ่งเราต้องการเลือกรับ

$ git remote add foo git://github.com/foo/bar.git

ดึงสาขาของพวกเขา

$ git fetch foo

แสดงรายการการกระทำ (สิ่งนี้ควรแสดงรายการการกระทำทั้งหมดในการดึงข้อมูลfoo)

$ git log foo/master

เชอร์รี่เลือกความมุ่งมั่นที่คุณต้องการ

$ git cherry-pick 97fedac

5

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


3

จำเป็นต้องดึงข้อมูลสาขาทั้งสองบนไดรฟ์ในเครื่องของคุณก่อน

สิ่งที่เกิดขึ้นคือความพยายามในการเลือกเชอร์รี่จากสาขา a ถึงสาขา -b ซึ่งในปัจจุบันคุณอยู่ที่สาขา -b แต่สำเนาสาขาสาขา a ยังไม่ได้รับการอัปเดต (คุณต้องทำการดึงคอมไพล์ ทั้งสองสาขาก่อน)

ขั้นตอน:
- เช็คเอาต์สาขา
git - git ดึงต้นกำเนิดสาขา - a
เช็คเอาต์ git สาขา
-b - ต้นกำเนิด git ดึงสาขา
-b - git cherry-pick <hash>

เอาท์พุท:
[branch-b <hash>] ข้อมูลบันทึก
ผู้แต่ง: ผู้แต่ง <ผู้เขียน
1 ไฟล์เปลี่ยนแปลงการแทรก 1 (+), 3 การลบ (-)


1

ฉันพบข้อผิดพลาดนี้หลังจากใช้รหัสการส่งข้อมูลจากแท็บการส่งคำขอเพื่อขอรหัสยืนยัน การกระทำนั้นถูกแบนและรวมเข้าด้วยกันในภายหลัง ในคำขอดึงข้อมูล GitHub ให้ค้นหาข้อความนี้: "ผสานกระทำ xxxxxxx เป็น ... " แทนที่จะพยายามใช้รหัสกระทำจากแท็บกระทำ


1

การกระทำที่ควรมีอยู่ในท้องถิ่นของคุณตรวจสอบโดยใช้ git logกระทำควรจะอยู่ในท้องถิ่นของคุณโดยใช้การตรวจสอบ

หากการกระทำไม่ปรากฏขึ้นให้ลองgit fetchอัพเดตโลคัลด้วยรีโมตล่าสุด


0

สิ่งนี้สามารถทำได้อย่างง่ายดายด้วย SourceTree:

  • ชำระเงินสาขาหลักของคุณ
  • เปิดแท็บ "บันทึก / ประวัติ"
  • ค้นหา xyz กระทำและคลิกขวาบนมัน
  • คลิกที่ "รวม ... "

เสร็จแล้ว :)


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

0

หากคุณได้รับข้อมูล แต่สิ่งนี้ยังคงเกิดขึ้นต่อไปนี้อาจเป็นเหตุผล

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

ในกรณีเช่นนี้ที่ repo ระยะไกล:

  1. git checkout xxxxx
  2. git checkout -b temp-branch

จากนั้นใน repo ของคุณดึงข้อมูลอีกครั้ง สาขาใหม่จะถูกดึงออกมารวมถึงการกระทำนั้น


0

ฉันแก้ไขปัญหานี้โดยไปที่สาขาด้วยความมุ่งมั่นที่ฉันต้องการเลือกเชอร์รี่

git checkout <branch With Commit To Cherry-Pick>

ใช้บันทึกเพื่อค้นหาแฮชการกระทำ

git log

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

git checkout < branch I Want To Place My Cherry-Picked-Hash In>

ในที่สุดเรียกเชอร์รี่เลือกจากคอมไพล์ (หมายเหตุ) -x คือการต่อท้ายข้อความเชอร์รี่เลือกของคุณไปที่เดิม "เมื่อบันทึกการคอมมิชชันให้เพิ่มบรรทัดที่ระบุว่า" (เชอร์รี่ที่เลือกจากคอมมิชชัน ... ) "ไปยังข้อความการส่งดั้งเดิมเพื่อระบุว่าการเปลี่ยนแปลงนี้กระทำโดยเชอร์รี่ใด ๆ "

git cherry-pick -x <your hash commit to add to the current branch>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.