Git reflog

Git nâng cao

Amanda Crawford-Adamo

Software and Data Engineer

Git Reflog là gì?

  1. Bản ghi cục bộ của TẤT CẢ cập nhật tham chiếu trong repo
  2. Reflog lưu cục bộ tại thư mục .git/logs/refs/heads/
  3. Ghi lại thay đổi ở đầu nhánh và vị trí HEAD
  4. Như bộ bảo hiểm cho thao tác Git
  5. Giúp khôi phục thay đổi hoặc xóa nhầm

Ví dụ đồ thị thay đổi lịch sử git

Git nâng cao

Git Reflog và Git Log

Tính năng Git Reflog Git Log
Mục đích Hiển thị cập nhật/thay ghi tham chiếu trong repo cục bộ Chỉ hiển thị lịch sử commit
Phạm vi Chỉ repository cục bộ Repo cục bộ và remote
Nội dung Mọi cập nhật ref (commit, reset, merge, …) Chỉ commit
Tồn tại Tạm thời (thường 90 ngày) Vĩnh viễn (một phần lịch sử repo)
Trường hợp dùng Khôi phục commit mất, xem hành động gần đây Xem lịch sử dự án, hiểu phát triển tính năng
Git nâng cao

Lệnh Reflog

  • Hiển thị log và hoạt động của HEAD
    git reflog
    git reflog show
    
  • Dọn mục log cũ hoặc không truy cập được
    git reflog expire
    
Git nâng cao

Cấu trúc đầu ra Reflog

Phân tích cấu trúc văn bản đầu ra của reflog

Ví dụ đầu ra reflog trong terminal

Thành phần Mô tả
short-hash Hash commit rút gọn
ref Thường là HEAD, cũng có thể là tên nhánh
index Vị trí trong reflog (0 là mới nhất)
action Loại hành động (commit, reset, merge, …)
descriptions Mô tả về hành động
1 https://hackernoon.com/time-to-rewrite-your-git-history-effectively-with-git-reflog
Git nâng cao

Lọc: Since và Until

  • since = hiển thị mục từ thời điểm này

    git reflog --since "time-qualifer"
    
  • until = hiển thị mục đến thời điểm này

    git reflog --until "time-qualifer"
    
Cách dùng
git reflog --since="1 week ago"
git reflog --until="yesterday"
git reflog --until="2024-01-01"
Git nâng cao

Khôi phục nhánh đã xóa

Tình huống

  • Tạo nhánh etl-feature
  • Commit thay đổi tính năng ETL vào nhánh này
  • Lỡ xóa nhánh
  • Mất toàn bộ thay đổi mã

Làm sao khôi phục nhánh etl-feature?

Cách làm

  1. Xác định hash của commit ở đầu nhánh đã xóa bằng git reflog
  2. Dùng git checkout chuyển HEAD tới hash đó
  3. Tạo nhánh mới từ commit hiện HEAD đang trỏ tới
git reflog
git checkout <hash>
git checkout -b <branch-name>
1 https://stackoverflow.com/questions/3640764/can-i-recover-a-branch-after-its-deletion-in-git
Git nâng cao

Git Reset

  • Di chuyển HEAD tới commit chỉ định.
  • Tùy kiểu reset, thư mục làm việc và khu vực staging sẽ cập nhật.
Kiểu reset Lệnh Ảnh hưởng đến Working Directory Ảnh hưởng đến Staging Area
Soft git reset --soft <commit> Không đổi Thay đổi vẫn được stage
Mixed (mặc định) git reset --mixed <commit> Không đổi Bỏ stage các thay đổi
Hard git reset --hard <commit> Hủy thay đổi Hủy thay đổi
Git nâng cao

Tìm commit bị mất

Tình huống

  • Test bắt đầu fail sau các commit và rebase
  • Không rõ commit gây lỗi
  • Cần quay lại trạng thái pass

Làm sao quay lại thay đổi ETL trước đó?

Cách làm

  1. Tìm hash commit đã mất bằng Git Reflog
  2. Dùng git reset về commit có test pass
git reflog
git reset --soft HEAD@{1}
Git nâng cao

Thực hành tốt

  • Mạnh mẽ để khôi phục mã và commit bị mất
  • Viết thông điệp commit rõ ràng
  • Thường xuyên push lên remote
  • Cẩn trọng khi force push

Reflog là “cỗ máy thời gian” cục bộ khi ta mắc lỗi

Hình đồng hồ quay ngược thời gian

Git nâng cao

Ayo berlatih!

Git nâng cao

Preparing Video For Download...