Git rebase แบบโต้ตอบไม่มีข้อผูกมัดในการเลือก


106

ฉันเป็นนายและฉันก็ทำ rebase -i <my_branch>

ได้รับสิ่งนี้:

noop

# Rebase c947bec..7e259d3 onto c947bec
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x <cmd>, exec <cmd> = Run a shell command <cmd>, and stop if it fails
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

ฉันต้องการเลือกคอมมิตบางส่วนไม่ใช่ทั้งหมดเนื่องจากบางส่วนไม่ได้รับการต้อนรับ นอกจากนี้คุณจะทำงานอย่างไรเมื่อคุณต้องการเก็บไฟล์บางไฟล์หรือเปลี่ยนแปลง 'local' ไปยังบางสาขาเสมอ? มีตัวช่วยบางอย่างเช่น.gitignore?

คำตอบ:


86

เช่นเดียวกับ rebase ที่ไม่ใช่เชิงโต้ตอบคุณต้องกำหนดฐานข้อมูลใหม่ให้กับคอมมิตเฉพาะ

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

ฉันไม่ทราบรายละเอียดเกี่ยวกับสถานการณ์ของคุณ แต่คุณอาจต้องการสิ่งนี้:

# Opportunity to edit or prune commits between origin/master and current branch
git rebase -i origin/master

หรือ

# Edit some of the last ten commits
git rebase -i HEAD~10 # Note that ~10 uses a tilde("~") not a dash("-"_) !

การใช้HEAD~*ไวยากรณ์ได้ผลสำหรับฉัน แต่อันแรกใช้ไม่ได้
Dev Yego

25

rebase -iหากไม่มีช่วงการคอมมิตจะไม่แสดงคอมมิตใด ๆ ในการสร้างฐานสุดท้ายใหม่ให้พูดว่า 7 commits ใช้สิ่งต่อไปนี้:

git rebase -i HEAD~7

โปรดระวังว่าสิ่งนี้จะเขียนประวัติศาสตร์ใหม่ อย่าทำถ้าการกระทำถูกผลักไปแล้ว


สำหรับคำถามที่สองของคุณ: มีสาขาที่มีการเปลี่ยนแปลงของคุณ (โดยทั่วไปคือสาขาการกำหนดค่า) และรวมสาขาอื่น ๆเข้าด้วยกันเป็นประจำ วิธีนี้การเปลี่ยนแปลงจะไม่ย้ายไปที่สาขาอื่น


9

เมื่อคุณใช้git rebase -iงานคุณมักจะต้องระบุว่าคุณต้องการทำ rebase เมื่อใด ตัวอย่างเช่นหากคุณต้องการลบการคอมมิตบางส่วนใน 10 รายการสุดท้ายของสาขาปัจจุบันคุณจะต้องทำ:

git rebase -i HEAD~10

6

ดังที่คนอื่นกล่าวถึงคุณต้องระบุช่วงการคอมมิต

git rebase -i <latest-commit-to-be-retained>

(สมมติว่าคุณอยู่ในสาขาเดียวกับการคอมมิตที่จะแก้ไข) -

ในการระบุการคอมมิตคุณสามารถใช้ HEAD ~ 5 shorthands หรือใช้ sha checksum (ซึ่งคุณจะได้รับgit log)

ในความเป็นจริงการกระทำใด ๆ จะเกิดขึ้นหากเป็นลำดับก่อนหน้า / บรรพบุรุษของคอมมิตที่คุณต้องการลบ / แก้ไข / reword ในโครงสร้าง นี่จะแสดงรายการคอมมิตทั้งหมดตั้งแต่<latest-commit-to-be-retained>ในเอดิเตอร์ (กำหนดไว้ในคอมไพล์ config ของคุณ) จากรายการหากต้องการลบคอมมิตเพียงลบบรรทัดนั้นบันทึกและออก (vi habbits :)) ไฟล์ + ตัวแก้ไขและทำgit rebase --continue

สำหรับคำตอบที่สองฉันเห็นด้วยกับ knittl

มีสาขาที่มีการเปลี่ยนแปลงของคุณ (โดยทั่วไปคือสาขาการกำหนดค่า) และรวมสาขาอื่น ๆ เข้าด้วยกันเป็นประจำ วิธีนี้การเปลี่ยนแปลงจะไม่ย้ายไปที่สาขาอื่น

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