Memo Git Git Git - Uncreative

Mình xin phép chia sẻ một số kinh nghiệm khi làm việc với git trong dự án của mình. Tuy vậy mọi thứ chỉ là tương đối, có thể những chia sẻ này phù hợp hoặc không phù hợp với bạn. Mong các bạn đóng góp ý kiến.

Tạo nhánh

  • Chọn tên nhánh ngắn
  • Giải thích ngắn ngọn, rõ ràng về task đang làm
  • Bắt đầu bằng ID của task
  • Dùng gạch giữa để tạo khoảng cách giữa các chữ
# Good
git checkout -b portal-254-crud-user
# Bad
git checkout -b fix_user
  • Khi có nhiều người cùng làm việc trong một feature nào đó thì cần phải tạo một nhánh chung cho team. Và mỗi cá nhân sẽ tạo ra một nhánh riêng từ nhánh chung đó.
  • Những branch đã được merge rồi thì nên xóa bỏ trên remote đi. Giữ lại thì cũng không có ý nghĩa gì cả vì nếu bạn có sửa thì cũng không thỉ sửa trực tiếp trên nhánh đó được.
# Để xem những nhánh đã được merge
git branch --merged | grep -v "*"

Commits

  • Mỗi một thay đổi logic code thì bạn nên commit một lần, không chung một commit cho nhiều thay đổi logic code. Ví dụ: không được vừa fix bugs vừa tối ưu code trong cùng một commit.
  • Giải thích rõ ràng cho sự thay đổi đó.
  • Không được chia một thay đổi logic đơn giản ra nhiều commit khác nhau.

Messages

  • Thay vì viết meassage cho commit trực tiếp trên console, bạn nên sử dụng một công cụ editor để viết message cho commit.
# Good
git commit
# Bad
git commit -m "message"

Revision Selection

Mỗi commit trong git đều được định danh. Hiểu về cách mà git định danh một commit là rất quan trọng khi chúng ta muốn có bất kỳ hành động nào tới commit đó.

Git cho phép bạn định danh cụ thể một commit bằng nhiều cách như sử dụng mã Hashes, short SHA-1, HEAD~n, [email protected]{m}, HEAD^n... Về cách sử dụng các bạn nên tham khảo tại git-scm/book hoặc tại đây

Với các định danh hashes, short SHA-1, [email protected]{m} thì chúng ta có thể dễ dàng tìm thấy chúng bằng cách sử dụng git log, git log --oneline hoặc git reflog.

Riêng với hai cách định danh HEAD~HEAD^ mình xin giải thích ngắn gọn như sau:

  • HEAD~n sẽ định danh cho parrent commit thứ n. img4.png

  • HEAD~ chỉ định danh cho commit trên cùng một nhánh, nếu bạn muốn định danh cho commit thuộc nhánh khác thì bạn phải dùng tới HEAD^. Hãy đi vào minh họa sau để hiểu rõ hơn.

Sz.png

Git không vô cớ tạo ra nhiều cách định danh như vậy. Mỗi cách đều mang một mục đích nhất định. Điều mà chúng ta cần đó là hãy dùng nó khi đã hiểu về nó. Để hiểu được chúng thì bạn hãy thử đi =))

git reflog

Nhân tiện ở phần trên mình có nhắc tới git reflog. Mình xin phép giải thích qua về câu lệnh này. Đây là một công cụ giúp Git trở nên an toàn hơn vì nó sẽ ghi lại toàn bộ các hành động của bạn với git.

400e4b7 [email protected]{0}: checkout: moving from master to HEAD~2
0e25143 [email protected]{1}: commit (amend): Integrate some awesome feature into `master`
00f5425 [email protected]{2}: commit (merge): Merge branch ';feature';
ad8621a [email protected]{3}: commit: Finish the feature

Có rất nhiều bạn hỏi mình rằng bạn đấy đã lỡ tay xóa bỏ branch, hoặc bạn rebase và mất hết code hiện tại, các bạn không biết phải làm thế nào để lấy lại code đã mất đó. Có người thì rất "trâu bò" bằng cách code lại từ đầu. Nhưng nếu bạn đã hiểu về reflog thì mọi chuyện sẽ trở nên đơn giản hơn nhiều. Bạn có thể checkout, rebase, revert, reset... lại đúng bước mà bạn gặp vấn đề. Khi đó mọi thứ đã trở về trạng thái trước khi bạn gặp lỗi và bạn có thể sửa lỗi.

QUOTE

Bài viết khá lộn xộn do ý tưởng là thấy gì hay và mọi người hay mắc phải thì viết nên mong mọi người bỏ quá cho (ok)