ฉันได้คอมมิตหลายครั้งในไฟล์ที่แตกต่างกัน แต่จนถึงตอนนี้ฉันต้องการที่จะส่งไปยังที่เก็บข้อมูลระยะไกลของฉันเฉพาะการกระทำที่เฉพาะเจาะจง
เป็นไปได้ไหม
ฉันได้คอมมิตหลายครั้งในไฟล์ที่แตกต่างกัน แต่จนถึงตอนนี้ฉันต้องการที่จะส่งไปยังที่เก็บข้อมูลระยะไกลของฉันเฉพาะการกระทำที่เฉพาะเจาะจง
เป็นไปได้ไหม
คำตอบ:
ในการเพิ่มความมุ่งมั่นที่กำหนดคุณสามารถเขียน:
git push <remotename> <commit SHA>:<remotebranchname>
มี<remotebranchname>
อยู่แล้วในรีโมท (หากไม่เป็นเช่นนั้นคุณสามารถใช้git push <remotename> <commit SHA>:refs/heads/<remotebranchname>
สร้างอัตโนมัติได้)
หากคุณต้องการที่จะผลักดันการกระทำโดยไม่ต้องมุ่งมั่นก่อนหน้านี้คุณควรใช้git rebase -i
เพื่อสั่งซื้อการกระทำ
git push <remotename> <commit SHA>:<remotebranchname>
โรงงาน เคล็ดลับคือการรวมเข้าด้วยกันgit rebase -i
เพื่อย้ายการคอมมิทที่คุณต้องการเป็นคอมมิชชันแรกและระบุว่า commit-sha
git push <remotename> <commit SHA>:refs/heads/<new remote branch name>
การสร้างสาขาที่สามารถทำได้ด้วย หลังจากนี้ให้กดตามคำตอบที่อธิบายไว้
git push origin HEAD~1:master
แต่การกระทำสุดท้ายที่มีชื่อมาตรฐานบางอย่าง
-f
ธง
คำตอบอื่น ๆ กำลังขาดคำอธิบายการเรียงลำดับใหม่
git push <remotename> <commit SHA>:<remotebranchname>
จะผลักดันการกระทำเดียว แต่การกระทำนั้นจะต้องเป็น OLDEST ในท้องถิ่นของคุณที่ไม่ได้ถูกผลักดันให้กระทำเพื่อไม่ให้สับสนกับการกระทำอันดับแรกหรือเคล็ดลับซึ่งเป็นคำอธิบายที่คลุมเครือในความคิดของฉัน ความมุ่งมั่นต้องการให้แก่การกระทำที่เก่าแก่ที่สุดของคุณนั่นคือการกระทำที่ไกลที่สุดจากการกระทำครั้งล่าสุดของคุณ หากไม่ใช่การกระทำที่เก่าแก่ที่สุดการกระทำทั้งหมดจาก SHA ที่เก่าที่สุดท้องถิ่นที่ไม่ใช่การผลักไปยัง SHA ที่ระบุจะถูกส่ง ในการจัดลำดับการคอมมิทใหม่ให้ใช้:
git rebase -i HEAD~xxx
หลังจากสั่งการคอมมิตใหม่คุณสามารถส่งไปยังที่เก็บข้อมูลรีโมตได้อย่างปลอดภัย
เพื่อสรุปฉันใช้
git rebase -i HEAD~<number of commits to SHA>
git push origin <post-rebase SHA>:master
เพื่อผลักดันการกระทำเดียวกับสาขาต้นแบบระยะไกลของฉัน
อ้างอิง:
ดูสิ่งนี้ด้วย:
ฉันขอแนะนำให้ใช้git rebase -i
; ย้ายการคอมมิทที่คุณต้องการผลักไปด้านบนสุดของคอมมิทที่คุณทำ จากนั้นใช้git log
เพื่อรับค่า SHA ของค่าคอมมิชชัน rebased ตรวจสอบและผลักดัน การรีบูตจะทำให้มั่นใจได้ว่าการกระทำอื่น ๆ ของคุณตอนนี้เป็นลูกของคุณที่ผลักดันดังนั้นการผลักอนาคตก็จะใช้ได้เช่นกัน
git log
ขั้นตอนอีกหรือไม่
Cherry-pick ใช้งานได้ดีที่สุดเมื่อเทียบกับวิธีอื่น ๆ ทั้งหมดในขณะที่กดการกระทำที่เฉพาะเจาะจง
วิธีที่จะทำคือ:
สร้างสาขาใหม่ -
git branch <new-branch>
อัปเดตสาขาใหม่ด้วยสาขาต้นทางของคุณ -
git fetch
git rebase
การกระทำเหล่านี้จะทำให้แน่ใจว่าคุณมีสิ่งเดียวกันกับที่มาของคุณ
เชอร์รี่เลือกสิ่งsha id
ที่คุณต้องการทำ -
git cherry-pick <sha id of the commit>
คุณสามารถรับsha id
โดยการเรียกใช้
git log
ผลักไปที่จุดเริ่มต้นของคุณ -
git push
เรียกใช้gitk
เพื่อดูว่าทุกอย่างมีลักษณะเหมือนที่คุณต้องการ
git rebase -i
จะเป็นโซลูชันที่สมบูรณ์แบบตามที่แนะนำในโซลูชันด้านบน ต้องใช้ Cherry pick เท่านั้นเมื่อคุณต้องการทำซ้ำการกระทำ
ฉันเชื่อว่าคุณจะต้อง "ย้อนกลับคอมไพล์" กลับไปที่การคอมมิทแล้วกดมัน หรือคุณสามารถคอมมิชชันcherry-pick
เป็นสาขาใหม่และผลักไปที่สาขาบนที่เก็บระยะไกล สิ่งที่ต้องการ:
git branch onecommit
git checkout onecommit
git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544 # From the other branch
git push origin {branch}
cherry-pick
ทำตามที่คุณต้องการ
คุณสามารถทำได้ในไดเรกทอรีอื่น: