Git: chỉ chỉnh sửa tin nhắn của các cam kết trước đó


12

Vì những lý do lười biếng, tôi đã đẩy một loạt các cam kết với các tin nhắn mặc định và bây giờ nó đã trở nên cồng kềnh, vì tôi không thực sự biết những gì tôi đã thay đổi trong mỗi cam kết.

Làm cách nào để chỉnh sửa thông điệp của các xác nhận trước đó và (nếu có thể) giữ cây cam kết?


10
Coi chừng thay đổi lịch sử công cộng!
D. Ben Knoble

2
tôi sợ câu trả lời ở đây không mang lại cho bạn những cảnh báo gần như đủ nghiêm trọng. điều này sẽ tạo ra một mớ hỗn độn lớn nếu có ai đó kéo lịch sử của bạn trong lúc này - tất cả các moreso nếu họ đã thực hiện công việc mới trên đầu trang!
Eevee

Tôi sẽ sử dụng nó với lý do, tôi có trường hợp đơn giản hơn ở đây, tôi là người duy nhất sử dụng repo này.
Tuyên Phạm

3
Thông tin: Điều này đã được hỏi (có thể nhiều lần) trên Stack Overflow .
dùng202729

Câu trả lời:


20

Để chỉnh sửa các thông điệp cam kết của một loạt các cam kết, tôi chạy

git rebase -i firstsha

trong đó firstshamột định danh cho cam kết gốc của cam kết đầu tiên tôi muốn chỉnh sửa. (Bạn có thể sử dụng bất kỳ tài liệu tham khảo hợp lệ nào ở đây, vì vậy git rebase -i HEAD~4sẽ hiển thị bốn lần xác nhận cuối cùng.)

Trong trình chỉnh sửa mở ra, hãy thay đổi tất cả các mục nhập của Pick Pick thành thành tua tua lại trên các cam kết bạn muốn sửa đổi, sau đó đóng trình chỉnh sửa; sau đó bạn sẽ được yêu cầu nhập thông điệp cam kết cho tất cả các cam kết bạn đã chọn.

Lưu ý rằng điều này sẽ thay đổi cây cam kết, bởi vì giá trị băm của các xác nhận sẽ thay đổi. Bạn sẽ phải đẩy cây mới của bạn, hoặc đẩy nó sang một nhánh mới. Nó cũng sẽ làm rối các phép hợp nhất, vì vậy tránh chỉnh sửa các cam kết hợp nhất.

Để nhanh chóng chỉnh sửa cam kết cuối cùng, hãy chạy

git commit --amend

(nhưng hãy cẩn thận với bất cứ điều gì được dàn dựng cho cam kết mặc dù).


Làm thế nào nó sẽ ảnh hưởng đến cây cam kết, nó sẽ tạo ra một đường thẳng đứng trung gian trong cây cam kết? Bây giờ tôi chỉ có một cây cam kết dọc và hơn 100 tin nhắn cần được thay đổi.
Tuyền Phạm

3
Nó sẽ không tạo ra một dòng mới trên mạng trong cây cam kết của bạn, nó sẽ thay đổi tất cả các cam kết. Nếu lịch sử của bạn hiện là tuyến tính, nó sẽ vẫn tuyến tính.
Stephen Kitt

Nó phụ thuộc. Bạn đang sử dụng nó một mình và không đẩy đến một máy chủ? Vậy thì không, chỉ có một "dòng". Nhưng nếu không, có thể có hai, và dựa trên câu trả lời của bạn cho hai câu đầu tiên, chúng tôi có thể giúp bạn thoát khỏi "dòng" cũ.
Thuyền trưởng Man

1
Rebase có một lá cờ để xử lý các sự hợp nhất (tôi nghĩ đó là preserve-merges)
D. Ben Knoble

6

Những gì bạn đang tìm kiếm là git rebase.

Nếu bạn chỉ muốn thay đổi git committin nhắn trước đó thì bạn chỉ cần sử dụng như sau:

git commit --amend

Và thực hiện các thay đổi bạn mong muốn cho cam kết trước đó và sau đó lưu các chỉnh sửa.

Tuy nhiên nếu bạn cần thay đổi các cam kết cũ hơn, bạn cần sử dụng rebase.

git rebase -i HEAD~N 

Trong đó N bằng số lần xác nhận bạn muốn quay lại, ví dụ 2 hoặc 12 hoặc 6, v.v.

Ở đây bạn sẽ nhận được một trình soạn thảo văn bản với các cam kết của bạn. Thay đổi tùy chọn từ pickđể rewordthay đổi thông điệp.

Khi bạn đã xác định tất cả các cam kết bạn muốn thay đổi và đã thay đổi một cách thích hợp các tùy chọn của họ, hãy lưu và đóng trình chỉnh sửa. Sau đó thực hiện các thay đổi cho từng thông điệp cam kết. Một khi bạn hài lòng, bạn có thể chạy:

git push --force

Và bạn nên duy trì lịch sử git của mình mặc dù với các giá trị băm khác nhau vì bạn đã thực hiện các thay đổi cần thiết mà bạn muốn. Dưới đây là một số liên kết bổ sung bạn nên kiểm tra:

7.6 Công cụ Git - Viết lại lịch sử
Trợ giúp GitHub - Thay đổi thông điệp cam kết
StackOverflow - Câu hỏi về Thay đổi tin nhắn cam kết cũ


Nếu bạn có thể tua lại, bạn không cần phải commit --amendphạm lỗi, trừ khi bạn làm hỏng quá trình cam kết bằng cách nào đó.
Stephen Kitt

Cảm ơn, đây là các bước tôi sẽ làm theo cách hiểu của tôi từ bài đăng của bạn: 1. thực hiện git rebase -i firstshađó firstshalà hàm băm của cam kết mà tôi muốn thay đổi tin nhắn, sau đó trong trình chỉnh sửa, thay đổi pickthành reword, entertin nhắn mới, sau đó phát hành git rebase --continuevà làm gì git push --force?
Tuyền Phạm

@StephenKitt, tôi vừa nhận thấy câu trả lời của bạn, tôi đã làm cho tôi khi bạn gửi của bạn. Tôi sẽ làm theo lời khuyên của bạn và tìm cách thực hiện những chỉnh sửa đó. Nếu nó phù hợp hơn tôi có thể hợp nhất câu trả lời của mình vào câu hỏi của bạn bằng cách thêm các liên kết đến câu hỏi của bạn nếu bạn cảm thấy điều đó phù hợp hơn với câu hỏi này hơn là có nhiều câu trả lời tương tự.
kemotep

@TuyenPham bạn chỉ cần làm git rebase -i HEAD~Nvới N là số lần xác nhận bạn muốn đi. Thay đổi mọi tùy chọn cam kết mà bạn muốn chỉnh sửa thông báo từ pickđến reword, lưu tệp này, thực hiện các thay đổi đối với từng tệp cam kết đó và lưu chúng. Một khi bạn tự tin bạn đã làm xong bạn chỉ cần git push --force [Name of git branch you are were working on]. Bạn luôn có thể quay lại và làm điều này một lần nữa hoặc làm theo từng giai đoạn.
kemotep
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.