ฉันจะเปลี่ยนข้อความคอมมิตคอมครั้งแรกได้อย่างไร


116

ฉันมีต้นไม้ทำงานที่มี 3 คอมมิชชั่น:

➜ ~ myproject git: (หลัก) git log

commit a99cce8240495de29254b5df8745e41815db5a75
Author: My Name <my@mail.com>
Date:   Thu Aug 16 00:59:05 2012 +0200

    .gitignore edits

commit 5bccda674c7ca51e849741290530a0d48efd69e8
Author: My Name <my@mail.com>
Date:   Mon Aug 13 01:36:39 2012 +0200

    Create .gitignore file

commit 6707a66191c84ec6fbf148f8f1c3e8ac83453ae3
Author: My Name <my@mail.com>
Date:   Mon Aug 13 01:13:05 2012 +0200

    Initial commit (with a misleading message)

ตอนนี้ฉันต้องการที่จะrewordส่งข้อความของการกระทำครั้งแรกของฉัน(6707a66)

➜ ~ myproject git: (หลัก) git rebase -i 6707

(…เข้ากลุ่ม)

pick 5bccda6 Create .gitignore file
pick a99cce8 .gitignore edits

# Rebase 6707a66..a99cce8 onto 6707a66
#
# 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
#
# 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

ในกรณีนี้ฉันต้องการแก้ไข ( rewordในการพูดคุยกัน) ข้อความคอมมิตที่เป็นปัญหา:

การกระทำเริ่มต้น (พร้อมข้อความที่ทำให้เข้าใจผิด)

…ถึงสิ่งที่เหมาะสม

ไม่น่าแปลกใจที่ความพยายามของฉันข้างต้นไม่ประสบความสำเร็จเนื่องจากเห็นได้ชัดว่าการกระทำครั้งแรกไม่มีการกระทำของผู้ปกครอง (และเมื่อคุณrebaseต้องการอ้างอิงการกระทำที่เก่าแก่ที่สุดถัดไปก่อนที่คุณต้องการrewordใช่ไหม)

ประเด็นสำคัญของคำถามของฉันคือคุณสามารถบรรลุสิ่งนี้ด้วยวิธีการอื่นได้หรือไม่?


หรือคุณอาจปล่อยทิ้งไว้ตลอดเวลาเพื่อเป็นที่เก็บของแปลก ๆ
Christopher


^ จริงมาก ... ฉันคิดว่าฉันได้ค้นหาคำถามนี้อย่างถูกต้อง แต่ก็เป็นคำถามเดียวกับของฉัน มีจำนวนมากในการทำให้การเขียนคำโฆษณาของคำถามของฉันสมบูรณ์แบบ :-P
Henrik

1
@hced: :) การเขียนคำโฆษณาของคุณจะไม่สูญเปล่า - มันจะช่วยให้คนอื่นหาทางแก้ปัญหาในอนาคตแม้ว่ามันจะถูกปิดเนื่องจากการทำซ้ำ
ก็ตาม

2
ใครก็ตามที่เจอคำถามนี้อาจพบคำตอบของฉันในการเปลี่ยนข้อความของการกระทำครั้งแรก? (git)เพื่อเป็นประโยชน์

คำตอบ:


215

ทำ git rebase -i --root

(ชี้ไปที่rootแทนที่จะชี้ไปที่คอมมิตเฉพาะ)

ด้วยวิธีนี้คอมมิตแรกจะถูกรวมไว้ด้วยและคุณสามารถrewordเหมือนกับคอมมิตอื่น ๆ

--rootตัวเลือกที่เป็นที่รู้จักใน Git v1.7.12(2012) ก่อนหน้านั้นทางเลือกเดียวคือใช้filter-branchหรือ--amendซึ่งโดยปกติแล้วจะทำได้ยากกว่า

หมายเหตุ: ดูคำถามและคำตอบที่คล้ายกันนี้ด้วย


12

คุณสามารถใช้git filter-branch --msg-filter:

git filter-branch --msg-filter \
  'test $GIT_COMMIT = '$(git rev-list --reverse master |head -n1)' &&
echo "Nice message" || cat' master

1
fork0: เยี่ยมมากขอบคุณ อยากรู้อยากเห็นนี่ถือเป็นการปฏิบัติที่ "ถูกต้อง" หรือไม่หากขาดคำที่ดีกว่า ฉันหมายถึงเป็นเรื่องธรรมดา / แนะนำให้ทำเช่นนี้หรือไม่? นอกจากนี้คุณสามารถทำครั้งแล้วครั้งเล่าในกรณีที่มีข้อความคอมมิตผิดพลาดได้หรือไม่? เหตุผลในการถามนั่นเป็นเพราะฉันทำครั้งแรกด้วยการกระทำผิด SHA-1 โดยคัดลอกข้อมูลโค้ดของคุณ (ของคุณเป็นการกระทำล่าสุดในขณะที่ฉันต้องการเปลี่ยนอันแรกสุด) หลังจากใช้คำสั่งอีกครั้งคราวนี้ด้วย SHA-1 ที่ถูกต้อง (การกระทำครั้งแรก; 6707a66) มันทำให้ฉันไม่พอใจ
Henrik

มันเป็นเรื่องธรรมดา :) และใช่คุณสามารถทำซ้ำได้ หากคุณเพิ่งเพิ่ม-fมันจะดำเนินการต่อและเขียนคอมมิตของสาขาที่กำหนดใหม่เสมอ ค่าการอ้างอิงสาขาจากครั้งแรกถูกบันทึกไว้refs/original/masterก่อนที่คุณจะรันคำสั่ง
fork0

แน่นอนคุณสามารถลบ (หรือเปลี่ยนชื่อ) ข้อมูลอ้างอิงที่บันทึกไว้ได้
fork0

2
ฉันอัปเดตรหัสเพื่อให้แน่ใจว่าข้อผิดพลาดเกี่ยวกับรหัสคอมมิตที่คัดลอกจะไม่เกิดขึ้น ตอนนี้โค้ดยังสามารถคัดลอกวางได้ คำเตือนแม้ว่า: จะทำงานไม่ถูกต้องหากมีการกระทำเริ่มต้นมากกว่าหนึ่งรายการ (เช่นเมื่อคุณรวมสาขาที่ไม่เกี่ยวข้องสองสาขาขึ้นไป)
fork0

3
@hced: คุณควรทราบว่าการเขียนคอมมิตใหม่ที่ถือว่าเป็น "ประวัติการเผยแพร่" มักเป็นความคิดที่ไม่ดี ในกรณีของคุณนั่นหมายความว่าโดยทั่วไปคุณไม่ควรทำเช่นนี้หากคนอื่นเคยทำงานกับการกระทำที่มีรากของคุณเป็นบรรพบุรุษ
Mark Longair

12

ส่วนสำคัญของ pcreuxมีวิธีที่ดีในการ reword การกระทำครั้งแรก:

# You can't use rebase -i here since it takes the parent commit as argument.
# You can do the following though:
git checkout FIRST_COMMIT_SHA && git commit --amend && git rebase HEAD master

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