Git: Làm thế nào để sử dụng lại / giữ lại các tin nhắn cam kết sau khi 'đặt lại git'?


103

Là người dùng Git, tôi thường xuyên gặp phải tình huống rằng tôi cần phải làm lại một hoặc nhiều cam kết theo cách không phù hợp với --amendhoặc rebase -ivới các cam kết sửa chữa. Thông thường tôi sẽ làm một cái gì đó như

git reset HEAD~1
# hack, fix, hack
git commit -a
# argh .. do I need to retype my message?

Tôi coi các thông điệp cam kết hợp lý khá nghiêm túc. Chúng thường chứa văn bản lớn hơn với các tham chiếu và lý do cho sự thay đổi. Cho đến bây giờ, tôi khá bực mình về quá trình dài để phục hồi cũ của tôi cam kết thông báo thông qua một không được phân loại git reflog, git logvà sao chép và dán quá trình.

Có cách nào tốt hơn để giải quyết vấn đề này không? Và nó sẽ như thế nào, nếu của tôi bao gồm nhiều hơn một cam kết?

Chỉnh sửa: Sau khi suy nghĩ một chút về điều này, tôi nghĩ những gì tôi đang tìm kiếm là một số chức năng giống git stash cho các thông báo cam kết trong đó các cam kết sửa chữa / sửa đổi không phù hợp.


2
Nếu tất cả những gì bạn đã làm git reset head~1, không phải thông báo cam kết cũ của bạn chỉ là mục nhập thứ hai trong reflog?

Có - nhưng làm thế nào tôi có thể sử dụng lại thông điệp mà không cần sao chép & dán (mà thường đòi hỏi tay unindenting)
bentolor

Ngày nay, chỉ cần gitkmở. Bằng cách đó, bạn thậm chí sẽ không phải sử dụng reflog. Ngoài ra, sử dụng rev-parse <branch>để lấy mã băm của bạn trước khi đặt lại và sử dụng câu trả lời của ibizaman.
cst1992

Câu trả lời:


141

Sau một git reset, một lớp lót này có thể làm điều đó:

git commit --reuse-message=HEAD@{1}

hoặc thậm chí ngắn hơn:

git commit -C HEAD@{1}

Bạn có thể sử dụng các tùy chọn khác do @ user2718704 cung cấp .


6
Ngắn hơn:git commit -C@@{1}
Phú Ngô

2
Đây là một cách sử dụng tuyệt vời của các reflog
David Mann

22
Sau khi đặt lại, ORIG_HEAD được đặt. Tôi thấy git commit --reuse-message=ORIG_HEADlà rõ ràng nhất.
Scott Jacobsen

45

Khi chạy lệnh "git commit", bạn phải kiểm tra các tùy chọn sau,

Tái sử dụng,

--reuse-message=<commit>

Để chỉnh sửa khi sử dụng lại,

--reedit-message=<commit>

Để thay đổi tác giả,

--reset-author

1
Đã đánh dấu đây là giải pháp mới vì điều này cung cấp câu trả lời toàn diện nhất. Mặc dù giải pháp này vẫn không giải quyết được đầy đủ các vấn đề 'truy xuất' của tôi.
bentolor,

9

Tại sao phải thiết lập lại nếu bạn có thể hack, sửa chữa, hack và sau đó chỉ cần chạy git commit --amend --no-edit; do đó, giữ lại thông điệp cam kết ban đầu của bạn.

Để làm cho nó hoạt động cho nhiều cam kết, chỉ cần tạo một cam kết tạm thời với những thay đổi mới nhất của bạn và sau đó sử dụng cơ sở tương tác để loại bỏ cam kết trước đó (chứa thông báo cam kết tốt) với cam kết tạm thời mới, giữ nguyên thông báo cam kết của cam kết cũ.


2
Khi thực hiện một rebase tương tác, bạn thậm chí có thể sử dụng fixuphướng dẫn để khai báo rằng cam kết sau là sửa chữa cam kết trước đó và nó sẽ tự động sử dụng thông báo cam kết từ bản gốc, loại bỏ thông báo khỏi cam kết sửa chữa.
qqx

Ví dụ: nếu tôi muốn hợp nhất lại các yêu cầu kéo được cập nhật bắt buộc. Hoặc nếu cam kết không phải là lần cuối cùng và không thể dễ dàng sửa chữa dựa trên HEAD và việc thực hiện lại chúng dễ dàng hơn.
bentolor

@BenTebulin Vâng, rebase tương tác cho phép bạn sửa đổi bất kỳ cam kết nào trong một loạt các cam kết được chỉ định. Nó không hoàn toàn là cam kết HEAD phải được sửa đổi.
mart1n

@ mart1n Cám ơn cậy vào chỉnh sửa trong rebase -i. Không bao giờ sử dụng nó trong bối cảnh đó. Đối với các trường hợp còn lại như hợp nhất lại câu trả lời khác phù hợp hơn với câu hỏi của tôi, vì vậy tôi đã đánh dấu câu trả lời đó là câu trả lời.
bentolor

Intellij có phạm vi chỉ hoạt động trên các tệp chưa được cam kết. Nó rất hữu ích để đặt lại các tệp thành không cam kết để intellij có thể được hướng dẫn để cài đặt các tệp, ví dụ, và sau đó cam kết lại các tệp đó với cùng một thông báo. sửa đổi sẽ không hoạt động vì những hạn chế trong phạm vi của intellij.
David Mann

5

Bạn có thể cân nhắc git commit --reset-author -c <commit>sử dụng lại thông báo cam kết có chỉnh sửa và thời gian hiện tại.


Cảm ơn - điều này khá gần với những gì tôi đang tìm kiếm.
bentolor
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.