Git Reflog - Cách khôi phục một nhánh đã xóa chưa được hợp nhất



Bài viết này trên Git Reflog là một hướng dẫn toàn diện về cách khôi phục nhánh đã xóa trong Git với sự trợ giúp của Git Reflog.

“Bạn đã bao giờ bị mất một chi nhánh, mà mã nguồn vẫn chưa được hợp nhất trong chi nhánh‘ phát hành ’hoặc chi nhánh‘ chính ’chưa? Điều gì sẽ xảy ra nếu bạn muốn tạo lại một nhánh đã xóa mặc dù công việc của nó đã được hợp nhất vào nhánh chính? ” . Chà, giải pháp duy nhất cho những tình huống như vậy là Truy cập nhật ký .

Qua bài viết này trên Git Reflog, tôi sẽ giúp bạnhiểu các tình huống mà công việc của bạn trên một nhánh có thể bị mất và cách khôi phục nhánh.Ngoài ra, bài viết này sẽ nêu bật cách bạn có thể thực hiện để ngăn chặn việc mất chi nhánh ngoài ý muốn khi làm việc trong một dự án lớn.





    1. Git Reflog là gì?
    2. Làm thế nào và khi nào một chi nhánh bị xóa?
    3. Khôi phục chi nhánh đã xóa
    4. Công việc nào được khôi phục khi phục hồi nhánh đã xóa?
    5. Lệnh phụ của Git Reflog

Vì vậy, chúng ta hãy bắt đầu với bài viết này.



Hãy xem xét một kịch bản, một maintainer phải hợp nhất nhiều nhánh tính năng từ các cộng tác viên khác nhau và sau đó xóa chúng cuối cùng nhưng nhánh bị xóa vô tình trước khi công việc có thể được hợp nhất?

Vâng, trước khi tôi chuyển sang bài viết này, hãy để tôi nói với bạn rằng nó không thể thực hiện được trong Git. được bảo mật và hoạt động như một bài kiểm tra sẽ không cho phép bạn làm như vậy. Vì vậy, đây là nơi Git Reflog xuất hiện trong bức tranh.

Git Reflog là gì?

CácLệnh ‘reflog’ giữ một theo dõi mọi thay đổi được thực hiện trong các tài liệu tham khảo (các nhánh hoặc thẻ) của một kho lưu trữ và lưu giữ lịch sử nhật ký của các nhánh và thẻ được tạo cục bộ hoặc đã kiểm xuất. Các bản ghi tham chiếu như ảnh chụp nhanh cam kết về thời điểm chi nhánh được tạo hoặc nhân bản, đăng xuất, đổi tên hoặc bất kỳ cam kết nào được thực hiện trên chi nhánh được duy trì bởi và được liệt kê bằng lệnh ‘reflog’.



Ghi chú: Chi nhánh sẽ chỉ có thể khôi phục từ thư mục làm việc của bạn nếu chi nhánh đã từng tồn tại trong kho lưu trữ cục bộ của bạn, tức là chi nhánh được tạo cục bộ hoặc đăng xuất từ ​​kho lưu trữ từ xa trong kho lưu trữ cục bộ của bạn để Git lưu trữ nhật ký lịch sử tham chiếu của nó.

Lệnh này phải được thực thi trong kho lưu trữ có nhánh bị mất. Nếu bạn xem xéttình huống kho lưu trữ từ xa, sau đó bạn phải thực hiện lệnh reflog trên máy của nhà phát triển có chi nhánh.

chỉ huy: đi reflog

kiến thức cơ bản về máy chủ sql cho người mới bắt đầu

Giờ bạn đã biết Git Reflog là gì, hãy để chúng tôithử xóa cả nhánh đã hợp nhất và chưa hợp nhất và xem Git xử lý điều đó như thế nào?

Bước 1: Liệt kê các nhánh được hợp nhất thành tổng thể

Đầu tiên, hãy xem phần ‘ bậc thầy 'Nhánh nếu bạn đang ở trên một số nhánh khác bằng cách sử dụng lệnh:

$ git tổng đài thanh toán

Đầu ra

Git Checkout Master - Git Reflog - Edureka

Bây giờ, để có được danh sách các nhánh đã hợp nhất, hãy đề cập đến lệnh sau:

chi nhánh $ git - hợp nhất

Đầu ra:

Bước 1.1: Sau đó, xóa nhánh đã hợp nhất:

$ git branch -d issue # 902

Đầu ra:

Nhánh 'issue # 902' đã được xóa thành công vì nó đã được hợp nhất vào nhánh 'master'.

Bước 2: Bây giờ, chúng ta hãy liệt kê các nhánh chưa được hợp nhất vào chính.

chi nhánh $ git - không hợp nhất

Đầu ra

Bước 2.2: Cuối cùng, chúng ta hãy xóa một nhánh chưa được hợp nhất bằng lệnh sau:

$ git branch -d prepod

Nếu bạn cố gắng xóa một trong các nhánh có công việc chưa hoàn thành, nói rằng nhánh 'chuẩn bị', git sẽ hiển thị một thông báo cảnh báo.

Đầu ra

Bây giờ, trước khi tôi cho bạn biết cách bạn có thể khôi phục dữ liệu trong bài viết này trên Git Reflog, hãy để tôi cho bạn biết chính xác điều gì sẽ xảy ra khi một nhánh bị xóa và nhánh có thể được khôi phục trong những trường hợp nào.

Làm thế nào và khi nào một chi nhánh bị xóa?

Như chúng ta biết rằng Git là một Hệ thống kiểm soát phiên bản phân tán (DVCS), mọi máy có bản sao hoặc bản sao của kho lưu trữ hoạt động như cả hai nút và một trung tâm . Điều nàyngụ ý rằng mỗi máy sẽ có bản sao riêng của toàn bộ mã kho lưu trữ và lịch sử.Không cần phải nói bạn sẽ chia sẻ công việc của bạn với những người khác và xuất bản giống nhau.

Do đó, trong các tình huống như vậy, có thể có 3 trường hợp khi một chi nhánh bị xóa trong một tình huống thực tế với nhiều người đóng góp làm việc trong một dự án lớn. Sau đây có thể là các trường hợp:

Trường hợp 1 - Nhà phát triển có thể hợp nhất hoặc xóa chi nhánh

Hãy xem xét một tình huống trong đó một nhà phát triển hợp nhất nhánh tính năng vào chi nhánh chính cục bộ và sau đó xóa nhánh tính năng bằng cách sử dụng dấu ‘ chi nhánh git Lệnh ’với“ - d ”Như đã thấy trong ảnh chụp màn hình trước đó.

Chỉ huy: 'Git branch -d branch_name'

Cũng có thể xảy ra trường hợp nhà phát triển quyết định bỏ rác các thay đổi trên nhánh và quyết định xóa nhánh mà không hợp nhất nó với bất kỳ nhánh nào khác bằng lệnh sau:

Chỉ huy: 'Git branch -D branch_name'

Với lệnh trên, nhà phát triểnbuộc xóa nhánh ghi đè cảnh báo git

$ git chi nhánh -D Prerod

Đầu ra

Ghi chú : Chi nhánh ‘preprod’ sẽ không còn được liệt kê khi bạn chạy lệnh ‘git branch’. Vì vậy, ycông việc của chúng tôi được lưu trên nhánh này sẽ bị mất.

Trường hợp 2 - Nhà phát triển xóa một nhánh trong kho lưu trữ được chia sẻ

Hãy xem xét một tình huống, trong đó một nhà phát triển có quyền đọc / ghi cố gắng xóa nhánh từ xa một cách cưỡng bức bằng cáchbằng cách sử dụng lệnh ‘git push’ với cờ ‘–delete’.

một phương pháp javascript là gì
$ git push origin - xóa nhanh chóng

Đầu ra

Ngoài ra, cũng có thể có trường hợp người dùng không được ủy quyền hoặc độc hại buộc phải đẩy để xóa nhánh từ xa.Trong trường hợp này, người bảo trì sẽ chỉ có thể khôi phục nhánh ‘quickfix’ đã bị xóa nếu nhà phát triểntrước đó đã kiểm tra chi nhánh này. Trong trường hợp này, kho lưu trữ cục bộ của nó sẽ vẫn có các bản ghi tham chiếu của nó.

Nếu người duy trì không thể khôi phục chi nhánh, thì chủ sở hữu của chi nhánh đã xóa nó phải khôi phục từ nhật ký cục bộ của mình.

Trường hợp 3 - Một tập lệnh hook có siêu đặc quyền sẽ xóa nhánh

Đây có thể là một trường hợp hiếm gặp, nhưng, một trường hợp có thể xảy ra mà một tập lệnh hook được kích hoạt tại một số sự kiện hoạt động git nhất định và buộc xóa các nhánh chưa được hợp nhất. Bạn có thểcoi một trong các lệnh được đề cập ở trên được viết trong một tập lệnh hook với các đặc quyền sudo.

Bây giờ, bạn đã biết điều gì sẽ xảy ra khi bạn xóa nhánh, chúng ta hãy chuyển sang bài viết này trên Git Reflog và xem cách khôi phục nhánh bị mất.

Khôi phục chi nhánh đã xóa bằng Git Reflog

Bước 1 : Nhật ký lịch sử của tất cả các tài liệu tham khảo

Nhận danh sách tất cả các nhật ký lịch sử được ghi lại cục bộ cho tất cả các tham chiếu (‘master’, ‘uat’ và ‘prepod’) trong kho lưu trữ này.

đi reflog

Bước 2 : Xác định dấu ấn lịch sử

Như bạn có thể tham khảo từ ảnh chụp nhanh ở trên, Id cam kết được đánh dấu: e2225bb cùng với chỉ số con trỏ HEAD: 4 là khi ‘ bán lại Nhánh ’được tạo từ con trỏ HEAD hiện tại trỏ đến tác phẩm mới nhất của bạn.

Bước 3 : Bình phục

Để khôi phục lại ‘Bán lại ‘Nhánh sử dụng lệnh‘Git checkout’ chuyển tham chiếu con trỏ HEAD với id chỉ mục - 4.Đây là tham chiếu con trỏ khi nhánh ‘preprod’ được tạo id cam kết dài được đánh dấu trong ảnh chụp màn hình đầu ra.

git checkout -b preprod HEAD @ {4}

Đầu ra

.trim () java

Và Voila! ‘ bán lại ‘Nhánh được khôi phục trở lại với tất cả mã nguồn của bạn.

GHI CHÚ : Để tôi breakup lệnh ‘git checkout’ được sử dụng ở trên và giúp bạn hiểu rõ hơn:

Lệnh ‘git checkout’ là một lệnh được tải quá mức (Cũng giống như bất kỳ hàm nạp chồng nào của Java). Đây là phần mà nhánh thực tế được phục hồi.

Lệnh đơn này lần đầu tiên kiểm tra dấu thời gian lịch sử trước đó do HEAD @ {4} con trỏ và sau đó tạo một nhánh với tên ‘preprod’ bằng cách sử dụng tùy chọn “-b” cũng như chuyển thư mục làm việc của bạn sang nhánh mới được tạo.

Điều này ngụ ý rằng chuyển mạch nhánh sẽ từ 'chính' sang 'tiền chế' như được chỉ ra trong màn hình đầu ra.Bây giờ bạn có thể hợp nhất nó với 'master' hoặc nhánh 'release' theo mô hình phân nhánh của bạn.

Bây giờ, bạn đã biết cách khôi phục một nhánh, hãy để tôi cho bạn biết công việc nào được khôi phục khi một nhánh bị xóa được khôi phục.

Công việc nào được khôi phục khi phục hồi nhánh đã xóa?

Các tệp đã được lưu trữ và lưu trong danh sách chỉ mục lưu trữ sẽ được khôi phục trở lại. Mọi tệp chưa được kiểm tra sẽ bị mất. Tôi cũngt là một ý kiến ​​hay nếu bạn luôn chuẩn bị và cam kết công việc của bạn hoặc lưu trữ chúng.

Để tìm nạp các tham chiếu nhật ký của một nhánh hoặc thẻ cụ thể, hãy chạy lệnh - “git reflog”.

Ví dụ: Để kiểm tra các tham chiếu nhật ký của nhánh ‘uat’, hãy sử dụng lệnh - “git reflog uat”.

Lệnh phụ của Git Reflog

đi reflog

Lệnh để mở trang hướng dẫn sử dụng

$ git reflog --help

Đầu ra

đi reflog chỉ

Hiển thị nhật ký của tham chiếu được cung cấp trong dòng lệnh.

git reflog show master @ {0}

đi reflog hết hiệu lực

Lệnh này được sử dụng để lược bớt các mục reflog cũ hơn.

git reflog hết hạn

đi reflog xóa bỏ

Lệnh này xóa các mục nhập đơn khỏi lịch sử nhật ký lại.

git reflog xóa

đi reflog tồn tại

Lệnh này kiểm tra xem ref (chi nhánh hoặc thẻ) có mục nhập lịch sử nhật ký - reflog hay không.

git reflog tồn tại

Ngoài các lệnh nêu trên, Lệnh “Git Reflog” có các lệnh con khác nhau và các tùy chọn khác nhau tùy thuộc vào các lệnh con được đề cập ở trên. Để đọc thêm, hãy chạy “ git reflog –help ”Từ cửa sổ đầu cuối.

Với điều này, chúng ta kết thúc bài viết này trên Git Reflog.Mục đích của DevOps là tạo ra phần mềm chất lượng tốt hơn, nhanh hơn và có độ tin cậy cao hơn đồng thời mời gọi sự giao tiếp và cộng tác giữa các nhóm. Nếu bạn bị hấp dẫn bởi bài viết này, c heck out của Edureka, một công ty học trực tuyến đáng tin cậy với mạng lưới hơn 250.000 người học hài lòng trải dài trên toàn cầu. Khóa đào tạo Chứng chỉ Edureka DevOps giúp người học hiểu DevOps là gì và có được kiến ​​thức chuyên môn về các quy trình và công cụ DevOps khác nhau như Puppet, Jenkins, Nagios, Ansible, Chef, Saltstack và GIT để tự động hóa nhiều bước trong SDLC.

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến nó trong phần nhận xét của bài viết 'Git Reflog' và chúng tôi sẽ liên hệ lại với bạn càng sớm càng tốt.