Tái hiện trường hợp :

Giả sử có bạn đang code trên 1 nhánh mới tên test_git được checkout từ nhánh develop git checkout -b test_git

  • Thêm text “commit A”, thực hiện git add . , git commit -m "Commit A"
  • Thêm text “commit B”, thực hiện git add . , git commit -m "Commit B"
  • Thêm text “commit C”, thực hiện git add . , git commit -m "Commit C"

Lúc này commit sẽ theo sơ đồ ntn:

A - B - C (HEAD -> develop)

A - B - C tương ứng vs 3 commit ta vừa tạo ở trên ứng vs nhánh ta đang làm việc là test_git Sử dụng git log --oneline ta sẽ thấy tên các commit và mã SHA tương ứng vs commit

107f88c commit C
376419e commit B
b047857 commit A
2d40b74 Merge pull request #905 from ngoc-0914/bug/25074-Accounting => commit này ở develop

Hiện tại nội dung file sẽ là :

commit A
commit B
commit C
Xử lý

Có 3 cách để gộp 3 commit trên thành 1 commit

git reset –soft mã_SHA : (ở đây mã SHA = b047857) Đưa HEAD về commit A, tức loại bỏ commit B, C nhưng vẫn giữ nguyên code. Code của B,C đã dc chuyển vào vùng Staging Area (tức đã coi như git add) Khi bạn git log –oneline thì chỉ còn :

b047857 commit A

Vậy 3 commit sẽ gộp làm 1. Vì code B,C đã dc chuyển vào vùng Staging Area nên bạn phải git commit --amend --no-edit để commit nó vào commit A.

Nếu không làm như trên ta tiếp tục git commit -m “commit D” thì nhánh test_git sẽ có 2 commit, commit D sẽ chứa code của commit B,C cũ

git reset mã_SHA: Tương tự như git reset –soft có điều code B,C dc chuyển vào vùng Working directory (code B,C chưa git add .) khi git diff bạn sẽ nhìn thấy :

commit B
commit C

bạn sẽ phải

git add .
git commit --amend --no-edit

git reset –hard mã_SHA: Cái này hơi nguy hiểm nhé, nó sẽ loại bỏ code tại commit B, C và đưa HEAD về commit A. Nội dung

commit B
commit C

sẽ mất mà chỉ còn

commit A

Đôi điều về HEAD

HEAD : vị trí commit hiện tại

HEAD~1 Tức sẽ lùi lại 1 commit so với commit hiện tại trên cùng nhánh

HEAD~n : Lùi lại n commit so vs commit hiện tại trên cùng nhánh

HEAD~~ : sẽ giống với HEAD~2

Thay vì chỉ định mã SHA ta có thể thay thế nó bằng HEAD~n

git reset --soft b047857
git reset --soft HEAD~2
git reset --soft HEAD~~

3 câu lệnh này tương đương

Nghịch linh tinh xong muốn trở về code ban đầu ntn

Sau khi nghịch rối tung rối mù lên bạn muốn trở về code ban đầu, giữ nguyên 3 commit và code lúc đầu ta dùng ORIG_HEAD

git reset --hard ORIG_HEAD

Muốn quay lại 1 thời điểm bất kỳ thì làm thế nào

Giả sử mình đã làm rất nhiều thao tác, thêm code, rồi commit,reset các kiểu

Bạn có thể xem lịch sử bằng :

git reflog
107f88c HEAD@{0}: reset: moving to 107f88c
fc12c05 HEAD@{1}: commit (amend): commit C
107f88c HEAD@{2}: reset: moving to ORIG_HEAD
7f8a829 HEAD@{3}: commit (amend): commit A
b047857 HEAD@{4}: reset: moving to HEAD~~
107f88c HEAD@{5}: reset: moving to 107f88c
b047857 HEAD@{6}: reset: moving to b047857
107f88c HEAD@{7}: reset: moving to 107f88c
b047857 HEAD@{8}: reset: moving to b047857
107f88c HEAD@{9}: commit: commit C
376419e HEAD@{10}: commit: commit B
b047857 HEAD@{11}: commit: commit A

Muốn quay về vị trí bất kỳ bạn chỉ cần dùng các câu lệnh git reset trên sử dụng mã SHA ở đầu

VD muốn quay về thời điểm commit amend của commit C:

git reset --soft fc12c05

Nếu đã commit thì sẽ k baoh lo bị mất code

Nếu đã commit code git sẽ bắt đầu theo dõi nó và gán cho nó 1 mã SHA cho commit đó. Sử dụng git log và git reflog để access vào những commit đó nên anh em yên tâm nhé :D