มีวิธีแก้ไขข้อความการส่งข้อความใน GitHub หรือไม่


129

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


คุณสามารถลองคืนค่าคอมมิชชัน (ดูตัวเลือกบางอย่างในคำถาม SO นี้: stackoverflow.com/questions/4114095/ ...... ) - ให้แน่ใจว่าคุณสำรองข้อมูลการเปลี่ยนแปลงรหัสใด ๆ ไว้ก่อนดังนั้นคุณจะไม่เสียความคิดเห็นไปเลย!
Guy Tech กำลังเดินทาง

คำตอบ:


183
  1. git rebase -i <commit hash you want to change>^

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

  2. สำหรับท่านใดกระทำคุณต้องการที่จะเปลี่ยนข้อความเปลี่ยนไปpickreword

  3. บันทึกและเลิก (ใน vi: :wq)

  4. สำหรับการกระทำแต่ละครั้งคุณจะได้รับโปรแกรมแก้ไขเพื่อแก้ไขข้อความการส่งข้อความ เปลี่ยนตามที่เห็นสมควรให้บันทึกและออก

    เมื่อคุณแก้ไขข้อความกระทำทั้งหมดเสร็จแล้วคุณจะกลับสู่พรอมต์คำสั่งและมีแผนผังใหม่พร้อมข้อความที่อัปเดต

  5. ขณะนี้คุณสามารถอัปโหลดไปยัง GitHub git push origin --forceโดยใช้

หากคุณเพียงแค่ต้องแก้ไขกระทำของคุณที่ผ่านมาคุณสามารถเปลี่ยนขั้นตอนที่ 1-4 git commit --amendกับ


3
@ MatewewPeters ฉันคิดว่าควรจะมีวิธี แต่ฉันไม่รู้ - ฉันใช้ commandline โดยตรง
Mureinik

4
ดูเหมือนว่าคุณจะไม่สามารถระบุ <กระทำแฮชที่คุณต้องการเปลี่ยน> แต่คุณต้องระบุแฮชของคำสั่งก่อนหน้าที่คุณต้องการเปลี่ยนหรือใช้ HEAD ~ x โดยที่ x คือจำนวนของการคอมมิชชันจาก HEAD รายการที่คุณต้องการเปลี่ยนอยู่
ssc327

3
@ ssc327 โปรดทราบว่าฉัน^อยู่ที่นั่น - ฉันแนะนำให้ทำการรีบูทบนพาเรนต์ของการคอมมิทที่คุณต้องการเปลี่ยน
Mureinik

2
@Murenik คุณถูกต้องฉันไม่ได้เห็น ^
ssc327

1
@deadfish การใช้บรรทัดคำสั่ง Windows คุณต้องพิมพ์^^เพื่อจบคำสั่งด้วยตัวอักษร^ เช่น: git rebase -i 2c747b32^^
Wyck

35

ใน Intellij Idea คุณสามารถทำได้ง่าย

  1. การควบคุมเวอร์ชันเปิด (ประวัติ)
  2. เลือกแท็บบันทึก
  3. เลือกกระทำเพื่อเปลี่ยนความคิดเห็น
  4. กด F2 (Mac fn + F2) และอัปเดตข้อความยืนยันของคุณ

1
ไม่ทำงานหากคุณผลักไปที่ระยะไกลแล้ว
จ่าย

8
คุณต้องดำเนินการgit push origin --forceตามที่แนะนำในคำตอบของ @ Mureinik
Dan Macák

1
ตัวเลือก "reword" ถูกปิดใช้งานหากการกระทำได้ถูกผลักไปแล้ว
huyz

1
ในการทำเช่นนั้นกับ Intellij IDEA สำหรับการส่งที่ได้รับการผลักคุณต้องเริ่มต้นด้วยการรีบูตแบบโต้ตอบก่อน (เช่นเดียวกับที่คุณทำจากบรรทัดคำสั่งของ Git) ในการทำการรีบูตให้คลิกขวาที่โครงการของคุณ -> รายการ "Git" -> "Repository" -> "Rebase ... " (รายการเมนูสุดท้าย) แทรก SHA ของการกระทำก่อนที่คุณต้องการแก้ไขในฟิลด์ "ไปยัง" และคลิก "Rebase" จากนั้นคุณจะได้รับพรอมต์รีแอคทีฟ เลือก "reword" ในดรอปบ็อกซ์การกระทำถัดจากคอมมิชชันที่คุณต้องการแก้ไขและคลิกปุ่ม "เริ่มการรีบูต" (ดำเนินการต่อในความคิดเห็นถัดไป)
jplandrain

1
(ต่อ) จากนั้นคุณจะเห็นข้อความแจ้งเตือนสำหรับทุกการกระทำที่คุณต้องการแก้ไข หลังจากแก้ไขข้อความบันทึกแล้วคุณสามารถใช้การแก้ไขเพิ่มเติมได้ (โปรดทราบว่าขณะนี้ตัวเลือก "reword" ไม่ได้เป็นสีเทาอีกต่อไป) เมื่อเสร็จแล้วคุณสามารถบังคับให้กดการปรับเปลี่ยนของคุณเพื่อสรุปการปฏิเสธแบบโต้ตอบ กระบวนการทั้งหมดนั้นเหมือนกันกับในคำตอบของ @Mureinik ที่กำลังทำมันจากบรรทัดคำสั่งแทน
jplandrain

3

สถานที่ตั้ง:

ถ้า git-graph ของคุณดูเหมือน ...

O   target-commit that you want to change its message [df9c192]
|
O   parent-commit [b7ec061]
|
O

( df9c192และb7ec061เป็นแฮชการกระทำของการกำหนดเป้าหมายและพาเรนต์การกระทำแยกต่างหาก)

วิธีการแก้:

คุณสามารถพิมพ์คำแนะนำต่อไปนี้ ...

git reset --soft b7ec061
git commit -m "your_new_description"
git push -f

คำอธิบาย:

  1. git reset --soft b7ec061 จะเก็บการเปลี่ยนแปลงของไฟล์และรีเซ็ตเป็น parent-commit (เช่น b7ec061)
  2. git commit -m "..." จะสร้างการมอบหมายใหม่ในเครื่อง
  3. git push -f จะผลักดันคอมมิชชันใหม่ของคุณไปยังเซิร์ฟเวอร์และแทนที่อันเก่า (เช่น df9c192)

2

อีกตัวเลือกหนึ่งคือการสร้าง "errata commit" เพิ่มเติม (และพุช) ซึ่งอ้างอิงถึงวัตถุกระทำที่มีข้อผิดพลาด - errata กระทำใหม่ยังให้การแก้ไข คหบดีกระทำเป็นกระทำโดยไม่มีการเปลี่ยนแปลงรหัสสำคัญ แต่ที่สำคัญการกระทำข้อความ - ตัวอย่างเช่นเพิ่มตัวอักษรพื้นที่หนึ่งไปยังแฟ้ม readme --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

    เปลี่ยนสีพื้นหลังเป็นสีแดง

แน่นอนมันปลอดภัย แต่มีข้อความให้อ่านจำนวนมาก ฉันต้องการเขียนประวัติศาสตร์ :)
pkalinow

0

คำตอบของ @Mureinikนั้นเป็นสิ่งที่ดี แต่ไม่สามารถเข้าใจได้โดยมือใหม่

วิธีแรก:

  1. หากคุณต้องการแก้ไขข้อความคอมมิทล่าสุดคุณจะต้องทำgit commit --amendคุณจะเห็น:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# On branch is up to date with 'origin/master'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. ดังที่คุณสามารถเห็นกระทำข้อความด้านบนโดยไม่ต้องคำสั่งใด ๆ เช่นpickนี่เป็นหน้าแก้ไขแล้วและคุณสามารถแก้ไขข้อความด้านบนโดยตรงและบันทึก & ออกเช่น:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. แล้วทำ หรือgit push -u origin master --force สำคัญนี่คือ<how you push normally> --force--force

วิธีที่สอง:

  1. คุณสามารถเห็นคอมมิชชันการแฮชโดยgit logหรือแยกจาก url ที่เก็บตัวอย่างในกรณีของฉันคือ881129d771219cfa29e6f6c2205851a2994a8835

  2. จากนั้นคุณสามารถทำgit rebase --interactive 881129d771219cfa29e6f6c2205851a2994a8835หรือgit rebase -i HEAD^(ถ้าล่าสุด)

  3. คุณจะเห็น:

pick <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# 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, exec = run command (the rest of the line) using shell
#  d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
  1. แต่ถ้าคุณเห็นnoopแล้วคุณอาจพิมพ์ผิดเช่นถ้าคุณgit rebase -i 881129d771219cfa29e6f6c2205851a2994a88ขาดสิ่งใด^ในตอนท้ายคุณควรออกจากตัวแก้ไขโดยไม่บันทึกและหาเหตุผล:
noop

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
...
  1. หากไม่มีnoopปัญหาก็เพียงเปลี่ยนคำpickเป็นrewordอื่น ๆ ก็ยังคงอยู่ (คุณไม่แก้ไขข้อความกระทำ ณ จุดนี้) เช่น:
reword <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
...
  1. บันทึก & ออกจะเห็นหน้าแก้ไขคล้ายกับวิธีที่ # 1:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# interactive rebase in progress; onto b057371
# Last command done (1 command done):
#    reword d996ffb <existing commit message foo bar>
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on 'b057371'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. แก้ไขข้อความด้านบนเช่นวิธี # 1 และบันทึก & ออกเช่น:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. อีกครั้งเดียวกันวิธีการเช่น # 1 ทำ หรือgit push -u origin master --force สำคัญนี่คือ<how you push normally> --force--force

สำหรับข้อมูลเพิ่มเติมโปรดอ่านเอกสาร

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