ฉันเขียนสิ่งผิดในข้อความยืนยัน
ฉันจะเปลี่ยนข้อความได้อย่างไร ความมุ่งมั่นยังไม่ได้รับการผลักดัน
ฉันเขียนสิ่งผิดในข้อความยืนยัน
ฉันจะเปลี่ยนข้อความได้อย่างไร ความมุ่งมั่นยังไม่ได้รับการผลักดัน
คำตอบ:
git commit --amend
จะเปิดโปรแกรมแก้ไขช่วยให้คุณเปลี่ยนข้อความการส่งข้อความของข้อความยืนยันล่าสุด นอกจากนี้คุณสามารถตั้งค่าข้อความยืนยันโดยตรงในบรรทัดคำสั่งด้วย:
git commit --amend -m "New commit message"
... อย่างไรก็ตามสิ่งนี้สามารถทำให้ข้อความหลายบรรทัดส่งข้อความหรือแก้ไขได้ง่ายขึ้น
ตรวจสอบให้แน่ใจว่าคุณไม่มีการเปลี่ยนแปลงการคัดลอกการทำงานใด ๆ ที่จัดทำไว้ก่อนที่จะทำสิ่งนี้หรือพวกเขาจะได้รับการมุ่งมั่นเกินไป ( unstagedเปลี่ยนแปลงจะไม่ได้รับความมุ่งมั่น.)
หากคุณผลักดันการกระทำของคุณไปยังสาขาระยะไกลแล้ว - หลังจากแก้ไขข้อผูกพันในพื้นที่ (ดังที่อธิบายไว้ด้านบน) - คุณจะต้องบังคับให้ส่งการกระทำด้วย:
git push <remote> <branch> --force
# Or
git push <remote> <branch> -f
คำเตือน: แรงผลักดันจะเขียนทับสาขาที่ห่างไกลกับรัฐของหนึ่งในท้องถิ่นของคุณ หากมีการกระทำในสาขาระยะไกลที่คุณไม่ได้มีในสาขาท้องถิ่นของคุณคุณจะสูญเสียความมุ่งมั่นเหล่านั้น
คำเตือน: ใช้ความระมัดระวังเกี่ยวกับการแก้ไขการกระทำที่คุณได้แบ่งปันกับผู้อื่นแล้ว การแก้ไขมุ่งมั่นที่จะแก้ไขพวกเขาใหม่ให้มีSHA ID ที่แตกต่างกันซึ่งทำให้เกิดปัญหาหากคนอื่นมีสำเนาของการกระทำเก่าที่คุณเขียนใหม่ ทุกคนที่มีสำเนาของการกระทำเก่าจะต้องประสานงานของพวกเขากับการกระทำที่เขียนใหม่ของคุณซึ่งบางครั้งอาจเป็นเรื่องยากดังนั้นให้แน่ใจว่าคุณประสานงานกับผู้อื่นเมื่อพยายามที่จะเขียนประวัติศาสตร์การกระทำที่ใช้ร่วมกันหรือหลีกเลี่ยง โดยสิ้นเชิง
อีกตัวเลือกหนึ่งคือการใช้การปฏิเสธแบบโต้ตอบ การทำเช่นนี้ช่วยให้คุณสามารถแก้ไขข้อความใด ๆ ที่คุณต้องการอัปเดตแม้ว่าจะไม่ใช่ข้อความล่าสุด
ในการทำสควอช Git ให้ทำตามขั้นตอนเหล่านี้:
// n is the number of commits up to the last commit you want to be able to edit
git rebase -i HEAD~n
เมื่อคุณสควอชกระทำของคุณ - เลือกe/r
สำหรับการแก้ไขข้อความ:
เมื่อคุณใช้git rebase -i HEAD~n
อาจมีมากขึ้นกว่ากระทำ n Git จะ "รวบรวม" การคอมมิชชันทั้งหมดใน n การคอมมิทล่าสุดและถ้ามีการผสานที่ใดที่หนึ่งในช่วงนั้นคุณจะเห็นคอมมิททั้งหมดเช่นกันดังนั้นผลลัพธ์จะเป็น n +
หากคุณต้องทำมากกว่าสาขาเดียวและคุณอาจเผชิญความขัดแย้งเมื่อแก้ไขเนื้อหาให้ตั้งค่าgit rerere
และให้ Git แก้ไขข้อขัดแย้งเหล่านั้นโดยอัตโนมัติ
git commit --amend
git rebase -i
git commit --amend
สามารถแก้ไขการมอบหมายหลัก (a?)
git push -f origin branchname
git push -f
เป็นอันตรายหากคนอื่นกำลังใช้ที่เก็บเดียวกัน
git commit --amend -c HEAD
อีกครั้งให้ทำต่อ สิ่งนี้จะเปิดตัวแก้ไขที่เติมข้อมูลไว้ล่วงหน้าด้วยข้อความการส่งข้อความเก่าของคุณเพื่อให้คุณสามารถเปลี่ยนแปลงได้
git commit --amend -m "your new message"
หากความมุ่งมั่นที่คุณต้องการแก้ไขไม่ใช่สิ่งล่าสุด:
git rebase --interactive $parent_of_flawed_commit
หากคุณต้องการแก้ไขข้อผูกพันหลายข้อให้ส่งพาเรนต์ของอันที่เก่าแก่ที่สุดมาหนึ่งอัน
ตัวแก้ไขจะปรากฏขึ้นพร้อมกับรายการการกระทำทั้งหมดตั้งแต่ที่คุณให้
pick
เป็นreword
(หรือบน Git เวอร์ชันเก่าเป็นedit
) ด้านหน้าคำมั่นสัญญาใด ๆ ที่คุณต้องการแก้ไขสำหรับการกระทำที่คุณต้องการใส่ข้อความซ้ำ Git จะส่งคุณกลับไปที่เครื่องมือแก้ไขของคุณ สำหรับแต่ละการกระทำที่คุณต้องการแก้ไข Git จะนำคุณไปสู่เปลือก หากคุณอยู่ในเปลือก:
git commit --amend
git rebase --continue
ส่วนใหญ่ของลำดับนี้จะอธิบายให้คุณทราบโดยผลลัพธ์ของคำสั่งต่างๆที่คุณไป มันง่ายมาก; คุณไม่จำเป็นต้องจดจำ - เพียงจำไว้ว่าgit rebase --interactive
ให้คุณแก้ไขการกระทำได้ไม่ว่าจะนานแค่ไหนก็ตาม
โปรดทราบว่าคุณจะไม่ต้องการเปลี่ยนการกระทำที่คุณผลักไปแล้ว หรือบางทีคุณอาจจะทำ แต่ในกรณีนี้คุณจะต้องใช้ความระมัดระวังอย่างมากในการสื่อสารกับทุกคนที่ดึงความมุ่งมั่นของคุณและทำงานให้สำเร็จ ฉันจะกู้คืน / ซิงโครไนซ์ใหม่ได้อย่างไรหลังจากมีคนกด rebase หรือรีเซ็ตเป็นสาขาที่เผยแพร่
reword
แทนpick
การแก้ไขข้อความบันทึก
$parent_of_flawed_commit
$flawed_commit^
-p
( --preserve-merges
) หากมีการรวมหลังจากการคอมมิทที่มีข้อบกพร่อง
หากต้องการแก้ไขการกระทำก่อนหน้าให้ทำการเปลี่ยนแปลงที่คุณต้องการและจัดลำดับการเปลี่ยนแปลงเหล่านั้นแล้วเรียกใช้
git commit --amend
การดำเนินการนี้จะเปิดไฟล์ในโปรแกรมแก้ไขข้อความที่แสดงถึงข้อความยืนยันใหม่ของคุณ มันเริ่มต้นด้วยประชากรจากข้อความการส่งข้อความเก่าของคุณ เปลี่ยนข้อความการส่งข้อความตามที่คุณต้องการจากนั้นบันทึกไฟล์และออกจากโปรแกรมแก้ไขให้เสร็จ
ในการแก้ไขการคอมมิชชันก่อนหน้าและเก็บข้อความบันทึกเดิมให้รัน
git commit --amend -C HEAD
หากต้องการแก้ไขการคอมมิชชันก่อนหน้าโดยลบทั้งหมดให้รัน
git reset --hard HEAD^
หากคุณต้องการแก้ไขข้อความยืนยันมากกว่าหนึ่งข้อความให้เรียกใช้
git rebase -i HEAD~commit_count
(แทนที่commit_countด้วยจำนวนการคอมมิตที่คุณต้องการแก้ไข) คำสั่งนี้เรียกทำงานโปรแกรมแก้ไขของคุณ ทำเครื่องหมายการกระทำแรก (สิ่งที่คุณต้องการเปลี่ยน) เป็น "แก้ไข" แทน "เลือก" จากนั้นบันทึกและออกจากตัวแก้ไขของคุณ ทำการเปลี่ยนแปลงที่คุณต้องการกระทำแล้วเรียกใช้
git commit --amend
git rebase --continue
หมายเหตุ: นอกจากนี้คุณยังสามารถ "ทำการเปลี่ยนแปลงที่คุณต้องการ" จากตัวแก้ไขที่เปิดโดย git commit --amend
git rebase -i HEAD~commit_count
จะช่วยให้คุณเปลี่ยนข้อความการส่งข้อความของคอมมิชชันที่คุณเลือกได้ เพียงทำเครื่องหมายการกระทำที่เลือกไว้ว่า "reword" แทน "pick"
git reset --hard
ทำลายการเปลี่ยนแปลงที่ไม่มีข้อผูกมัด โปรดแทนที่ด้วย--hard
--soft
git reset --hard
เป็นคำสั่งที่ถูกต้องตามกฎหมายอย่างสมบูรณ์ แต่มันทำให้เข้าใจผิดได้รับคำถาม คุณใช้--hard
ถ้าคุณกระทำการเปลี่ยนแปลงที่คุณต้องการทิ้งไม่ใช่ว่าคุณพิมพ์ผิดในข้อความยืนยัน!
ดังที่ได้กล่าวไปแล้วgit commit --amend
คือวิธีการเขียนทับคำสั่งล่าสุด One note: หากคุณต้องการเขียนทับไฟล์คำสั่งก็จะเป็นเช่นกัน
git commit -a --amend -m "My new commit message"
git add file.ext
ก่อนอื่นเพียงgit commit --amend
คุณยังสามารถใช้git filter-branch
สำหรับสิ่งนั้น
git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD
มันไม่ใช่เรื่องง่ายเหมือนเรื่องเล็กน้อยgit commit --amend
แต่มีประโยชน์อย่างยิ่งหากคุณมีการรวมบางอย่างหลังจากข้อความคอมมิทที่ผิดพลาด
หมายเหตุที่ว่านี้จะพยายามที่จะเขียนทุกกระทำระหว่างHEAD
และข้อบกพร่องกระทำดังนั้นคุณควรเลือกของคุณmsg-filter
คำสั่งอย่างชาญฉลาดมาก ;-)
$flawed_commit^..HEAD
$flawed_commit..HEAD
ตามที่ระบุไว้ใน man page: « คำสั่งจะเขียนเฉพาะ refs เชิงบวกที่กล่าวถึงในบรรทัดคำสั่ง (เช่นถ้าคุณผ่าน a .. b, b เท่านั้นจะถูกเขียนใหม่) »
ฉันชอบวิธีนี้:
git commit --amend -c <commit ID>
มิฉะนั้นจะมีการส่งมอบใหม่พร้อมกระทำการส่งมอบใหม่
-c
สิ่งที่ไม่กี่ มันใช้ข้อความเก่าโดยค่าเริ่มต้น แต่ก็ยังคัดลอกข้อมูลการประพันธ์ (บุคคลและเวลา) -C
ทำสิ่งเดียวกันยกเว้นว่าจะไม่ขอให้คุณแก้ไขข้อความ
fatal: Option -m cannot be combined with -c/-C/-F/--fixup.
หากคุณกำลังใช้เครื่องมือ Git GUI มีปุ่มชื่อแก้ไขครั้งสุดท้าย คลิกที่ปุ่มนั้นแล้วมันจะแสดงไฟล์และข้อความคอมมิทล่าสุดของคุณ เพียงแค่แก้ไขข้อความนั้นและคุณสามารถส่งข้อความด้วยข้อความยืนยันใหม่
หรือใช้คำสั่งนี้จากคอนโซล / เทอร์มินัล:
git commit -a --amend -m "My new commit message"
คุณสามารถใช้Git rebasing ตัวอย่างเช่นหากคุณต้องการแก้ไขกลับเพื่อส่งมอบ bbc643cd ให้รัน
$ git rebase bbc643cd^ --interactive
ในเครื่องมือแก้ไขเริ่มต้นให้แก้ไข 'เลือก' เป็น 'แก้ไข' ในบรรทัดที่คุณต้องการแก้ไข ทำการเปลี่ยนแปลงของคุณจากนั้นจึงเปลี่ยนพวกเขาด้วย
$ git add <filepattern>
ตอนนี้คุณสามารถใช้
$ git commit --amend
เพื่อแก้ไขการกระทำและหลังจากนั้น
$ git rebase --continue
เพื่อย้อนกลับไปที่การกระทำก่อนหน้า
git commit --amend
มีผลคุณสามารถใช้git show
และมันจะแสดงข้อความใหม่
หากคุณต้องการแก้ไขข้อความการส่งข้อความครั้งล่าสุดเท่านั้นให้ทำดังนี้
git commit --amend
สิ่งนั้นจะนำคุณไปสู่โปรแกรมแก้ไขข้อความและให้คุณเปลี่ยนข้อความการส่งข้อความครั้งล่าสุด
หากคุณต้องการเปลี่ยนข้อความการส่งข้อความสามข้อความล่าสุดหรือข้อความการส่งข้อความถึงจุดนั้นHEAD~3
ให้ระบุgit rebase -i
คำสั่ง:
git rebase -i HEAD~3
git commit --amend
และยังบอกว่าคุณสามารถใช้git rebase -i HEAD~commit_count
สิ่งที่คุณไม่ได้เสียบสำหรับ3
commit_count
หากคุณต้องเปลี่ยนข้อความการส่งข้อความเก่าในหลายสาขา (เช่นการส่งข้อความที่มีข้อผิดพลาดมีอยู่ในหลายสาขา) คุณอาจต้องการใช้:
git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all
Git refs/original/
จะสร้างไดเรกทอรีชั่วคราวสำหรับการเขียนและการอ้างอิงเก่าสำรองเพิ่มใน
-f
จะบังคับใช้การดำเนินการ นี่เป็นสิ่งจำเป็นหากไดเรกทอรีชั่วคราวมีอยู่แล้วหรือมีการอ้างอิงที่เก็บไว้refs/original
แล้ว หากไม่เป็นเช่นนั้นคุณสามารถปล่อยธงนี้
--
แยกตัวเลือกสาขาตัวกรองออกจากตัวเลือกการแก้ไข
--all
จะทำให้แน่ใจว่าสาขาและแท็กทั้งหมดถูกเขียนใหม่
เนื่องจากการสำรองข้อมูลอ้างอิงเก่าของคุณคุณสามารถกลับไปที่สถานะก่อนดำเนินการคำสั่งได้อย่างง่ายดาย
สมมติว่าคุณต้องการกู้คืนต้นแบบของคุณและเข้าถึงในสาขาold_master
:
git checkout -b old_master refs/original/refs/heads/master
git commit --amend
เพื่อแก้ไขความคิดเห็นหรือเพิ่มไฟล์ที่ฉันลืมgit add
แต่เคยมีมาก่อนที่ฉันจะgit push
แก้ไข ฉันยังใช้git filter-branch
เมื่อฉันต้องการยุ่งกับประวัติรุ่นโดยสิ้นเชิง แต่ OP ไม่ต้องการสิ่งนี้ดังนั้นคำตอบนี้จำเป็นต้องมีคำเตือนเรื่องสุขภาพ - อย่าลองทำที่บ้านดูสิ !!
ใช้
git commit --amend
เพื่อให้เข้าใจในรายละเอียดการโพสต์ที่ยอดเยี่ยม4. การเขียนใหม่ประวัติศาสตร์ นอกจากนี้ยังพูดถึงเกี่ยวกับเมื่อไม่ใช้งาน git commit --amend
git commit --amend
คำตอบที่ได้รับการกำหนด (หลายครั้ง) ก่อนที่คุณเขียนแสดงความนับถือ ทำไมคุณโพสต์อีกครั้ง หากคุณต้องการเพิ่มลิงค์ไปยัง "เขียนประวัติ Git ใหม่" คุณสามารถแก้ไขหนึ่งในคำตอบที่มีอยู่หรือออกความคิดเห็น
คุณมีตัวเลือกสองทางที่นี่ คุณทำได้
git commit --amend
ตราบใดที่คุณยังเป็นคนสุดท้าย
มิเช่นนั้นหากไม่ใช่การกระทำครั้งสุดท้ายของคุณคุณสามารถทำการปฏิเสธแบบโต้ตอบได้
git rebase -i [branched_from] [hash before commit]
จากนั้นภายใน rebase เชิงโต้ตอบคุณเพียงแค่เพิ่มการแก้ไขในการกระทำนั้น เมื่อเกิดขึ้นให้ทำgit commit --amend
และแก้ไขข้อความคอมมิท หากคุณต้องการย้อนกลับก่อนจุดส่งมอบคุณสามารถใช้git reflog
และเพียงลบการส่งมอบ จากนั้นคุณทำgit commit
อีกครั้ง
หากเป็นการกระทำครั้งสุดท้ายของคุณเพียงแก้ไขการกระทำ:
git commit --amend -o -m "New commit message"
(ใช้แฟล็ก-o
( --only
) เพื่อให้แน่ใจว่าคุณเปลี่ยนเฉพาะข้อความยืนยัน)
ถ้าเป็นการกระทำที่ถูกฝังอยู่ให้ใช้rebase เชิงโต้ตอบที่ยอดเยี่ยม :
git rebase -i @~9 # Show the last 9 commits in a text editor
ค้นหาการกระทำที่คุณต้องการเปลี่ยนpick
เป็นr
( reword
) และบันทึกและปิดไฟล์ ทำ!
กวดวิชาขนาดเล็กจิ้ม (หรือวิธีการรีบูตด้วยการกดแป้นเพียง 8 ครั้ง3j
cw
r
EscZZ
):
vimtutor
หากคุณมีเวลาh
j
k
l
สอดคล้องกับปุ่มการเคลื่อนไหว ←↓↑→3j
เลื่อนลงสามบรรทัดi
เพื่อเข้าสู่โหมดแทรก - ข้อความที่คุณพิมพ์จะปรากฏในไฟล์c
เพื่อออกจากโหมดแทรกและกลับสู่โหมด "ปกติ"u
เพื่อยกเลิกr
เพื่อทำซ้ำdd
, dw
, dl
ลบบรรทัดคำหรือตัวอักษรตามลำดับcc
, cw
, cl
การเปลี่ยนแปลงบรรทัดคำหรือตัวอักษรตามลำดับ (เหมือนdd
i
)yy
, yw
, yl
การคัดลอก ( "งัด") บรรทัดคำหรือตัวอักษรตามลำดับp
หรือP
เพื่อวางหลังหรือก่อนตำแหน่งปัจจุบันตามลำดับ:w
Enter เพื่อบันทึก (เขียน) ไฟล์:q!
Enter เพื่อเลิกโดยไม่บันทึก:wq
EnterหรือZZ
เพื่อบันทึกและออกหากคุณแก้ไขข้อความจำนวนมากให้สลับไปที่รูปแบบแป้นพิมพ์ Dvorakเรียนรู้วิธีพิมพ์ด้วยสัมผัสและเรียนรู้ Vim มันคุ้มค่ากับความพยายามหรือไม่? ใช่.
ProTip ™: อย่ากลัวที่จะทดสอบด้วยคำสั่ง "อันตราย" ที่เขียนประวัติใหม่ * - Git จะไม่ลบการกระทำของคุณเป็นเวลา 90 วันโดยค่าเริ่มต้น คุณสามารถค้นหาได้ใน reflog:
$ git reset @~3 # Go back three commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started
* ระวังตัวเลือกเช่น--hard
และ--force
- พวกเขาสามารถทิ้งข้อมูล
* นอกจากนี้อย่าเขียนประวัติในสาขาใด ๆ ที่คุณร่วมมือ
nano
? เรากำลังพูดถึงการดัดแปลงเล็กน้อยที่จำเป็นต้องทำกับไฟล์ข้อความไม่ใช่การเข้ารหัสฮาร์ดคอร์ที่จะสร้างสงครามลุกลี้เกี่ยวกับโปรแกรมแก้ไขข้อความ "ดีที่สุด"
ddjjpZZ
ย้ายกระทำ 2 ลง ไม่มีอะไรที่เป็นความลับเกี่ยวกับความรู้ Vim พื้นฐาน ใช้เวลา 10 นาทีในการรู้สึกสะดวกสบายยิ่งขึ้นเมื่อใช้ Vim มากกว่านาโน
หากคุณใช้ Git GUI คุณสามารถแก้ไขการคอมมิทครั้งล่าสุดที่ยังไม่ได้กด:
Commit/Amend Last Commit
ฉันใช้Git GUIมากเท่าที่จะทำได้และนั่นทำให้คุณมีตัวเลือกในการแก้ไขการส่งมอบครั้งล่าสุด:
นอกจากนี้ยังgit rebase -i origin/master
เป็นมนต์ที่ดีที่จะนำเสนอคุณเสมอกับการกระทำที่คุณได้ทำไว้ด้านบนของต้นแบบและให้คุณเลือกที่จะแก้ไขลบเรียงลำดับหรือสควอช ไม่จำเป็นต้องถือแฮชนั้นก่อน
ว้าวดังนั้นมีหลายวิธีในการทำเช่นนี้
อีกวิธีหนึ่งในการทำเช่นนี้คือการลบการส่งมอบครั้งล่าสุด แต่ให้เปลี่ยนแปลงเพื่อไม่ให้งานของคุณสูญหาย จากนั้นคุณสามารถทำคอมมิทอื่นด้วยข้อความที่ถูกแก้ไข นี่จะมีลักษณะดังนี้:
git reset --soft HEAD~1
git commit -m 'New and corrected commit message'
ฉันมักจะทำสิ่งนี้ถ้าฉันลืมเพิ่มไฟล์หรือทำการเปลี่ยนแปลง
จำไว้ว่าให้ระบุ--soft
แทน--hard
มิฉะนั้นคุณจะเสียความมุ่งมั่นทั้งหมดไป
git commit --amend
ยกเว้นว่าเป็นกระบวนการ 2 ขั้นตอน
--amend
จะเก็บข้อมูลผู้แต่ง แต่คำถามเพียงขอให้เปลี่ยนข้อความ
สำหรับใครที่กำลังมองหาที่ใช้ Windows / Mac GUI เพื่อความช่วยเหลือเกี่ยวกับการแก้ไขข้อความที่เก่า (คือไม่ได้เป็นเพียงข้อความล่าสุด) ผมอยากแนะนำให้Sourcetree ขั้นตอนในการติดตามมีดังนี้
สำหรับการคอมมิทที่ยังไม่ได้ถูกส่งไปยังรีโมต:
Unable to create 'project_path/.git/index.lock': File exists.
เมื่อพยายามแก้ไขข้อความยืนยันหลายข้อความพร้อมกัน ไม่แน่ใจว่าสิ่งที่เป็นปัญหาหรือไม่ว่าจะได้รับการแก้ไขใน Sourcetree รุ่นในอนาคต แต่ถ้าเกิดเหตุการณ์นี้ขอแนะนำให้ทำการรีบูตทีละครั้ง (ช้ากว่า แต่น่าเชื่อถือกว่า)... หรือ ... สำหรับการกระทำที่ถูกผลักไปแล้ว:
ทำตามขั้นตอนในคำตอบนี้ซึ่งคล้ายกับด้านบน แต่ต้องการคำสั่งเพิ่มเติมที่จะเรียกใช้จากบรรทัดคำสั่ง ( git push origin <branch> -f
) เพื่อบังคับให้ดันสาขา ฉันขอแนะนำให้อ่านทั้งหมดและใช้ความระมัดระวังที่จำเป็น!
หากคุณต้องการแก้ไขการคอมมิชชันล่าสุดให้ใช้:
git commit --amend
หรือ
git commit --amend -m 'one line message'
แต่ถ้าคุณต้องการแก้ไขหลายคอมมิทในแถวคุณควรใช้การรีบูตแทน:
git rebase -i <hash of one commit before the wrong commit>
ในไฟล์เช่นเดียวกับข้างบนเขียนedit/e
หรือหนึ่งในตัวเลือกอื่น ๆ แล้วกดบันทึกและออก
ตอนนี้คุณจะผิดที่กระทำครั้งแรก ทำการเปลี่ยนแปลงในไฟล์และพวกเขาจะถูกจัดฉากให้คุณโดยอัตโนมัติ ชนิด
git commit --amend
บันทึกและออกจากนั้นและพิมพ์
git rebase --continue
เพื่อย้ายไปยังตัวเลือกถัดไปจนกว่าจะเสร็จสิ้นด้วยการเลือกทั้งหมดของคุณ
โปรดทราบว่าสิ่งเหล่านี้เปลี่ยนแฮช SHA ของคุณทั้งหมดหลังจากการคอมมิทนั้น
หากคุณต้องการเปลี่ยนข้อความล่าสุดคุณควรใช้การ--only
ตั้งค่าสถานะหรือทางลัด-o
ด้วยcommit --amend
:
git commit --amend -o -m "New commit message"
สิ่งนี้ช่วยให้มั่นใจได้ว่าคุณจะไม่เพิ่มความมุ่งมั่นกับสิ่งที่จัดฉาก แน่นอนว่าควรมีการ$EDITOR
กำหนดค่าที่เหมาะสม จากนั้นคุณสามารถปล่อยให้-m
ตัวเลือกออกมาและ Git จะเติมข้อความกระทำการไว้ล่วงหน้าด้วยข้อความเก่า ด้วยวิธีนี้สามารถแก้ไขได้ง่าย
git commit --amend
มันก็จะช่วยให้การแนะนำทั่วไป คำถามนั้นเจาะจงมากดังนั้นอีกต่อไป! = ดีกว่า การเอ่ยถึงการแตกหักของ-o
ธงอาจจะถูกฝังอยู่ในข้อมูลที่เหลือ ฉันยังไม่สบายใจที่จะแก้ไขคำตอบที่มีคะแนนโหวตจำนวนมากอยู่แล้ว
--only
ตัวเลือก--amend
จะพร้อมใช้งานตั้งแต่ git 1.3.0 แต่ก็ไม่ทำงานอย่างถูกต้องจนกว่าจะได้รับการแก้ไขใน 1.7.11.3 ( ea2d4ed35902ce15959965ab86d80527731a177c ) ดังนั้นคำตอบกลับมาทางขวาในปี 2008 git stash; git commit --amend; git stash pop
อาจจะได้รับสิ่งที่ต้องการ:
อัปเดตข้อความการส่งข้อความผิดครั้งล่าสุดด้วยข้อความการส่งข้อความใหม่ในบรรทัดเดียว:
git commit --amend -m "your new commit message"
หรือลองรีเซ็ต Git เหมือนด้านล่าง:
# You can reset your head to n number of commit
# NOT a good idea for changing last commit message,
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^
# It will reset you last commit. Now, you
# can re-commit it with new commit message.
git reset
สามารถช่วยคุณแบ่งข้อผูกพันออกเป็นหลายข้อผูกพันเช่นกัน:
# Reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (You can reset multiple commit by doing HEAD~2(no. of commits)
# Now, reset your head for splitting it to multiple commits
git reset HEAD
# Add and commit your files separately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"
git add config/
git commit -m "add all files in config directory"
ที่นี่คุณประสบความสำเร็จในการทำลายคำสั่งสุดท้ายเป็นสองคอมมิท
git commit --amend
, เหมือนวิธีการที่จะกล่าวว่าในด้านบนลงมติคำตอบ นอกจากนี้ยังgit reset --soft HEAD^
ทำงานเหมือนกันกับการรีเซ็ตแบบซอฟต์ในคำตอบก่อนหน้านี้เพราะทั้งคู่รีเซ็ตกลับไปเป็นพาเรนต์แรกที่คอมมิท
git reset
ในการแก้ปัญหาเพียงเพื่อให้ความคิดในการแยกข้อความคอมมิชชันหนึ่งออกเป็นข้อความการคอมมิตหลายข้อความ git
เพราะผมได้ประสบปัญหาว่าเมื่อผมได้เริ่มต้นที่จะใช้ บางครั้งสิ่งนี้สามารถช่วยได้จริงๆ :)
ในคำถามนี้มีคำตอบมากมาย แต่ไม่มีคำอธิบายในรายละเอียดวิธีการเปลี่ยนข้อความยืนยันเก่าโดยใช้Vimเป็นกลุ่มฉันพยายามอย่างยิ่งที่จะทำสิ่งนี้ด้วยตัวเองดังนั้นที่นี่ฉันจะเขียนรายละเอียดเกี่ยวกับวิธีการทำสิ่งนี้โดยเฉพาะสำหรับผู้ที่ไม่มีประสบการณ์ใน Vim!
ฉันต้องการเปลี่ยนห้าข้อผูกพันล่าสุดที่ฉันผลักไปยังเซิร์ฟเวอร์แล้ว สิ่งนี้ค่อนข้าง 'อันตราย' เพราะถ้ามีคนอื่นดึงคุณออกไปจากสิ่งนี้คุณสามารถทำสิ่งต่าง ๆ โดยการเปลี่ยนข้อความการส่งข้อความ อย่างไรก็ตามเมื่อคุณทำงานในสาขาเล็ก ๆ ของคุณและแน่ใจว่าไม่มีใครดึงมันมาได้คุณสามารถเปลี่ยนได้ดังนี้:
สมมติว่าคุณต้องการเปลี่ยนการกระทำล่าสุดห้ารายการจากนั้นคุณพิมพ์สิ่งนี้ในเทอร์มินัล:
git rebase -i HEAD~5
* โดยที่ 5 คือจำนวนข้อความการส่งที่คุณต้องการเปลี่ยน (ดังนั้นหากคุณต้องการเปลี่ยนการส่งข้อความที่ 10 เป็นครั้งสุดท้ายให้พิมพ์ 10)
คำสั่งนี้จะนำคุณเข้าสู่กลุ่มที่นั่นคุณสามารถ 'แก้ไข' ประวัติการกระทำของคุณ คุณจะเห็นห้าอันดับสุดท้ายของคุณที่ด้านบนดังนี้:
pick <commit hash> commit message
แทนการที่คุณจำเป็นต้องเขียนpick
คุณสามารถทำเช่นนี้ในกลุ่มโดยการพิมพ์ในreword
i
นั่นทำให้คุณเข้าสู่โหมดแทรก (คุณเห็นว่าคุณอยู่ในโหมดแทรกโดยใช้คำว่าINSERTที่ด้านล่าง) สำหรับคอมมิทที่คุณต้องการเปลี่ยนให้พิมพ์reword
แทนpick
แทน
จากนั้นคุณต้องบันทึกและออกจากหน้าจอนี้ คุณทำได้โดยไปที่ 'โหมดคำสั่ง' โดยกดEscปุ่ม (คุณสามารถตรวจสอบว่าคุณอยู่ในโหมดคำสั่งหากคำว่าINSERTที่ด้านล่างหายไป) :
จากนั้นคุณสามารถพิมพ์คำสั่งโดยการพิมพ์ wq
คำสั่งในการบันทึกและออกจากการมี ดังนั้นหากคุณพิมพ์:wq
คุณอยู่ในเส้นทางที่ถูกต้อง
จากนั้นกลุ่มจะดำเนินการกับข้อความยืนยันทุกข้อความที่คุณต้องการป้อนข้อความอีกครั้งและที่นี่คุณสามารถเปลี่ยนข้อความยืนยันได้ คุณจะทำสิ่งนี้โดยเข้าสู่โหมดแทรกเปลี่ยนการส่งข้อความเข้าสู่โหมดคำสั่งและบันทึกและออก ทำสิ่งนี้ห้าครั้งแล้วคุณก็ออกไปเป็นกลุ่ม!
จากนั้นหากคุณผลักดันการกระทำผิดของคุณไปแล้วคุณจำเป็นต้องgit push --force
เขียนทับพวกเขา โปรดจำไว้ว่าgit push --force
มันเป็นสิ่งที่อันตรายที่ต้องทำดังนั้นโปรดตรวจสอบให้แน่ใจว่าไม่มีใครถูกดึงออกจากเซิร์ฟเวอร์ตั้งแต่คุณทำผิดพลาด!
ตอนนี้คุณเปลี่ยนข้อความคอมมิตของคุณแล้ว!
(อย่างที่คุณเห็นฉันไม่ได้มีประสบการณ์ใน Vim ดังนั้นถ้าฉันใช้ 'lingo' ผิดเพื่ออธิบายสิ่งที่เกิดขึ้นรู้สึกฟรีเพื่อแก้ไขฉัน!)
<nitpick>
ไม่มี "กระทู้" ใน Stack Overflow เนื่องจากไม่ใช่กระดานสนทนามีเพียง "คำถาม", "คำตอบ" และ "โพสต์" </nitpick>
. นอกจากนี้เวอร์ชันทั้งหมดของ Vim จะไม่เหมือนกันไม่ใช่ทั้งหมดที่จะให้คุณลบตัวอักษรในโหมดแทรก (เข้าท่าใช่ไหม?) หากคุณต้องการที่จะสามารถลบตัวอักษรในกลุ่มX
และx
จะทำเช่นนั้น ( x
ลบตัวอักษรเล็ก ๆ ที่ด้านหน้าของเคอร์เซอร์X
จะลบด้านหลัง) หากคุณทำผิดพลาดคุณสามารถใช้u
ซ้ำ ๆ เพื่อเลิกทำ ในที่สุดr
ก็มีการจดชวเลขreword
ในตัวแก้ไขการปฏิเสธแบบโต้ตอบ
cw
พิมพ์ที่จุดเริ่มต้น (แม้ว่าคำถามจะไม่เกี่ยวกับกลุ่มฉันเห็นด้วย)
nano
mcedit ของผู้บัญชาการ Midnight
คุณสามารถใช้git-rebase-reword
มันถูกออกแบบมาเพื่อแก้ไขการกระทำใด ๆ (ไม่ใช่แค่ครั้งสุดท้าย) เช่นเดียวกับ commit --amend
$ git rebase-reword <commit-or-refname>
มันตั้งชื่อตามการกระทำบน rebase แบบโต้ตอบเพื่อแก้ไขการกระทำ: "reword" ดูโพสต์นี้และโหมดโต้ตอบแบบมนุษย์ - ส่วน -
ตัวอย่าง:
$ git rebase-reword b68f560
$ git rebase-reword HEAD^
g c; g rb -i @~9
(commit และ rebase) ย้ายคอมมิทใหม่ไปยังตำแหน่งที่ฉันต้องการเปลี่ยนcommit
เป็นf
( fixup
) และบันทึก หากคุณต้องการบางสิ่งที่เร็วกว่านั้นคุณสามารถใช้นามแฝงได้ git commit --fixup=<commit>; git rebase -i --autosquash <commit>^
ฉันได้เพิ่มนามแฝงreci
และrecm
สำหรับrecommit (amend)
มัน ตอนนี้ฉันสามารถทำได้ด้วยgit recm
หรือgit recm -m
:
$ vim ~/.gitconfig
[alias]
......
cm = commit
reci = commit --amend
recm = commit --amend
......
ฉันรู้ว่าฉันผลักความมุ่งมั่นด้วยการพิมพ์ผิดในนั้น เพื่อที่จะเลิกทำฉันทำสิ่งต่อไปนี้:
git commit --amend -m "T-1000, advanced prototype"
git push --force
คำเตือน: การบังคับให้คุณกดการเปลี่ยนแปลงจะเป็นการเขียนทับสาขาระยะไกลกับสาขาในพื้นที่ของคุณ ตรวจสอบให้แน่ใจว่าคุณจะไม่เขียนทับสิ่งที่คุณต้องการเก็บไว้ จงระมัดระวังเกี่ยวกับการบังคับให้มีการแก้ไข (เขียนใหม่) กระทำหากมีคนอื่นแบ่งปันสาขากับคุณเพราะพวกเขาจะต้องเขียนประวัติของตัวเองถ้าพวกเขามีสำเนาเก่าของการกระทำที่คุณเพิ่งเขียนใหม่
ฉันชอบที่จะใช้ต่อไปนี้:
git status
git add --all
git commit -am "message goes here about the change"
git pull <origin master>
git push <origin master>
หากคุณยังไม่ได้ส่งรหัสไปยังสาขาระยะไกลของคุณ ( GitHub / Bitbucket ) คุณสามารถเปลี่ยนข้อความยืนยันในบรรทัดคำสั่งดังต่อไปนี้
git commit --amend -m "Your new message"
หากคุณกำลังทำงานในสาขาเฉพาะทำเช่นนี้:
git commit --amend -m "BRANCH-NAME: new message"
หากคุณได้ผลักรหัสด้วยข้อความผิดและคุณต้องระวังเมื่อเปลี่ยนข้อความ นั่นคือหลังจากคุณเปลี่ยนข้อความการส่งและลองกดอีกครั้งคุณจะพบปัญหา เพื่อให้ราบรื่นทำตามขั้นตอนเหล่านี้
โปรดอ่านคำตอบทั้งหมดของฉันก่อนที่จะทำ
git commit --amend -m "BRANCH-NAME : your new message"
git push -f origin BRANCH-NAME # Not a best practice. Read below why?
หมายเหตุสำคัญ:เมื่อคุณใช้แรงกดโดยตรงคุณอาจพบปัญหารหัสที่ผู้พัฒนารายอื่นกำลังทำงานในสาขาเดียวกัน ดังนั้นเพื่อหลีกเลี่ยงความขัดแย้งเหล่านั้นคุณจะต้องดึงรหัสจากสาขาของคุณก่อนที่จะทำการกดบังคับ :
git commit --amend -m "BRANCH-NAME : your new message"
git pull origin BRANCH-NAME
git push -f origin BRANCH-NAME
นี่เป็นแนวทางปฏิบัติที่ดีที่สุดเมื่อเปลี่ยนข้อความการส่งข้อความหากได้รับการพุชแล้ว