Cách xử lý các lỗi thường gặp trong Git

August 2, 2019 (5y ago)

Đầu tiên muốn sửa được lỗi trong git ta phải thực hiện tạo ra nó trước đã. Vậy phần 1 mình sẽ nói 1 số lệnh cơ bản trong git theo follow tạo và sử dụng 1 project.

Các lệnh cơ bản

1. Khởi tạo git

git init

2. Thêm mới remote vào project

# hiển thị danh sách remote trong git của project
git remote -v

# Thêm mới một remote vào git
git remote add origin <url>

3. Clone project

git clone

4. Làm việc cùng branch

# Danh sách branch
git branch

# tạo mới branch
git branch (<name>)

# Di chuyển từ branch hiện tại đến một branch khác bằng tên branch đó
git checkout <name>

# Tạo và di chuyển từ branch hiện tại đến một branch mới
git checkout -b <name>

5. Hợp nhất branch

# để hợp nhất nhánh branch-name vào nhánh master
git merge <branch-name>

6. Cập nhật code mới nhất về

Khi làm việc một mình thực tế bạn sẽ không cần đến git nhưng khi làm việc nhóm và muốn lấy code mới nhất từ một nhánh nào đó trên repo online về thì bạn sẽ dùng lệnh sau:

git pull origin <branch>

7. xem status và một vài thứ nữa

git status

git diff -stat

Những sự cố thường gặp trong Git

1. Viết sai message commit

git commit --amend

2. Đặt sai tên branch

git branch -m <tên branch sau khi đổi>

3. Commit chơi chơi và giờ muốn nó bay màu

Note: HEAD, Working tree, Index trong git là gì?

Cách 1: Sử dụng reset (khi chưa có ai pull về)

git reset {commit_id}

Cách 2: Sử dụng revert (người khác đã pull về)

# commit_hash   commit
git revert <commit_hash>

Cách 3: Sử dụng --amend

git commit --amend
# Bạn  thể sử dụng lệnh này để viết lại commit message
# Option --no-edit sử dụng khi bạn chỉ muốn thêm file  không muốn sửa commit message
git commit --amend --no-edit

4. Khi lỡ tay commit nhầm sang một branch khác

#Đầu tiên  tạo một branch khác chứa trạng thái  ta đã commit
$ git branch other-branch
#Đưa HEAD, index của master về 1 commit trước đó
$ git reset --hard HEAD~
#Check out sang branch  commit trước đó
$ git checkout other-branch

5. Gộp nhiều commit thành một commit

Sử dụng rebase + squash (or fixup) để tổng hợp lại các commit cũ

Rebase về n commit trước ( bao gồm cả HEAD)
#  dụ) git rebase -i HEAD~3
$ git rebase -i HEAD~<số lượng commit>
# Sau lệnh này sẽ mở ra editor nên hãy sửa lại như sau rồi lưu lại
# Note: Với vim bấm “a” để bắt đầu edit → Bấm ECS để dừng thao tác edit → Bấm “shift + z + z” để save
# (trước khi sửa) các commit cũ từ trên xuống dưới
pick aa11bbc commit message 1
pick b2c3c4d commit message 2
pick 4e56fgh commit message 3
・・・
# (sau khi sửa) các commit trước là squash sẽ được tổng hợp vào 1 commit ở đằng trước
pick aa11bbc commit message 1
squash b2c3c4d commit message 2
squash 4e56fgh commit message 3

6. Chia commit to thành nhiều commit nhỏ

# Đầu tiên  đưa HEAD  index về 1 commit trước đó.
# Nói cách khác  ta coi như  chưa từng  commit to đùng kia  chỉ giữ lại trạng thái của working tree
$ git reset HEAD~
# Dùng lệnh sau đây để thêm các phần nhỏ vào index
$ git add -p
# Khi các phần cần thay đổi đã  thì ta commit
$ git commit -m "commit message"
# Sau đó ta lặp đi lặp lại các bước như trên cho phần còn lại

7. Chuyển xang nhánh khác khi đang làm việc giở

# Tạm thời lưu lại các phần công việc còn đang làm dở
$ git stash -u
# Chuyển sang một branch khác  làm việc
$ git checkout -b other-branch
$ git add <các file cần thiết>
$ git commit -m "commit message"
# Trở về branch cũ
$ git checkout origin-branch
# Lấy lại các nội dung công việc đang làm dở trước đó
$ git stash pop

8. Hồi phục commit quan trọng khi lỡ tay xóa nó đi

# Đầu tiên  xem lại toàn bộ lịch sử commit
$ git reflog
# Từ đó chọn commit muốn phục hồi  khôi phục lại
#  dụ: git reset --hard HEAD@{2}
$ git reset --hard <commit>

9. Khôi phục branch đã xóa

# Đầu tiên  xem lại toàn bộ lịch sử commit
$ git reflog
# Từ các commit này, chọn rồi tạo branch mới
#  dụ: git branch new-branch HEAD@{2}
$ git branch <tên branch> <commit_id>

10. Khôi phục về trạng thái trước khi merge

git reset --hard ORIG_HEAD
# Commit trước khi reset được tham chiếu bằng ORIG_HEAD

11. Khôi phục về trạng thái trước khi pull từ remote

# Lấy từ code mới remote
$ git pull origin master
# Phát sinh conflict
# Suy nghĩ lại thì trong pull(fetch + merge) muốn bỏ phần merge đi:
$ git reset --hard ORIG_HEAD

12. Khi bạn muốn rename 1 nhánh cả ở local và trên remote (github)

git branch -m new-name
git push remote-name :old-name new-name

13. Khi bạn muốn xoá 1 branch trên remote từ xa

git push origin --delete remote-branch-name

Đó là các thao tác cơ bản và cách sửa một số lỗi thường gặp khi làm việc với git của mình. Rất mong các bạn góp ý để mình cải thiện bài viết này và các bài sau hơn nữa.