2010-10-15 26 views
8

Giả sử tôi có 3 cam kết chưa được xóa. Bây giờ tôi muốn thay đổi thông điệp cam kết của lần commit đầu tiên hoặc lần thứ hai (thay đổi chúng cho lần thứ ba là đơn giản bằng cách sử dụng git commit --amend). Làm thế nào để làm điều đó?Làm cách nào để chỉnh sửa thông báo cam kết của bất kỳ cam kết nào trong git?

+1

Đó là một chút tương tự như http://stackoverflow.com/questions/3926768/amend-a-commit-that-wasnt-the -trước-cam kết. Tôi đã thử (bên dưới) để xem cách 'commit --amend' có thể được viết như thế nào. Cho tôi biết nếu nó hoạt động. – VonC

Trả lời

5

Để hồi phục trên-câu hỏi phụ: là có một git commit --amend cho một trước cam kết (và không chỉ là người cuối cùng), bạn có thể thử một cái gì đó tương tự (không được thử nghiệm, nhưng Colin O'Dell đề cập trong the comments đã viết một kịch bản cho nó colinodell/git-amend-old):

git checkout -b tmp 
git reset --hard HEAD~2 
git commit -amend 
git rebase --onto tmp [email protected]{1} master 

Đó sẽ là như sau:

x---x---x---x---x 
       ^
       | 
       (master*) (* = current branch) 

git checkout -b tmp 
x---x---x---x---x 
       ^
       | 
       (tmp*, master) 

git reset --hard HEAD~2 
x---x---x---x---x 
     ^ ^
     |  | 
     (tmp*) (master) 

git commit -amend 
     y (tmp*) 
    /
x---x---x---x---x 
     |  ^
    ([email protected]{1}) | 
      (master) 

git rebase --onto tmp [email protected]{1} master 
    (tmp) 
     y---x'---x' (master*) 
    /
x---x---x---x---x (only referenced in reflog) 
+1

Trên 'rebase --onto', xem http://stackoverflow.com/questions/1994463/how-to-cherry-pick-a-range-of-commits-and-merge-into-another-branch/1994491 # 1994491 – VonC

+1

tại sao phải bận tâm? rebase -i đơn giản hơn nhiều – CharlesB

+2

@CharlesB: Tôi đồng ý, 'rebase -i' là đơn giản hơn, nhưng nó cũng * tương tác *. Có nghĩa là bạn không thể bao gồm nó trong một kịch bản hoặc trong một nhóm bí danh một chuỗi các lệnh. – VonC

6

Đây là công việc cho lệnh mạnh mẽ git rebase -i. Ngoài ra, hãy xem phần Interactive Rebasing của sách Git.

+0

Có lẽ một câu hỏi ngu ngốc, nhưng có thể 'git rebase -i' được sử dụng không tương tác? – Mot

+2

Không, không phải như vậy. Tuy nhiên, mọi thứ mà 'git rebase -i' có thể (theo lý thuyết) được thực hiện bằng các lệnh Git có thể đọc được. Vì vậy, nó sẽ có thể viết một kịch bản để sửa đổi một tin nhắn cam kết trước đó, nhưng tôi không biết liệu một điều như vậy tồn tại chưa. –

+0

congrats trên huy hiệu vàng thứ 15 của bạn;) Bạn bây giờ là một git đúng! (Err ... git-guru, ý tôi là) (Ý tôi là, guru về tên công cụ git) (ý tôi là, bạn biết ý tôi là gì) – VonC

Các vấn đề liên quan