Bài 3: git reset, git log & git diff
Khi đã thực hiện commit, commit đó chưa public (chưa đẩy lên Remote Repo bằng lệnh git push) thì bạn có thể hủy (undo) commit đó với hai trường hợp bằng lệnh git reset như sau:
Trường hợp này sẽ hủy commit cuối, con trỏ HEAD sẽ chuyển về commit cha. Đồng thời những thay đổi của commit cuối được chuyển vào vùng staging nhằm để có cơ hội commit lại hoặc sửa đổi, cú pháp lệnh như sau:
git reset --soft HEAD~1
Khi dùng tham số --hard thì kết quả giống với dùng tham số --soft, chỉ có một khác biết là nội dung thay đổi của commit cuối không đưa đưa vào staging mà bị hủy luôn. Trường hợp này dùng khi bạn quyết định hủy hoàn toàn commit cuối
git reset --hard HEAD~1
Nếu bạn đã dùng lệnh git add để cập nhật thay đổi vào vùng staging, bạn có thể hủy thao tác này bằng cách thực hiện lệnh:
git reset
Nếu muốn hủy một file nào đó trong vùng staging chứ không phải toàn bộ thì dùng lệnh
git reset -- filename
Lệnh git log giúp bạn xem lại thông tin lịch sử commit. Lệnh git log có nhiều tham số để xuất ra, định dạng các thông tin hiển thị theo cách mong muốn.
Mặc định thi hành git log nó liệt kê các commit theo thứ tự từ mới nhất đến cũ nhất, mỗi commit có các thông tin gồm: mã hash của commit, dòng thông báo, người tạo commit và ngày tạo commit.
Khi số lượng log nhiều, nó hiển thị trước một trang log, sau đó có dấu nhắc chờ lệnh để bạn điều hướng, tìm kiếm ... Để có trợ giúp về các lệnh này hãy nhấn h tại dấu nhắc lệnh
Một số phím chức năng bạn có thể nhập đề điều hướng và tìm kiếm trong log như:
return - dòng tiếp theo
w - trang tiếp
spacebar - trang trước
q - thoát
?pattern - tìm kiếm, với pattern là mẫu tìm kiếm (keyword)
/pattern - giống ?pattern
n - đến vị trí tìm kiếm phía dưới
N - đến kết quả tìm kiếm phía trước
git log
Nếu chỉ muốn hiển thị một số commit log, ví dụ hiển thị log của 2 commit cuối thì cho thêm -2 vào lệnh
git log -2
Nếu muốn hiển thị chi tiết các thay đổi của từng commit thì thêm vào tham số -p
git log -p -2
Nếu hiển thị thống kế gọn hơn về sự thay đổi thì dùng tham số --stat, hoặc dạng ngắn gọn hơn là --shortstat
git log --stat -5
Định dạng thông tin chung về commit (mã hash, dòng thông tin) trên một dòng thì dùng tham số --oneline
git log --oneline
git log --stat -10 --oneline
Lọc theo ngày bạn có thể dùng tham số --after="year-month-day" hoặc --before="year-month-day" hoặc dùng cả hai để chỉ ra khoảng ngày. Ví dụ: hiện thị các log từ ngày 1/1/2019 đến ngày 31/12/2019
git log --after="2019-1-1" --before="2019-12-31"
Lọc theo người commit dùng tham số --author="tác giả", có thể kết hợp nhiều người bằng ký hiệu \|
git log --oneline --author="XuanThuLab"
Lọc theo thông tin ghi chú về commit sử dụng thiết lập --grep="keyword ..."
git log --oneline --grep="init"
Lọc các commit liên quan đến file cụ thể, sử dụng thiết lập -- rồi liệt kê các file
git log --oneline -- src/OAuth.php
Lọc theo nội dung cập nhật sử dụng tham số -S"nội dung tìm"
git log --oneline --shortstat -S"sendmail"
Lọc các commit bình thường (tham số --no-merges) và các commit do gộp nhánh (tham số --merges)
git log --merges
Bạn có thể tùy chọn hiển thị dòng thông tin với tham số --pretty="format", trong đó chuỗi format là định dạng thông tin sẽ hiện thị ra cho từng commit, một số dữ liệu theo định dạng đó là:
%H mã hash đầy đủ của commit
%h mã hash ngắn gọn (7 ký tự đầu của hash đầy đủ)
%an tên người commit (định dạng theo --date, ví dụ --date="shortdate")
%s dòng thông tin commit
git log --pretty=format:"%h - %ad %s" --date="short"
Bạn có thể xem lịch sử commit một cách trực quan của một nhánh, nhất là nhánh này trong lịch sử của nó có nhiều lần gộp nhánh
git log --graph --pretty="%h %ad %s" --date="short"
Ví dụ
git init
echo "Abc" > 1.txt
git add .
git commit -m"A"
echo "XYZ" > 2.txt
git add .
git commit -m"B"
git branch test
rm -f 2.txt
git add .
git commit -m"C"
git checkout test
echo "Hello" > hello.txt
git add .
git commit -m"D in Test"
echo "World" > hello.txt
git add .
git commit -m"E in Test"
git checkout master
git merge test master -m"F - merge"
git log --graph --pretty="%h %ad %s" --date="short"
Lệnh git diff hiển thị thông tin thay đổi giữa thư mục làm việc và vùng index (staging) hoặc với commit cũ, thông tin thay đổi giữa index(staging) và commit, thông tin thay đổi giữa hai nhánh ...
Mặc định thi hành lệnh như sau:
git diff
Nó hiển thị thông tin tùy ngữ cảnh như sau:
Thông tin khác nhau giữa thư mục làm việc và commit cuối khi mà vùng index (staging) không có dữ liệu gì
Thông tin thay đổi giữa index và commit cuối nếu vùng index có dữ liệu
Khi có sự thay đổi của thư mục làm việc mà chưa chỉ mục, thì có thể xem sự thay đổi của nó với commit cuối
git diff
git diff --staged
git diff hash-commit1 hash-commit2
git diff branch1 branch2