2013-07-25 50 views
91

Trang hướng dẫn cho biết nhật ký hiển thị nhật ký cam kết và đăng nhập lại quản lý thông tin reflog. Chính xác những gì là reflog thông tin và những gì hiện nó có đăng nhập không? Nhật ký có vẻ chi tiết hơn nhiều.Sự khác nhau giữa git reflog và log là gì?

Trả lời

119

git log hiển thị HEAD hiện tại và tổ tiên của nó. Tức là, nó in các điểm HEAD cam kết, sau đó là phụ huynh của nó, phụ huynh của nó, và vân vân. Nó đi ngược trở lại thông qua tổ tiên của repo, bằng cách đệ quy tìm kiếm cha mẹ của mỗi người cam kết.

(Trên thực tế, một số cam kết có nhiều hơn một phụ huynh. Để xem một bản ghi đại diện hơn, sử dụng một lệnh như git log --oneline --graph --decorate.)

git reflog không đi qua gốc ĐẦU tại tất cả. Các reflog là một danh sách theo thứ tự các cam kết mà HEAD đã chỉ đến: nó hoàn tác lịch sử cho repo của bạn. Việc reflog không phải là một phần của bản thân repo (nó được lưu trữ riêng cho các cam kết) và không được bao gồm trong push, fetches hoặc nhái; nó hoàn toàn là địa phương.

Ngoài ra: hiểu sự reflog có nghĩa là bạn không thể thực sự mất dữ liệu từ repo của bạn sau khi nó được cam kết. Nếu bạn vô tình đặt lại thành một commit cũ hơn, hoặc rebase sai, hoặc bất kỳ thao tác nào khác trực quan "remove" commit, bạn có thể sử dụng reflog để xem bạn đã ở đâu và git reset --hard quay lại ref đó để khôi phục trạng thái trước đó của bạn. Hãy nhớ rằng, refs ngụ ý không chỉ là cam kết nhưng toàn bộ lịch sử đằng sau nó.

+11

Một lời cảnh báo: đôi khi bạn CÓ THỂ mất dữ liệu vì các mục nhập lại không tồn tại vĩnh viễn - chúng bị thanh trừng khi có các điều kiện nhất định. Xem [câu trả lời này] (http://stackoverflow.com/a/26451688/1614641) và các tài liệu cho [git-reflog] (https://www.git-scm.com/docs/git-reflog) và [ git-gc] (https://www.git-scm.com/docs/git-gc). Nói chung, nếu hoạt động phá hoại không quá 2 tuần trước, bạn có thể an toàn nhất. – mcmlxxxvi

+0

@mcmlxxxvi Tôi có hai thư mục cục bộ cho cùng một repo, tôi có thể hợp nhất các reflog cho hai thư mục không? – Tmx

7

Đây là explanation of reflog from the Pro Git book:

Một trong những điều Git làm trong nền trong khi bạn đang làm việc đi là giữ một reflog - một bản ghi về nơi TRỤ và chi nhánh của bạn tài liệu tham khảo đã được trong vài tháng qua .

Bạn có thể thấy reflog của bạn bằng cách sử dụng git reflog:

$ git reflog 
734713b... [email protected]{0}: commit: fixed refs handling, added gc auto, updated 
d921970... [email protected]{1}: merge phedders/rdocs: Merge made by recursive. 
1c002dd... [email protected]{2}: commit: added some blame and merge stuff 
1c36188... [email protected]{3}: rebase -i (squash): updating HEAD 
95df984... [email protected]{4}: commit: # This is a combination of two commits. 
1c36188... [email protected]{5}: rebase -i (squash): updating HEAD 
7e05da5... [email protected]{6}: rebase -i (pick): updating HEAD 

Mỗi lần đầu chi nhánh của bạn sẽ được cập nhật cho lý do nào, các cửa hàng Git rằng thông tin cho bạn trong lịch sử tạm thời này. Và bạn cũng có thể chỉ định các commit cũ hơn với dữ liệu này.

Lệnh reflog cũng có thể được sử dụng để xóa mục nhập hoặc hết hạn mục nhập từ quá trình cập nhật quá cũ. Từ số official Linux Kernel Git documentation for reflog:

Tiểu ban expire được sử dụng để tỉa bớt các mục nhập cũ hơn.

Để xóa các mục nhập duy nhất từ ​​việc reflog, hãy sử dụng tiểu mục delete và chỉ định mục nhập chính xác (ví dụ: git reflog delete [email protected]{2}).

+0

Nhưng không 'cái git log' cung cấp cho bạn những thông tin giống nhau không?Xin lỗi nếu nó có vẻ hiển nhiên, tôi rất mới để GIT và muốn nhận được một số vấn đề cơ bản ngay trước OMG đầu tiên của tôi. – Noich

+2

Nhật ký Git là một bản ghi về các cam kết *** của bạn ***. Các reflog, như các trạng thái cuốn sách Pro Git, là một hồ sơ của bạn *** tài liệu tham khảo *** (về cơ bản, con trỏ chi nhánh của bạn và con trỏ 'HEAD' của bạn), và cam kết mà họ đã được chỉ vào. Điều đó có ý nghĩa? Trên một mặt lưu ý, 'log' cũng có thể hiển thị cho bạn thông tin reflog, nhưng bạn phải chuyển một cờ tùy chọn đặc biệt làm đối số cho nó,' --walk-reflogs'. –

+1

Ngoài ra, vì bạn là người mới bắt đầu Git, tôi khuyên bạn nên đọc cuốn sách Pro Git, đó là cách tôi đã học hầu hết những gì tôi đã học về Git. Tôi đề nghị các chương 1-3 và 6-6.5. Tôi cũng khuyên bạn nên tìm hiểu cách để rebase cả hai tương tác và không tương tác. –

32
  • git log cho thấy các cam kết log truy cập từ refs (người đứng đầu, thẻ, điều khiển từ xa)
  • git reflog là một kỷ lục của tất cả các cam kết đó đang hoặc đã được tham chiếu trong repo của bạn bất cứ lúc nào.

Đó là lý do tại sao git reflog (một địa phương ghi được cắt tỉa sau 90 ngày theo mặc định) được sử dụng khi bạn làm một "phá hoại" hoạt động (như xóa một chi nhánh), để lấy lại SHA1 rằng được tham chiếu bởi nhánh đó.
Xem git config:

gc.reflogexpire 
gc.<pattern>.reflogexpire 

git reflog hết hạn loại bỏ các mục reflog lớn hơn thời gian này; mặc định là 90 ngày.
Với "<pattern>" (ví dụ: "refs/stash") ở giữa, cài đặt chỉ áp dụng cho các tham chiếu khớp với số <pattern>.

safety net

git reflog thường được tham khảo như "your safety net"

Trong trường hợp rắc rối, những lời khuyên chung, khi git log không hiển thị cho bạn những gì bạn đang tìm kiếm, là:

"Keep calm and use git reflog"

keep calm

Một lần nữa, reflog là bản ghi cục bộ của SHA1 của bạn.
Ngược lại với git log: nếu bạn đẩy repo của mình đến upstream repo, bạn sẽ thấy cùng một số git log, nhưng không nhất thiết phải giống như git reflog.

1

tôi rất tò mò về vấn đề này như là tốt và chỉ muốn xây dựng và tóm tắt một chút:

  1. git log cho thấy một lịch sử của tất cả các cam kết của mình đối với các chi nhánh bạn đang ở trên. Thanh toán một chi nhánh khác và bạn sẽ thấy một lịch sử cam kết khác. Nếu bạn muốn xem bạn cam kết lịch sử cho tất cả các chi nhánh, hãy nhập git log --all.

  2. git reflog hiển thị bản ghi tham chiếu của bạn như Cupcake đã nói. Có một mục nhập mỗi khi một cam kết hoặc thanh toán nó được thực hiện. Hãy thử chuyển đổi qua lại giữa hai nhánh một vài lần bằng cách sử dụng git checkout và chạy git reflog sau mỗi lần thanh toán. Bạn sẽ thấy mục nhập hàng đầu được cập nhật mỗi lần làm mục nhập "thanh toán". Bạn không thấy các loại mục nhập này trong git log.

Tài liệu tham khảo: http://www.lornajane.net/posts/2014/git-log-all-branches

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