Làm cách nào để tôi nhập lại thông báo cam kết git đầu tiên?


116

Tôi có một cây làm việc chứa 3 dấu phẩy:

➜ ~ myproject git: (master) 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)

Bây giờ tôi muốn rewordthông báo cam kết của lần cam kết đầu tiên của tôi (6707a66)

➜ ~ myproject git: (master) git rebase -i 6707

(… Nhập vim)

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

Trong trường hợp này, tôi muốn sửa ( rewordtheo cách nói git) thông báo cam kết được đề cập:

Cam kết ban đầu (với một thông báo gây hiểu lầm)

… Đến một cái gì đó thích hợp.

Không có gì đáng ngạc nhiên, nỗ lực của tôi ở trên đã không thành công vì cam kết đầu tiên rõ ràng là không có bất kỳ cam kết cha mẹ nào . (Và khi bạn rebase, bạn cần tham khảo cam kết cũ nhất tiếp theo trước cam kết bạn muốn reword, phải không?)

Vì vậy, ý chính của câu hỏi của tôi, bạn có thể đạt được điều này bằng bất kỳ cách nào khác để thực hiện nó không?


Hoặc bạn có thể để nó mãi mãi như một kho lưu trữ chế nhạo chế nhạo.
Christopher


^ Rất đúng ... Tôi nghĩ rằng tôi đã tìm kiếm đúng cách cho câu hỏi cụ thể này nhưng đó là câu hỏi của tôi. Có rất nhiều việc hoàn thiện bản sao câu hỏi của tôi. :-P
Henrik

1
@hced: :) copywriting của bạn không bị lãng phí - nó sẽ giúp những người khác để tìm một giải pháp trong tương lai, ngay cả khi nó là để đóng cửa như là một bản sao
Đánh dấu Longair

2
Bất cứ ai gặp câu hỏi này có thể tìm thấy câu trả lời của tôi cho Thay đổi thông báo của lần cam kết đầu tiên? (git) để hữu ích.

Câu trả lời:


215

Làm git rebase -i --root

(trỏ tới rootthay vì trỏ đến một cam kết cụ thể)

Bằng cách này, cam kết đầu tiên cũng được bao gồm và bạn có thể chỉ cần rewordnó như bất kỳ cam kết nào khác.

Các --roottùy chọn được giới thiệu vào Git v1.7.12(2012). Trước đó, lựa chọn duy nhất là sử dụng filter-branchhoặc --amend, điều này thường khó thực hiện hơn.

Lưu ý: xem thêm câu hỏi và câu trả lời tương tự này .


12

Bạn luôn có thể sử dụng 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: Thật tuyệt, cảm ơn. Tò mò, đây có được coi là thực hành "hợp pháp" không, vì thiếu từ tốt hơn. Ý tôi là, nó có phổ biến / được khuyến khích làm như thế này không? Ngoài ra, bạn có thể làm điều này nhiều lần trong trường hợp có thông báo cam kết bị lỗi không? Lý do yêu cầu điều đó là vì lần đầu tiên tôi thực hiện với cam kết sai SHA-1, sao chép đoạn mã của bạn (của bạn là cam kết mới nhất trong khi tôi muốn thay đổi đoạn mã đầu tiên). Sau khi sử dụng lệnh một lần nữa, lần này với SHA-1 chính xác (cam kết đầu tiên; 6707a66), nó cản trở tôi.
Henrik

Vâng, nó là phổ biến :) Và vâng, bạn có thể lặp lại nó. Nếu bạn chỉ cần thêm -fnó sẽ tiếp tục và luôn viết lại các cam kết của nhánh đã cho. Giá trị tham chiếu nhánh từ lần đầu tiên đã được lưu vào refs/original/mastertrước khi bạn chạy lệnh.
fork0

Tất nhiên, bạn chỉ có thể xóa (hoặc đổi tên) tham chiếu đã lưu.
fork0

2
Tôi đã cập nhật mã để đảm bảo lỗi với id cam kết đã sao chép không xảy ra. Bây giờ mã thậm chí có thể sao chép-dán. Một lời cảnh báo , mặc dù: nó không hoạt động một cách chính xác nếu có nhiều hơn một đầu cam kết (tức là khi bạn kết hợp hai hoặc không liên quan nhiều chi nhánh)
fork0

3
@hced: Bạn nên biết rằng viết lại bất kỳ cam kết nào được coi là "lịch sử xuất bản" thường là một ý tưởng tồi. Trong trường hợp của bạn, điều đó có nghĩa là bạn thường không nên làm điều này nếu bất kỳ ai khác đã từng làm việc trên một cam kết có cam kết gốc của bạn là tổ tiên.
Mark Longair

12

Ý chính của pcreux có một cách hay để tạo lại cam kết đầu tiên:

# 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
Đối với git 1.7.12 , git rebase -i --rootlà con đường để đi, theo đề xuất của florisla.
Douglas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.