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
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ó.
Đâ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}
).
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
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'. –
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. –
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>
.
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à:
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
.
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:
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ậpgit log --all
.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ụnggit checkout
và chạygit 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 tronggit log
.
Tài liệu tham khảo: http://www.lornajane.net/posts/2014/git-log-all-branches
- 1. Sự khác nhau giữa git clone và checkout là gì?
- 2. Sự khác nhau giữa TFS, SVN và GIT là gì?
- 3. Sự khác biệt giữa git-log và git-whatchanged?
- 4. Sự khác nhau giữa GIT và CVS
- 5. Sự khác nhau giữa "git checkout -f" và "git reset --hard HEAD" là gì?
- 6. Sự khác nhau giữa 'git format-patch và' git diff 'là gì?
- 7. Sự khác biệt giữa 'git log origin/master' vs 'git log origin/master ..'
- 8. Sự khác nhau giữa WPF và WinForms là gì?
- 9. Sự khác nhau giữa JavaScript và Java là gì?
- 10. Sự khác nhau giữa ODBC và OleDB là gì?
- 11. Sự khác nhau giữa SGML và XML là gì?
- 12. Sự khác nhau giữa DefaultSelenium và RemoteWebDriver là gì?
- 13. Sự khác nhau giữa RMI và Corba là gì?
- 14. Sự khác nhau giữa scgi và wsgi là gì?
- 15. Sự khác nhau giữa wsHttpBinding và ws2007HttpBinding là gì?
- 16. Sự khác nhau giữa Pingback và Trackback là gì?
- 17. Trong Python, sự khác nhau giữa ".append()" và "+ = []" là gì?
- 18. Sự khác nhau giữa AxInterop và Interop là gì?
- 19. Sự khác nhau giữa CellClick và CellMouseClick là gì?
- 20. Sự khác nhau giữa .bashrc, .bash_profile và .environment là gì?
- 21. Sự khác nhau giữa JSP và Facelets là gì?
- 22. Sự khác nhau giữa hg quên và hg là gì?
- 23. Sự khác nhau giữa GDI và GDI + là gì?
- 24. Sự khác nhau giữa đá quý và plugin là gì?
- 25. Sự khác nhau giữa metaClass.methods và metaClass.metaMethods là gì?
- 26. Sự khác nhau giữa kEND và $ end là gì?
- 27. Sự khác nhau giữa java và jsp là gì?
- 28. Sự khác nhau giữa Application.Run() và Form.ShowDialog() là gì?
- 29. Sự khác nhau giữa -0 và 0 là gì?
- 30. Sự khác nhau giữa HTTP 1.0 và 1.1 là gì?
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
@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