Làm cách nào để sửa đổi một cam kết mà không thay đổi thông điệp cam kết (sử dụng lại cam kết trước đó)?


656

Có cách nào để sửa đổi một cam kết mà không vi(hoặc của bạn $EDITOR) xuất hiện với tùy chọn sửa đổi thông điệp cam kết của bạn, nhưng chỉ cần sử dụng lại tin nhắn trước đó?


5
Tôi đã đưa ra câu hỏi của riêng mình sau khi học theo cách khó khăn của những sửa đổi.
Sridhar Sarnobat

28
Miễn là bạn tuân thủ một số quy tắc nhất định (như không sửa đổi một cái gì đó đã được thúc đẩy), không có lý do gì để sửa đổi phải là một điều xấu.
paullb

3
Sửa đổi cam kết không nên được sử dụng cho cam kết công việc không liên tục trong một thay đổi logic duy nhất. Cho rằng bạn nên cam kết tại địa phương đúng cách và sau đó cam kết lịch sử một lần thành (@ Sridhar-Sarnobat)
DBCerigo

3
Tôi hoàn toàn đồng ý @DBCerigo. Tình huống duy nhất tôi thấy sửa đổi hữu ích là khi tôi quên tạo một tệp trong một cam kết trước đó (ví dụ: vì nó mới và do đó không được tự động dàn dựng khi chạy git commit -a) và muốn hồi tố lại nó.
Sridhar Sarnobat

1
Một lần sửa đổi khác là hữu ích ngay cả khi bạn nhận ra sự nguy hiểm của việc thay đổi lịch sử là nếu bạn không hài lòng với thông điệp cam kết gần đây nhất của mình và muốn điều chỉnh lại mà không cần phải phản ứng.
Sridhar Sarnobat

Câu trả lời:


1007

Vì phiên bản git 1.7.9, bạn cũng có thể sử dụng git commit --amend --no-editđể nhận kết quả của mình.

Lưu ý rằng điều này sẽ không bao gồm siêu dữ liệu từ các cam kết khác, chẳng hạn như dấu thời gian có thể hoặc không quan trọng đối với bạn.


42
Bạn cũng có thể làm cho việc mặc định thành cờ --no-edit dễ dàng hơn bằng cách thêm bí danh: "Sửa đổi = cam kết -a --amend --no-chỉnh sửa"
Jherico

1
@Jherico Tôi sẽ đề nghị loại bỏ -a. Vui lòng thực hiện các cam kết nguyên tử, cách dễ dàng hơn để xem xét hoặc phản hồi :)
frouo

120

git commit -C HEAD --amendsẽ làm những gì bạn muốn. Các -Ctùy chọn có siêu dữ liệu từ một cam kết.


15
Chỉ cần thêm vào câu trả lời của Andy. Nếu đây là việc bạn làm thường xuyên thì bạn có thể thiết lập bí danh cho nó bằng cách sử dụng git config --global alias.amend 'commit --amend -C HEAD'. Sau đó bạn có thể sử dụng git amendnhư một phím tắt.
mikej

9
Thôi nào các bạn, đừng lười biếng, hãy nâng cấp git và sử dụng lệnh tích hợp mà Shaggle gợi ý! Thêm một tùy chọn cho -C mặc dù.
Dimitris Baltas

4
Không chỉ dấu thời gian, mà cả thông tin về quyền tác giả!
user1338062 27/08/2015

3
@RyanCastner Thật vậy, nhận xét mà bạn đang đề cập là từ năm 2013. Với phiên bản git tôi hiện đang chạy --amend, thậm chí không có tùy chọn nào khác, sẽ giữ nguyên ngày của tác giả (nhưng thay đổi ngày cam kết). Như vậy, tôi đã loại bỏ bình luận cũ của tôi.
Ruben Verborgh

2
Thật ra câu trả lời này có giá trị theo một cách khác ngay cả khi đó không phải là câu trả lời được chấp nhận. Không giống như câu trả lời khác, bạn không phải sử dụng —amend. Bạn có thể tạo một cam kết mới nhưng sử dụng cùng một thông điệp như cam kết trước đó. Điều đó nghe có vẻ không hữu ích nhưng thông điệp cam kết của tôi theo mặc định khi tôi chỉ lưu công việc của mình mà không phải nghĩ ra một tin nhắn cam kết tốt đẹp, tôi tiếp tục sử dụng lại tin nhắn—message=“Work in progress (untested)”
Sridhar Sarnobat

67

Một khả năng (ngớ ngẩn) khác là git commit --amend <<< :wqnếu bạn có vi (m) là $EDITOR.


39
Ngay cả khi điều đó không cần thiết cho trường hợp sử dụng này, tôi không biết bạn có thể chuyển sang vim. Điều đó mở ra một số khả năng hấp dẫn. Mẹo tuyệt vời.
Sridhar Sarnobat

6
... <<< ZZthậm chí có thể ít gõ hơn;)
Ruslan

6
.. và thậm chí ít hơn - ... <<< :x:)
skwisgaar

3
Tôi không nghĩ nó là ngớ ngẩn. Đó là một cách tuyệt vời để cải thiện quy trình làm việc cho bất kỳ lệnh nào mở ra vi.
B Bảy

12
khung góc ba. đó là mới.
oligofren

16

Để mở rộng câu trả lời được chấp nhận, bạn cũng có thể làm:

git commit --amend --no-edit -a

để thêm các tập tin hiện đang thay đổi.


11

Sử dụng câu trả lời được chấp nhận để tạo bí danh

 oops = "!f(){ \
    git add -A; \
    if [ \"$1\" == '' ]; then \
        git commit --amend --no-edit; \
    else \
        git commit --amend \"$@\"; \
    fi;\
}; f"

sau đó bạn có thể làm

git oops

và nó sẽ thêm mọi thứ và sửa đổi bằng cùng một thông điệp

hoặc là

git oops -m "new message"

sửa đổi thay thế tin nhắn

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.