2011-01-24 35 views
59

Hãy nói rằng tôi có một đồ thị như thế này:Danh sách tất cả các cam kết git?

A---B---C---D (master) 
    \ 
     \-E---F (HEAD) 

Nếu tôi làm git log --all --oneline, tôi sẽ nhận được tất cả sáu các cam kết của mình.

Nhưng nếu đồ thị là

A---B---C---D (master, HEAD) 
    \ 
     \-E---F 

tôi sẽ không nhìn thấy E và F. Tôi có thể nhận git để cho tôi biết tất cả các cam kết, bao gồm cả những người trên cành mà không được đặt tên?

Cảm ơn

Trả lời

35

Không đặc biệt easily- nếu bạn đã mất con trỏ đến đỉnh của một chi nhánh, nó giống như việc tìm kiếm một cây kim trong đống cỏ khô. Bạn có thể tìm thấy tất cả các cam kết dường như không được tham chiếu thêm nữa - git fsck --unreachable sẽ thực hiện việc này cho bạn- nhưng điều đó sẽ bao gồm các cam kết mà bạn đã ném đi sau git commit --amend, các cam kết cũ trên các nhánh mà bạn đã từ chối vv v.v. những cam kết cùng một lúc là khá có khả năng quá nhiều thông tin để lội qua.

Vì vậy, câu trả lời ngắn gọn là, đừng để mất dấu những thứ bạn quan tâm. Quan trọng hơn, các reflog sẽ giữ tham chiếu đến tất cả các cam kết bạn đã sử dụng trong 60 ngày qua. Quan trọng hơn, họ sẽ đưa ra một số bối cảnh về những gì những cam kết .

+5

+1: Hoàn toàn không có sự khác biệt giữa cam kết cố tình mồ côi bởi 'commit --amend' hoặc' rebase' và một người vô tình mồ côi bằng cách làm việc với HEAD tách rời, nói. – Cascabel

+3

thực sự. có lẽ cách dễ nhất để phục hồi từ tình huống đó sẽ là xem xét việc sửa lỗi cho bản thân HEAD. – araqnid

+0

Cảm ơn, điều này sẽ giúp. Ngay cả những câu trả lời flippant :) +1 – Amadan

3

Tôi đã có may mắn phục hồi các cam kết bằng cách nhìn vào reflog, được đặt tại .git/logs/HEAD

sau đó tôi có người cuộn xuống đến cuối của tập tin, và tôi thấy cam kết tôi vừa mất .

3

Chúng tôi sẽ git log đôi khi là không tốt để có được tất cả các cam kết cụ thể, như vậy để xem này ...

Đối với Mac: Nhận được vào bạn git dự án và loại:

$ nano .git/logs/HEAD 

để xem bạn tất cả các cam kết trong đó, hoặc:

$ gedit .git/logs/HEAD 

để xem bạn tất cả các cam kết trong đó,

thì bạn có thể chỉnh sửa trong bất kỳ trình duyệt yêu thích nào của mình.

32

Khi tôi giải quyết vấn đề này, tôi sử dụng lệnh sau:

git reflog | awk '{ print $1 }' | xargs gitk 

này cho phép tôi hình dung cam kết gần đây đã trở thành không đầu.

Tôi có gói này trong trình trợ giúp tập lệnh được gọi là ~/bin/git-reflog-gitk.

4

Tôi giải quyết vấn đề này như thế nào? Sử dụng git fsck và đăng nhập!

Trước tiên hãy tạo tệp chứa cam kết và đốm màu bị mất (không thể truy cập). (Lưu ý: nếu bạn đã làm một cái gì đó như git gc sau đó nó sẽ thu thập rác thải tất cả chúng cam kết và bạn sẽ không tìm thấy chúng ở đây!)

$git fsck --lost-found > lost_found.commits 

Cung cấp cho bạn một tập tin như thế này:

treo lủng lẳng cam dec2c5e72a81ef06963397a49c4b068540fc0dc3
treo lủng lẳng blob f8c2579e6cbfe022f08345fa7553feb08d60a975
treo lủng lẳng blob 0eb3e86dc112332ceadf9bc826c49bd371acc194
treo lủng lẳng blob 11cbd8eba79e01f4fd7f496b1750953146a09502
treo lủng lẳng cam 18733e44097d2c7a800650cea442febc5344f9b3
Dangling blob 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05

Sau đó, bạn có thể mở tệp này với trình soạn thảo văn bản yêu thích để sao chép băm/băm từ đó. (* ho * macro vim hoạt động tuyệt vời cho điều này * ho *)

Bây giờ bạn có thể đăng nhập lại từ này cam kết với cái gì đó như git log --oneline <commit hash>. Cách khác, gitk, tig hoặc bất kỳ trình xem git nào khác cũng hoạt động.

Trong trường hợp của bạn nếu bạn tìm ra băm cho cam F log sẽ cho bạn thấy một cái gì đó như thế này,

A---B---E---F 

Nhanh chóng và dễ dàng! Bây giờ bạn có thể tìm thấy bối cảnh đằng sau tất cả những cam kết lơ lửng đó.

P.S. Vâng, tôi biết, bài viết muộn, nhưng ồ, ai đó có thể tìm thấy nó ở đây và thấy nó hữu ích. (Chủ yếu là khả năng tôi trong 6 tháng khi tôi google này một lần nữa)

16

Giống như @Kieran 's trả lời, nhưng đối với giao diện điều khiển: git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')

+0

Bạn có cần phải bao gồm phần cuối cùng: $ (git reflog | awk '{print $ 1}')? Điều này làm gì? Sau khi thử giải pháp của bạn, có vẻ như nó tạo ra cùng một đầu ra ngay cả khi không có phần cuối cùng đó. – wmock

+0

Nếu bạn di chuyển con trỏ nhánh của mình và để lại một số cam kết không có tham chiếu (như OP đã làm), chúng sẽ không còn hiển thị trong 'git log --all' nữa. Một ví dụ nhanh: Sau khi 'git reset --hard @ ^' cam kết HEAD @ {0} của bạn sẽ chỉ có trong reflog, và vì 'git reflog' không hỗ trợ' --graph' bạn phải chuyển các commit tới 'git log --graph' để hiển thị trực quan. –

+2

bạn có thể sử dụng '' '--reflog''' thay vì' '' $ (git reflog | awk '{print $ 1}') '' ' – Sild

21

Hãy thử:

git log --reflog 

trong đó liệt kê tất cả git cam kết bởi giả vờ rằng tất cả các đối tượng được đề cập bởi reflogs (git reflog) được liệt kê trên dòng lệnh là <commit>.

1

@bsimmons

git fsck --lost-found | grep commit 

Sau đó tạo một chi nhánh cho mỗi người:

$ git fsck --lost-found | grep commit 
Checking object directories: 100% (256/256), done. 
dangling commit 2806a32af04d1bbd7803fb899071fcf247a2b9b0 
dangling commit 6d0e49efd0c1a4b5bea1235c6286f0b64c4c8de1 
dangling commit 91ca9b2482a96b20dc31d2af4818d69606a229d4 

$ git branch branch_2806a3 2806a3 
$ git branch branch_6d0e49 6d0e49 
$ git branch branch_91ca9b 91ca9b 

Bây giờ nhiều công cụ sẽ cho bạn thấy một hình dung đồ họa của những cam kết mất.

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