ฉันได้ทำคอมไพล์และผลักดันในภายหลัง ฉันต้องการเปลี่ยนข้อความยืนยัน ถ้าฉันเข้าใจถูกต้องนี่ไม่แนะนำให้เลือกเพราะบางคนอาจดึงจากที่เก็บระยะไกลก่อนที่ฉันจะทำการเปลี่ยนแปลงดังกล่าว ถ้าฉันรู้ว่าไม่มีใครดึง?
มีวิธีทำเช่นนี้หรือไม่?
ฉันได้ทำคอมไพล์และผลักดันในภายหลัง ฉันต้องการเปลี่ยนข้อความยืนยัน ถ้าฉันเข้าใจถูกต้องนี่ไม่แนะนำให้เลือกเพราะบางคนอาจดึงจากที่เก็บระยะไกลก่อนที่ฉันจะทำการเปลี่ยนแปลงดังกล่าว ถ้าฉันรู้ว่าไม่มีใครดึง?
มีวิธีทำเช่นนี้หรือไม่?
คำตอบ:
หากเป็นการกระทำล่าสุดคุณสามารถทำสิ่งนี้ได้:
git commit --amend
สิ่งนี้จะนำตัวแก้ไขพร้อมข้อความยืนยันล่าสุดและช่วยให้คุณแก้ไขข้อความได้ (คุณสามารถใช้-m
หากคุณต้องการลบข้อความเก่าและใช้ข้อความใหม่)
จากนั้นเมื่อคุณกดให้ทำสิ่งนี้:
git push --force-with-lease <repository> <branch>
หรือคุณสามารถใช้ "+":
git push <repository> +<branch>
หรือคุณสามารถใช้--force
:
git push --force <repository> <branch>
ระวังเมื่อใช้คำสั่งเหล่านี้
หากมีคนอื่นผลักดันการเปลี่ยนแปลงในสาขาเดียวกันคุณอาจต้องการหลีกเลี่ยงการทำลายการเปลี่ยนแปลงเหล่านั้น --force-with-lease
ตัวเลือกที่เป็นที่ปลอดภัยที่สุดเพราะมันจะยกเลิกหากมีการเปลี่ยนแปลงใด ๆ ต้นน้ำ (
หากคุณไม่ได้ระบุสาขาอย่างชัดเจน Git จะใช้การตั้งค่าการพุชเริ่มต้น หากการตั้งค่าการกดเริ่มต้นของคุณคือ "การจับคู่" คุณอาจทำลายการเปลี่ยนแปลงในหลาย ๆ สาขาในเวลาเดียวกัน
ทุกคนที่ดึงแล้วจะได้รับข้อความแสดงข้อผิดพลาดและพวกเขาจะต้องอัปเดต (สมมติว่าพวกเขาไม่ได้ทำการเปลี่ยนแปลงด้วยตนเอง) โดยทำสิ่งนี้:
git fetch origin
git reset --hard origin/master # Loses local commits
reset --hard
ระมัดระวังในการใช้ หากคุณมีการเปลี่ยนแปลงสาขาการเปลี่ยนแปลงเหล่านั้นจะถูกทำลาย
ข้อมูลที่ถูกทำลายนั้นเป็นเพียงข้อความยืนยันเก่า แต่--force
ไม่ทราบและจะลบข้อมูลอื่นด้วยเช่นกัน ดังนั้นคิดว่า--force
เป็น "ฉันต้องการทำลายข้อมูลและฉันรู้ว่าข้อมูลใดถูกทำลาย" แต่เมื่อข้อมูลที่ถูกทำลายได้รับการยอมรับคุณสามารถกู้คืนคอมมิชชันเก่าได้จากการอ้างอิง - ข้อมูลนั้นเป็นเด็กกำพร้าแทนที่จะถูกทำลาย
ถ้าคุณไม่คิดว่าคุณกำลังทำลายข้อมูลแล้วอยู่ห่างจาก--force
... สิ่งเลวร้ายที่อาจจะเกิดขึ้น
นี่คือเหตุผลที่--force-with-lease
ค่อนข้างปลอดภัย
git push --force
ไม่มี <repository> และตัวเลือก <branch> ก็ใช้งานได้เช่นกันหากคุณตั้งค่าอัปสตรีม
<repository>
? มันคือorigin
อะไร org/repo
? หรือเพียงแค่repo
?
เพียงแค่พูดว่า :
git commit --amend -m "New commit message"
แล้ว
git push --force
git push origin <BRANCH-NAME>
ไม่ทำงานฉันต้องใช้git push --force
ตามที่อธิบายในคำตอบที่ยอมรับ
git push --force
ไม่เช่นนั้นแรงผลักดันจะไม่ผ่าน
ขั้นตอนที่ 1 : git rebase -i HEAD~n
ทำการ rebase เชิงโต้ตอบสำหรับการn
กระทำครั้งสุดท้ายที่ได้รับผลกระทบ (เช่นถ้าคุณต้องการเปลี่ยนข้อความคอมมิท 3 กระทำย้อนกลับให้ทำgit rebase -i HEAD~3
)
git จะปรากฏตัวแก้ไขขึ้นเพื่อจัดการคอมมิทเหล่านั้นให้สังเกตคำสั่งนี้:
# r, reword = use commit, but edit the commit message
นั่นคือสิ่งที่เราต้องการ!
ขั้นที่ 2 : เปลี่ยนpick
เป็นr
สำหรับคอมมิตที่คุณต้องการอัพเดตข้อความ ไม่ต้องเปลี่ยนการส่งข้อความที่นี่มันจะถูกเพิกเฉย คุณจะทำเช่นนั้นในขั้นตอนต่อไป บันทึกและปิดตัวแก้ไข
โปรดทราบว่าหากคุณแก้ไข 'แผน' การรีบูต แต่ยังไม่ได้เริ่มต้นกระบวนการให้คุณเปลี่ยนชื่อไฟล์ให้เรียกใช้:
git rebase --continue
หากคุณต้องการเปลี่ยนเท็กซ์เอดิเตอร์ที่ใช้สำหรับเซสชันแบบโต้ตอบ (เช่นจากค่าดีฟอลต์ vi เป็นนาโน) ให้รัน:
GIT_EDITOR=nano git rebase -i HEAD~n
ขั้นที่ 3 : Git จะปรากฏตัวแก้ไขอีกตัวสำหรับการแก้ไขทุกครั้งที่คุณวางไว้r
ก่อนหน้า อัปเดตการส่งข้อความตามที่คุณต้องการจากนั้นบันทึกและปิดตัวแก้ไข
ขั้นตอนที่ 4 : หลังจากที่ยอมรับข้อความทั้งหมดจะถูกอัปเดต คุณอาจต้องการทำgit push -f
เพื่ออัพเดตรีโมต
git rebase -i HEAD~3
git rebase --continue
ยังไม่ได้เริ่มต้นกระบวนการของการปล่อยให้คุณเปลี่ยนชื่อไฟล์ที่วิ่ง และถ้าคุณต้องการที่จะเปลี่ยนแปลงแก้ไขข้อความที่ใช้สำหรับเซสชั่นแบบโต้ตอบ (เช่นจากค่าเริ่มต้นvi
ไปnano
) GIT_EDITOR=nano git rebase -i HEAD~n
วิ่ง
ใช้สองขั้นตอนเหล่านี้ในคอนโซล:
git commit --amend -m "new commit message"
แล้ว
git push -f
เสร็จแล้ว :)
ควรสังเกตว่าถ้าคุณใช้push --force
ร่วมกับการอ้างอิงแบบหลายตัวพวกเขาทั้งหมดจะได้รับการแก้ไขตามผลลัพธ์ อย่าลืมว่า repo git ของคุณถูกตั้งค่าให้พุช โชคดีที่มีวิธีการป้องกันกระบวนการเล็กน้อยโดยการระบุสาขาเดียวเพื่อปรับปรุง อ่านจากหน้าคน git:
โปรดทราบว่า - บังคับใช้กับการอ้างอิงทั้งหมดที่ถูกผลักดังนั้นจึงใช้กับ push.default ที่ตั้งค่าให้ตรงกันหรือกับปลายทางการพุชที่กำหนดค่าด้วยรีโมต *. push อาจเขียนทับ refs นอกเหนือจากสาขาปัจจุบัน (รวมถึง refs ท้องถิ่นที่ อย่างเคร่งครัดหลังคู่ที่ห่างไกลของพวกเขา) หากต้องการบังคับให้กดไปที่สาขาเดียวให้ใช้ + ด้านหน้าของ refspec เพื่อดัน (เช่น git push Origin + master เพื่อบังคับให้กดไปที่สาขาหลัก)
หากคุณต้องการแก้ไขการคอมมิชชันเก่าไม่ใช่อันสุดท้ายคุณจะต้องใช้rebase
คำสั่งตามที่อธิบายไว้ที่นี่หน้าวิธีใช้ Githubบนแก้ไขเพิ่มเติมข้อความเก่าหรือหลายกระทำข้อความส่วน
คำสั่ง1
git commit --amend -m "New and correct message"
จากนั้น
คำสั่ง2
git push origin --force
git commit --amend
จากนั้นแก้ไขและเปลี่ยนข้อความในหน้าต่างปัจจุบัน หลังจากนั้นทำ
git push --force-with-lease
อีกตัวเลือกหนึ่งคือการสร้าง "errata commit" เพิ่มเติม (และพุช) ซึ่งอ้างอิงถึงวัตถุกระทำที่มีข้อผิดพลาด - errata กระทำใหม่ยังให้การแก้ไข errata commit เป็นการกระทำที่ไม่มีการเปลี่ยนแปลงรหัสที่สำคัญ แต่เป็นข้อความยืนยันที่สำคัญตัวอย่างเช่นเพิ่มอักขระเว้นวรรคหนึ่งตัวไปยังไฟล์ readme ของคุณและส่งการเปลี่ยนแปลงนั้นด้วยข้อความยืนยันที่สำคัญหรือใช้ตัวเลือก git--allow-empty
ของคุณและกระทำการเปลี่ยนแปลงว่ามีการกระทำที่สำคัญข้อความหรือใช้ตัวเลือกคอมไพล์ แน่นอนว่าง่ายกว่าและปลอดภัยกว่าการรีบูตมันไม่ได้แก้ไขประวัติจริงและทำให้ต้นไม้สาขาสะอาด (ใช้amend
เป็นตัวเลือกที่ดีถ้าคุณแก้ไขการคอมมิชชันล่าสุด แต่การคอมมิชชันแบบ errata อาจเป็นทางเลือกที่ดีสำหรับการคอมมิทรุ่นเก่า) ประเภทของสิ่งนี้เกิดขึ้นน้อยมากที่การบันทึกความผิดพลาดนั้นดีพอ ในอนาคตหากคุณต้องการค้นหาผ่านบันทึกการใช้คอมไพล์สำหรับคำหลักคุณลักษณะการกระทำดั้งเดิม (ผิดพลาด) อาจไม่ปรากฏเนื่องจากมีการใช้คำหลักผิดในการส่งต้นฉบับ (พิมพ์ต้นฉบับ) - อย่างไรก็ตามคำหลักจะปรากฏขึ้น ใน errata commit ซึ่งจะนำคุณไปยังการคอมมิทดั้งเดิมที่มีการพิมพ์ผิด นี่คือตัวอย่าง:
บันทึก $ git กระทำ 0c28141c68adae276840f17ccd4766542c33cf1d ผู้เขียน: ครั้งแรกที่ผ่านมา วันที่: พุธ 8 สิงหาคม 15:55:52 2018 -0600 ข้อผิดพลาด Errata: การกระทำนี้ไม่มีการเปลี่ยนแปลงรหัสที่สำคัญ การส่งนี้จัดทำขึ้นเพื่อบันทึกการแก้ไขข้อความการส่งก่อนหน้าเท่านั้น ที่เกี่ยวข้องกับการกระทำวัตถุ e083a7abd8deb5776cb304fa13731a4182a24be1 ข้อความคอมมิชชันเดิมไม่ถูกต้อง: เปลี่ยนสีพื้นหลังเป็นสีแดง การแก้ไข (* เน้นการเปลี่ยนแปลง *): เปลี่ยนสีพื้นหลังเป็น * blue * ส่งมอบ 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4 ผู้เขียน: ครั้งแรกที่ผ่านมา วันที่: พุธ 8 สิงหาคม 15:43:16 2018 -0600 ข้อความการส่งระหว่างกาลบางข้อความ ส่ง e083a7abd8deb5776cb304fa13731a4182a24be1 ผู้เขียน: ครั้งแรกที่ผ่านมา วันที่: พุธ 8 สิงหาคม 13:31:32 2018 -0600 เปลี่ยนสีพื้นหลังเป็นสีแดง
git commit -m “fixed feature A”
(สมมติว่าคอมไพล์ให้รหัสกระทำนี้เป็น e3ab7312 ... ... (ต่อมาคุณทราบว่าข้อความของคุณไม่ถูกต้องดังนั้นตอนนี้จึงทำการเปลี่ยนแปลงที่ไม่สำคัญกับไฟล์เช่นการเพิ่มช่องว่างในไฟล์ readme หรือใช้—allow-empty
ตัวเลือก git) .. git commit -m “Errata commit for previous commit e3ab7312... original message should have been ‘fixed feature *B*’
'' '
git notes
นี้จะให้บริการวัตถุประสงค์เดียวกันเป็น "errata กระทำ" เพียงเพิ่มบันทึกย่อในการคอมมิชชันก่อนหน้านี้เพื่อเพิ่มความคิดเห็นหรือแก้ไขข้อผิดพลาดใด ๆ ในข้อความคอมมิชชัน: https://git-scm.com/docs/git-notes
มันใช้งานได้ดีสำหรับฉัน
git checkout กำเนิด / branchname
หากคุณอยู่ในสาขาแล้วควรดึงหรือรีบูตดีกว่า
git pull
หรือ
git -c core.quotepath=false fetch origin --progress --prune
หลังจากนั้นคุณสามารถใช้
git commit --amend -m "Your message here"
หรือหากคุณต้องการเปิดโปรแกรมแก้ไขข้อความให้ใช้
git commit --amend
ฉันจะชอบใช้โปรแกรมแก้ไขข้อความหากคุณมีความคิดเห็นมากมาย คุณสามารถตั้งค่า text-editor ที่คุณต้องการด้วยคำสั่ง
git config --global core.editor your_preffered_editor_here
อย่างไรก็ตามเมื่อคุณเปลี่ยนข้อความการส่งข้อความเสร็จแล้วให้บันทึกและออก
จากนั้นเรียกใช้
git push --force
และคุณทำเสร็จแล้ว
ข้อมูลเพิ่มเติมสำหรับปัญหาเดียวกันหากคุณใช้งานท่อ bitbucket
แก้ไขข้อความของคุณ
git commit --amend
ผลักไปที่ตัด
git push --force <repository> <branch>
จากนั้นเพิ่ม - บังคับให้คำสั่ง push ของคุณบนไปป์ไลน์
git ftp push --force
การดำเนินการนี้จะลบการกระทำก่อนหน้าของคุณและผลักดันรายการปัจจุบันของคุณ
ลบ --force หลังจากกดครั้งแรก
ฉันลองมันบนท่อ bitbucket และมันใช้งานได้ดี