Workflow cơ bản của Git

Tiếp nối bài trước, trong bài này mình sẽ đề cập đến 1 workflow làm việc cơ bản với git.

Bắt đầu

Để bắt đầu làm việc với Git, nếu bạn là người start project thì bạn cần tạo 1 repository mới với:

$ cd your-project/
$ git init

Trong trường hợp đã có repository, thì bạn cần clode repository đó về máy:

$ git clone git@github.com:haposoft/your-project.git
$ cd your-project

Nhánh hiện tại bây giờ đang là master (hoặc main tùy thuộc setting), trong trường bạn cần làm 1 feature mới hay fix bug, hãy tạo 1 nhánh mới để làm các công việc đó thay vì thao tác trên nhánh master.
Có 1 vài lý do như sau:

  • Trong quá trình bạn đang làm việc, nếu có bug, bạn có thể commit code ở nhánh bạn mới tạo, quay trở lại master để fix bug
  • Code của bạn chưa xong nhưng ở nhánh master có code của thành viên mới cần merger để bạn có thể code tiếp.
  • Code của bạn cần được review trước khi các thành viêc khác của team có thể pull code mới của bạn về.
  • Sau khi push code, bạn muốn thay đổi code của bạn mà không làm ảnh hưởng đến các member khác.
  • Xem lại lịch sử code theo nhánh 1 cách dễ dàng hơn. Đó là 1 vài lý do mà tại sao bạn phải tạo 1 nhánh mới khi bạn muốn thay đổi hay thêm mới trong code.


    Chúng ta sẽ tạo 1 nhánh mới và đồng thời chuyển sang nhánh đó để thực hiện code bằng câu lệnh:

    $ git checkout -b new-branch
    

    Sau khi thực hiện code xong, kiểm tra lại status của nhánh hiện tại để xem xem có những file nào thay đổi, file nào được thêm mới để thực hiện addcommit

    $ git status
    

    Add các file bạn tạo mới trước khi commit

    $ git add file-name  
    // thêm các file trong 1 thư mục
    $ git add folder-name/
    // thêm tất cả các file mới (cẩn thận với cách add này dễ gây thừa file)
    $ git add .
    

    Thực hiện commit :

    $ git commit -m "message for change"
    
    Lưu ý trong nội dung message của commit bạn nên ghi tóm tắt những công việc hoặc thay đổi mà bạn đã làm trong commit đó.
    Trước khi thực hiện push code lên, bạn cần pull code ở nhánh master để kiểm tra xem có các thay đổi mới nào không.
    Như mình đã chia sẻ trong các bài trước:

    Khi thực hiện git pull áp dụng (merge) các thay đổi này vào thư mục và tập tin ở working directory. Git pull sẽ có thể gây ra xung đột (conflict) trong khi merge.

    Nếu các thay đổi ở master trong cùng 1 file với các file bạn đang sửa thì có thể bị conflict.
     $ git pull origin master
    Hoặc dùng --rebase để có lịch sử commit gọn gàng hơn
     $ git pull --rebase origin master

    Nếu gặp conflict, bạn cần fix hết tất cả các confict. Sau đó thực hiện commit lại 1 lần nữa.

    $ git commit -m `fix conflict`
    
    $ git push origin new-branch
    

Mở rộng về conflict

Mình sẽ giới thiệu thêm 1 chút về conflict trong Git là gì?
Conflict có nghĩa là xung đột, conflict có thể xuất hiện khi thực hiện hợp nhất đoạn code vào branch mà có thay đổi code tại cùng 1 điểm trong cùng 1 file. Để hiểu đơn giản nhất thì ta cùng xem ví dụ sau:

Khi mình thực hiện câu lệnh git pull origin master trên branch add_new_file là lúc mình thực hiện hợp nhất trên branch master với branch add_new_file mà trên add_new_file file index.html đã thay đổi tại các line từ 2 -> 12 hoặc từ 14 -> 24(như hình dưới).

và khi hợp nhất code, git sẽ so sánh, thấy tại file index.html, git sẽ không biết sẽ lấy đoạn code nào như ví dụ sẽ là từ 2 -> 12 hay từ 14 -> 24. Lúc này việc của chúng ta là giải quyết conflict.

Cấu trúc của conflict

<<<<<<< HEAD
// Code current change here
=======
// Code Incoming change here
>>>>>>> Commit

Với Code current change here là code tồn tại trong nhánh master hiện tại mà tham chiếu HEAD đang trỏ tới.

Code Incoming change here là code có trong nhánh add_new_file chuẩn bị hợp nhất vào master.

Giải quyết conflict

Để giải quyết conflict, bạn cần xóa hết <<<<<<< HEAD, =======, >>>>>>> Commit và chọn dòng code mong muốn. Sau đó thực hiện commit và push lên bình thường.

Thực hành

Để hiểu rõ flow làm việc ở trên, các bạn có thể thực hành một số bài tập dưới đây.

Bài tập 1: Làm theo flow làm việc git cơ bản và push lên repo tutorial tại đây

Bài tập 2: Xử lý conflict, thực hiện xử lý conflict theo các bước sau:

  • pull code trên master
  • checkout sang branch add_new_file
  • thực hiện pull origin master
  • thực hiện xử lý conflict
  • push lên master

Trên đây, mình vừa giới thiệu về 1 flow làm việc cơ bản của git. Trong bài tiếp theo mình sẽ giới thiệu các kiến thức về github.
(Link bài tiếp theo của series tại đây)

Ngoài ra, các bạn có thể xem lại bài trước của series này, Giới thiệu các khái niệm cơ bản của git để củng cố thêm kiến thức về git nhé.
(Link bài trước của series tại đây)