Một số tips hữu ích khi làm việc với Git

Theo quy trình làm việc thông thường, thì mỗi khi nhận một task mới, chúng ta sẽ tạo một branch và code trên branch đó. Sau khi làm xong task sẽ commit code lên và tạo pull request để merge vào nhánh chính.

Tuy nhiên, trong quá trình làm việc với git thì không phải lúc nào cũng suôn sẻ, thỉnh thoảng sẽ có những tình huống khiến chúng ta lúng túng không biết xử lý như thế nào. Dưới đây là tình huống mà chúng ta có thể sẽ gặp phải và cách giải quyết

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

  • Git giữ một con trỏ đặc biệt có tên HEAD. Trong Git, đây là một con trỏ tới nhánh nội bộ mà bạn đang làm việc
  • Trên Git, những thư mục được đặt trong sự quản lý của Git mà mọi người đang thực hiện công việc trong thực tế được gọi là working tree.
  • Giữa repository và working tree tồn tại một nơi gọi là index. Index là nơi để chuẩn bị cho việc commit lên repository

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

Mỗi một commit nên là một chức năng chạy được. Tuy nhiên, nhiều người có thói quen commit bừa bãi, làm đến đâu commit đến đấy dẫn đến việc tạo ra rất nhiều commit sau code xong. Việc tạo ra nhiêu commit sẽ gây hưởng đến việc revert code sau này. Vì vậy muộn gộp nhiều commit lại, ta làm như sau:

$ git rebase -i HEAD~<số lượng commit>

# Ví dụ: git rebase -i HEAD~3

# (trước khi sửa) các commit cũ từ trên xuống dưới

pick aad34fdc commit message 1

pick sdad3c4d commit message 2

pick 4sd4fdsdf commit message 3

・・・

# (sau khi sửa) các commit trước là sdad3c4d và sdad3c4d sẽ bị xóa bỏ, chỉ giữ lại commit gần nhất là commit aad34fdc

pick aad34fdc commit message 1

f sdad3c4d commit message 2

f sdad3c4d commit message 3

・・・

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

# Đầu tiên là đưa HEAD và index về 1 commit trước đó.

Nói cách khác là ta coi như là chưa từng có commit to đùng kia và 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 đã có 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

3. Commit nhầm sang một branch khác

Có những lúc ta sơ suất lỡ tay commit thẳng vào master trong khi thực ra là muốn commit vào một branch khác

# Đầu tiên là tạo một branch khác chứa trạng thái mà ta đã commit

$ git branch <other branch>

# Đưa HEAD (vùng sau commit), index của master về 1 commit trước đó

$ git reset –hard HEAD~

#Hoặc đưa index của branch về commit cụ thể dựa vào ID commit (có thể xem log để biết được ID)

$ git reset –hard <ID commit>

Lúc này ở nhánh master không còn commit mà bị nhầm branch nữa

# Check out sang branch có commit trước đó

$ git checkout <other branch>

4. Ignore một số file commit thừa

# Đầu tiên là xoá các file đã commit khỏi repository

$ git rm –cached <tên file>

# Sau đó là thêm vào gitignore

$ echo <đường dẫn tên file> >> .gitignore

# Ví dụ:

$ git rm –cached config/database.yml

$ echo config/database.yml >> .gitignore

5. Lỡ tay commit và muốn xóa commit

# 1. Chỉ đưa HEAD về như cũ

$ git reset –soft HEAD~

# 2. Đưa HEAD và index về như cũ

$ git reset HEAD~

# 3. Đưa cả index, working tree về 1 commit trước đó

$ git reset –hard HEAD~

# 4. Xóa luôn commit, về lại trước đó

$ git revert <commit>

6. Đang làm dở dang và chuyển branch khác

# Tạm thời lưu lại các phần công việc còn đang làm dở

$ git stash Hoặc $ git stash -u

# Chuyển sang một branch khác và làm việc

$ git checkout -b <other branch>

~làm gì đó mà các bạn muốn ở nhánh này~

$ git add <các file cần thiết>

$ git commit -m <Nội dung commit>

# Trở về branch cũ

$ git checkout <branch name>

# Lấy lại các nội dung công việc đang làm dở trước đó

$ git stash pop

#Trường hợp stash nhiều lần thì kiểm tra log stash rồi lấy ra stash mong muốn theo id:

$ git stash list

$ git stash pop <stash ID>

7. Lỡ xóa mất branch

# Đầu tiên là 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

$ git branch <tên branch> <commit ID>

# ví dụ: 

Khi lỡ tay xóa nhánh develop:  git branch -D develop

$ gõ lệnh “git reflog” để xem lại lịch sử commit

9b48127 HEAD@{0}: checkout: moving from develop to master

788674f HEAD@{1}: reset: moving to 788674f

Trạng thái muốn quay lại là 788674f, vì thế

 

$ git branch develop 788674f

$ git checkout develop

Và chúng ta sẽ quay lại branch vừa bị xóa lúc nãy.

8. Lỡ xóa mất commit quan trọng

# Đầu tiên là xem lại toàn bộ lịch sử commit

$ git reflog

# Từ đó chọn commit muốn phục hồi và khôi phục lại

$ git reset –hard <commit>

9. Đã merge nhưng muốn trở lại như trước

# khi pull code chỉ được pull từ nhánh chính và nhánh của mình. Tuy nhiên, khi 2 người làm cùng 1 chức năng ở 2 nhánh khác nhau mà muộn gộp code lại thì ta có thể dùng “git merge” để tiến hành merge code.

$ git checkout <tên branch nguồn>

$ git merge <tên branch muốn merge>

# Sau khi merge, nhưng lại muốn trở lại như trước thì làm như sau

$ git reset –hard ORIG_HEAD

 

Leave a Reply

Your email address will not be published. Required fields are marked *