2012-11-07 34 views
21

Vì vậy, tôi có một trường hợp sử dụng rất đơn giản; Tôi muốn đè bẹp tất cả các cam kết cần phải trở lại làm chủ từ nhánh 'làm việc' của tôi.Làm thế nào để tôi cam kết bí mật trong git với ngày cam kết không có trong quá khứ?

Cho đến bây giờ tôi đã sử dụng git rebase -i cho việc này, nhưng nó không hoạt động hoàn toàn đúng; dấu thời gian trên cam kết cuối cùng không đúng.

Dưới đây là một ví dụ để làm điều này:

[work1] git checkout master 
Switched to branch 'master' 

[work1] git rebase today 
First, rewinding head to replay your work on top of it... 
Fast-forwarded master to today. 

[work1] git log --pretty=format:"%h%x09%an%x09%ad%x09%s" 
5ad95ff Doug Wed Nov 7 10:12:42 2012 +0800 Updated TODO again 
abb891c Doug Wed Nov 7 10:12:24 2012 +0800 Added more work 
c5fd35c Doug Wed Nov 7 10:11:50 2012 +0800 Added more work 
a98facd Doug Wed Nov 7 10:11:22 2012 +0800 Add work 
b4465be Doug Tue Nov 6 21:38:53 2012 -0800 Updated TODO 
403cea9 Doug Fri Jan 2 21:38:53 2009 -0800 Added todo 

Đúng vậy, bây giờ tôi muốn dẹp bốn cam kết cuối cùng vào một cam kết.

[work2] date 
Wed 7 Nov 2012 10:39:39 WST 

[work2] git rebase -i b4465be 

pick a98facd Add work 
squash c5fd35c Added more work 
squash abb891c Added more work 
squash 5ad95ff Updated TODO to reflect todays work 

Và kết quả:

[work2] git log 
commit 3f7f1d2eb4ef23c73dce95f718152c7d5683a926 
Author: Doug <[email protected]> 
Date: Wed Nov 7 10:11:22 2012 +0800 

    Add work 
    Added more work 
    Added more work 
    Updated TODO to reflect todays work 

commit b4465bee5b278214704edcfef3f6e222b5b52964 
Author: Doug <[email protected]> 
Date: Tue Nov 6 21:38:53 2012 -0800 

    Updated TODO 

Chết tiệt không! Đó là không phải những gì tôi muốn. Dấu thời gian của cam kết kết quả là dấu thời gian của cam kết mà chúng tôi đã nhập vào; những gì tôi muốn là ngày cam kết mới là thời điểm hiện tại.

Chỉ cần để hiển thị chính xác những gì tôi đang nói về:

[work2] date 
Wed 7 Nov 2012 10:39:39 WST 

Author: Doug <[email protected]> 
Date: Wed Nov 7 10:11:22 2012 +0800 

Tôi muốn kết quả cam kết được cập nhật bằng cách lần hợp nhất, tức là. bây giờ, không phải thời gian của cam kết.

Theo như tôi biết bạn chỉ có thể đè bẹp thành một cam kết trước đó, không trở thành một cam kết mới, nhưng có cách nào để thực hiện việc này không?

Giải pháp đúng có vẻ là 1) tạo một cam kết mới với thông báo hợp nhất và thời gian ngày cam kết chính xác, 2) ??? < --- bằng cách nào đó squash trước đó cam kết vào này.

Tôi làm như thế nào?

+0

Đây là một trong nhiều lý do khiến tôi không phải là người hâm mộ. a –

+0

Ngoài ra. Có sự khác biệt giữa ngày bắt đầu và ngày tác giả. Phụ thuộc vào những gì bạn đang làm. –

+0

Có thể trùng lặp [git squash và giữ dấu thời gian của cam kết cuối cùng] (https://stackoverflow.com/questions/10020641/git-squash-and-preserve-last-commits-timestamp) –

Trả lời

31

Hack: Bạn có thể sử dụng

git commit --amend --reset-author 

Các git commit trang người đàn ông nói rằng đây "cũng canh tân timestamp tác giả" . Bạn không phải thực hiện bất kỳ thay đổi nào đối với cam kết (tôi đã thử nó cục bộ) và nó sẽ cập nhật dấu thời gian cho thời gian hiện tại. Chắc chắn là một loại lạm dụng, nhưng có vẻ như nó hoạt động.

0

Thay vì git rebase -i b4465be, sao chép bản ghi gần đây vào clipboard và làm:

git reset --soft b4465be 
git commit 

dán và chỉnh sửa các bản ghi thay đổi, tiết kiệm & thoát khỏi trình biên tập thông điệp cam kết.

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