Cập nhật git cam kết ngày tác giả khi sửa đổi


305

Tôi thấy mình sửa đổi cam kết của mình khá thường xuyên. Tôi không stashquá nhiều bởi vì tôi có xu hướng quên tôi đã làm như vậy, đặc biệt là khi tôi muốn lưu lại những gì tôi đã làm trước khi tôi rời đi hoặc trước một ngày cuối tuần, vì vậy tôi thực hiện một cam kết "dự thảo". Chỉ có điều, khi tôi sửa đổi cam kết, nó vẫn được đặt thành ngày tác giả ban đầu. Có cách nào (đơn giản) để cập nhật nó khi sửa đổi không?


5
Điều này đặc biệt hữu ích khi bạn thực hiện rebase tương tác và mong GitHub hiển thị các cam kết trong Yêu cầu kéo theo thứ tự cây thay vì thứ tự ngày.
Sukima

Câu trả lời:


368

Bạn có thể thay đổi ngày tác giả với --datetham số thành git commit. Vì vậy, nếu bạn muốn sửa đổi cam kết cuối cùng và cập nhật ngày tác giả của nó thành ngày và giờ hiện tại, bạn có thể làm:

git commit --amend --date="$(date -R)"

( -RTham số để báo datecho nó xuất ngày ở định dạng RFC 2822. Đây là một trong những định dạng ngày được hiểu bởigit commit .)


27
FTR, giống như trên OS X, datekhông biết -R. Sử dụng datemà không có tùy chọn nào đã thực hiện công việc
ksol

7
Lưu ý rằng nếu bạn muốn điều này như một bí danh bạn cần phải thêm một !và thoát khỏi dấu ngoặc kép, ví dụ:can = !git commit --amend --date=\"$(date -R)\"
Fabian Steeg

9
date -Rkhông hoạt động trên OSX, date +%sthay vào đó hãy sử dụng
stash

4
Idem cho FreeBSD:git commit --amend --date="$(date +%s)"
Dereckson

120
git commit --amend --date=nowcũng hoạt động. Không cần phải gọi một subshell với lệnh date (1) . Bạn có thể thấy nó trong mã nguồn của git (1) trong date.c 'now' là một giá trị đặc biệt được chuyển đổi bằng hàm date_now (). Tương tự cho 'buổi trưa', 'ngày hôm qua', 'nửa đêm', 'trà' và những thứ khác được liệt kê trong mảng cấu trúc đặc biệt [].
sbz

267

Một cách khác để làm điều này là

git commit --amend --reset-author

Điều này không thay đổi tác giả cam kết cũng như ngày - nhưng nếu ban đầu đó là cam kết không được đánh dấu của bạn thì đó không phải là hành động không đúng.

Bạn cũng có thể thêm --no-editnếu bạn muốn cập nhật ngày trên nhiều lần xác nhận nhưng bạn muốn các thông điệp cam kết không bị ảnh hưởng. Bằng cách này, bạn sẽ không được nhắc chỉnh sửa tin nhắn cho mỗi lần xác nhận.


4
Tôi tự hỏi tại sao hành vi này không mặc định và nên được chỉ định rõ ràng. Điều đó rất đáng ngạc nhiên và dẫn đến những hậu quả xấu tiềm ẩn. Theo hiểu biết của tôi, các git commit --amend thay đổi cam kết thay vì chỉ điều chỉnh hoặc một cái gì đó tương tự, nghĩa là nó dẫn đến lịch sử thay đổi nội dung kho lưu trữ khác nhau trong đó bất kỳ hệ thống kiểm soát phiên bản nào đều rất nghiêm ngặt. Và như vậy, tôi trực giác mong đợi rằng cả tác giả và ngày phù hợp với dữ liệu cam kết thực tế. Đặc biệt là quyền tác giả là quan trọng, thậm chí không có ngày. Bỏ phiếu nhận xét này nếu bạn muốn đánh bại các nhà phát triển git chịu trách nhiệm về mặc định đó. :)
Artem Pisarenko

258

Kể từ Git v2.1.4 (đã thử nghiệm trên Debian 8 (Jessie))

git commit --amend --date=now

8
Và nếu bạn không muốn xem lại thông điệp cam kết, hãy thêm --no-edit.
Henrik N

12

Tôi thích câu trả lời của Mark và đã sử dụng nó nhiều lần, nhưng bây giờ tôi đang dùng OS X và date -Rkhông được hỗ trợ. Nhưng mọi thứ dễ dàng hơn nhiều so với câu trả lời ban đầu khiến chúng tôi phải suy nghĩ, chỉ cần sử dụng chuỗi rỗng !

git commit --date= --amend

6
Điều đó không hiệu quả. Git hủy bỏ với lỗifatal: invalid date format:
Nikos C.

Làm việc cho tôi (trên Windows, Git 1.9.4)
Csq

1
Tốt hơn để sử dụng --date="$(date)"trong OS X. Tùy chọn -Rlà GNUism.
Rudá Moura

0

Tôi đã tạo gói npm này nếu ai đó vẫn đang tìm kiếm một cách đơn giản để thay đổi ngày của nhiều lần xác nhận.

https://github.com/bitriddler/git-change-date

Sử dụng:

npm install -g git-change-date
cd [your-directory]
git-change-date

17
Có ai thực sự cần một npmgói khác ? Không, học cách sử dụng gitlệnh như hiện trạng.
Urda
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.