+3

🔀 TỔNG QUAN VỀ GIT FLOW VÀ CÁC LỆNH GIT PHỔ BIẾN ✨

A. CÁC LỆNH GIT PHỔ BIẾN

Dưới đây là một số lệnh Git thường được sử dụng trong các tác vụ quản lý phiên bản (version control) hàng ngày:

1. Lệnh Git Cơ Bản

  • git init: Khởi tạo một Git repo mới trong thư mục hiện tại.

    git init
    
  • git clone: Sao chép một Git repo có từ một máy chủ từ xa (remote).

    git clone https://github.com/user/repo.git
    
  • git status Hiển thị trạng thái hiện tại của thư mục đang làm việc (working directory) và khu vực staging (khu vực được chuẩn bị cho commit).

    git status
    
  • git add: Thêm các thay đổi (tệp hoặc thư mục) vào lần commit tiếp theo.

    git add file.txt
    git add .  # Thêm tất cả các thay đổi (Stage all changes)
    
  • git restore: là một lệnh được sử dụng để khôi phục hoặc loại bỏ các thay đổi trong working directory và staging area.

    Unstage một file

    git restore --staged <file>
    

    Lệnh trên sẽ loại bỏ <file> khỏi staging area mà không loại bỏ các thay đổi.

    Còn lệnh sau sẽ loại bỏ mọi thay đổi đã thực hiện trên <file> kể từ lần commit cuối cùng.

    git restore <file>
    

    Thường được sử dụng để:

    • Unstage các file đã được thêm vào staging area.
    • Loại bỏ thay đổi trong một file hoặc thư mục cụ thể mà chưa được commit.

    Sử dụng thay cho git checkout khi muốn chỉnh sửa hoặc hoàn tác các thay đổi trên file.

  • git commit: Ghi lại các thay đổi đã được staged vào repo với một message tương ứng.

    git commit -m "Commit message"
    
  • git push: Đẩy (Push) các commit từ local lên remote repo.

    git push origin branch-name
    
  • git pull: Cập nhật các thay đổi từ remote repo về nhánh local branch.

    git pull origin branch-name
    

2. Branching và Merging

  • git branch: Liệt kê, tạo mới, hoặc xóa branches.

    git branch        # Liệt kê tất cả các nhánh
    git branch new-branch  # Tạo một nhánh mới
    git branch -d old-branch  # Xóa một nhánh cũ
    
  • git checkout: Chuyển (switch) sang một nhánh hoặc commit khác.

    git checkout branch-name
    git checkout -b new-branch  # Tạo và chuyển sang nhánh mới
    
  • git merge: Hợp nhất (merge) một nhánh (branch) vào nhánh hiện tại.

    git checkout main
    git merge feature-branch
    

3. Remote Repositories

  • git remote: Quản lý các kết nối với remote repo

    git remote -v  # Liệt kê các kết nối từ xa
    git remote add origin https://github.com/user/repo.git  # Thêm một remote mới
    git remote set-url origin new.git.url/here # Thay đổi URL của remote repo
    
  • git fetch: Cập nhật các thay đổi đã diễn ra trên remote repo về local (chỉ fetch history còn muốn tải các remote update thì cần dùng lệnh pull trên branch tương ứng).

    git fetch origin
    

4. Xem Lịch Sử (các thay đổi) Commits

  • git log: Hiển thị lịch sử commit.

    git log        # Hiển thị lịch sử commit
    git log --oneline  # Hiển thị lịch sử rút gọn
    git log --graph --oneline --decorate  # Hiển thị lịch sử commit dưới dạng đồ thị
    
  • git diff: Hiển thị các thay đổi giữa các commits, branches, hay the working directory.

    git diff                 # Các thay đổi chưa được staged
    git diff --staged        # Các thay đổi đã được staged để commit
    git diff branch1 branch2  # So sánh hai branch
    

5. Hoàn Tác Các Thay Đổi

  • git revert: Hoàn tác một commit cụ thể bằng cách tạo một commit mới để đảo ngược nó.

    git revert commit-sha
    
  • git reset: (Cẩn trọng khi dùng vì có thể mất dữ liệu đã cập nhật trước đó) Resets lại khu vực staging hoặc di chuyển con trỏ nhánh (branch pointer).

    git reset file.txt        # Hủy staged một tệp
    git reset --hard HEAD^    # Trở về commit trước đó
    

    Có thể được sử dụng với các tùy chọn khác nhau (trong đó option --mixed là mặc định):

    • --soft: Di chuyển con trỏ HEAD nhưng giữ lại các thay đổi trong staging area.
    • --mixed (mặc định): Di chuyển con trỏ HEAD và bỏ staging các thay đổi, các thay đổi sẽ vẫn được giữ lại ở working directory.
    • --hard: Di chuyển con trỏ HEAD và loại bỏ tất cả các thay đổi trong working directory.
    • ^: Dấu hiệu này có nghĩa là lùi HEAD về 1 commit trước đó, ví dụ nếu là ^^^ thì sẽ lùi về 3 commit trước đó.

6. Lưu Trữ Các Thay Đổi (Stashing)

  • git stash: Tạm thời lưu các thay đổi chưa sẵn sàng để commit.

    git stash          # Lưu trữ các thay đổi hiện tại
    git stash pop      # Áp dụng lại các thay đổi đã lưu trữ và xóa chúng khỏi stash
    git stash list     # Liệt kê tất cả các thay đổi đã lưu trữ
    

7. Gắn Thẻ (Tagging)

  • git tag: Tạo các tag để đánh dấu các commit cụ thể, thường dùng cho các bản phát hành (releases).

    git tag v1.0         # Tạo một lightweight tag
    git tag -a v1.0 -m "Version 1.0"  # Tạo một annotated tag
    git push origin v1.0 # Đẩy tag lên remote repo
    

8. Cộng Tác (Collaboration)

  • git rebase: Áp dụng lại các commit trên một nhánh khác lên nhánh hiện tại , hữu ích để làm thẳng hàng, tuyến tính hóa (linearizing) lịch sử commit của nhánh hiện tại, đồng bộ hóa với các thay đổi từ nhánh khác.

    git checkout feature-branch
    git rebase main
    
  • git cherry-pick: Áp dụng một commit cụ thể từ một nhánh khác.

    git cherry-pick commit-sha
    

Trên đây là những lệnh phổ biến khi làm việc với Git trong các dự án cá nhân hay team.


B. XUNG ĐỘT (CONFLICTS)

Giải quyết xung đột Git Merge

  1. Nhận dạng conflict: Sau khi thực hiện một lệnh merge, Git có thể sẽ thông báo cho bạn về các xung đột (thường xảy ra khi repo, branches được team nhiều người cùng thao tác cập nhật sửa đổi).

    git status
    

    Lệnh này sẽ liệt kê các file có xung đột (Conflicts).

  2. Mở các files bị conflict: Tìm tìm đến các đoạn được đánh dấu xảy ra xung đột (<<<<<<<, =======, >>>>>>>) trong các file.

  • <<<<<<< chỉ ra sự bắt đầu của thay đổi của bạn.
  • ======= phân tách thay đổi của bạn và thay đổi từ nhánh khác.
  • >>>>>>> chỉ ra sự kết thúc của thay đổi từ nhánh khác.
  1. Xử lý xung đột (Resolve the conflict): Chỉnh sửa conflict file bằng cách kết hợp các thay đổi hoặc chọn một update phù hợp nào đó . Xóa các kí hiệu đánh dấu confict, và hoàn thành bản chỉnh sửa.

  2. Lưa lại các file conflicts sau khi đã hoàn tất chỉnh sửa:

    git add <file> 
    
  3. Tiếp tục hoàn thành merge trước đó:

    git commit 
    

    Nếu quá trình merge bị gián đoạn, bạn có thể cần dùng:

    git merge --continue
    
  4. Kiểm tra lại trạng thái code đã merge: Đảm bảo rằng merge đã thành công và không còn xung đột nào.

    git status
    
  5. Cập nhật các thay đổi lên remote repo (Push the changes) (nếu cần):

    git push origin branch-name
    

    Tới đây thì merge conflicts đã được giải quyết và các thay đổi đã được cập nhật.

Giải quyết xung đột GitHub Pull Request

  1. Navigate to the Pull Request: Truy cập vào repository trên GitHub, và tìm pull request (PR) có xung đột.

  2. Check Conflict Details: GitHub sẽ hiển thị một thông báo cho biết nhánh có xung đột. Nhấn vào nút Resolve conflicts để xem các file có xung đột.

  3. Resolve Conflicts in the GitHub Editor: Với mỗi file có xung đột, chỉnh sửa nội dung để giải quyết sự khác biệt trực tiếp trong trình chỉnh sửa web của GitHub. Xóa các dấu hiệu xung đột (<<<<<<<, =======, >>>>>>>) và đảm bảo code là chính xác.

  4. Mark as Resolved: Sau khi bạn đã giải quyết xung đột cho tất cả các file, nhấn Mark as resolved .

  5. Commit the Changes: Nhấn vào nút Commit merge để tạo một commit merge giải quyết các xung đột.

  6. Merge the Pull Request: Sau khi các xung đột được giải quyết và commit, bạn có thể tiếp tục Merge pull request vào nhánh đích.

    Tới bước này, các xung đột (conflicts) pull request đã được giải quyết và các thay đổi đã được hợp nhất.


C. TỔNG QUAN VỀ GIT FLOW

Git Flow là một chiến lược branching để quản lý phát triển tính năng, phát hành, và sửa lỗi theo cách có cấu trúc và mở rộng. Nó giúp các nhóm quản lý việc phát triển song song, cộng tác hiệu quả và xử lý phát hành và sửa lỗi một cách suôn sẻ. Dưới đây là tổng quan về Git Flow:

1. Nhánh Chính (Main Branches)

  • main (or master): Nhánh (branch) sẵn sàng cho production, chứa mã ổn định đã được deploy. Tất cả các bản phát hành (releases) được đánh tag tại đây.
  • develop: Nhánh phát triển chính nơi mã mới nhất cho bản phát hành tiếp theo được tích hợp. Các tính năng và sửa lỗi được hợp nhất vào develop.

2. Nhánh Hỗ Trợ (Supporting Branches)

Git Flow sử dụng các nhánh bổ sung cho phát triển tính năng, sửa lỗi và phát hành. Mỗi nhánh có vai trò cụ thể:

  • Feature Branches (feature/):

    • Dùng để phát triển các tính năng mới .
    • Được tạo từ develop và hợp nhất lại vào develop khi hoàn thành.
    • Ví dụ: feature/new-login
  • Release Branches (release/):

    • Dùng để chuẩn bị bản phát hành mới (new release).
    • Được tạo từ develop khi hoàn tất các tính năng, cho phép thử nghiệm cuối cùng, sửa lỗi và gắn phiên bản (tag version) trước khi hợp nhất vào main.
    • Ví dụ: release/v1.0
  • Hotfix Branches (hotfix/):

    • Dùng để sửa lỗi nghiêm trọng trên production.
    • Được tạo từ main và hợp nhất lại vào cả maindevelop để đảm bảo sửa lỗi áp dụng cho cả hai nhánh.
    • Ví dụ: hotfix/fix-payment-bug

3. Quy Trình Git Flow

  • Phát triển tính năng: hà phát triển tạo nhánh feature/ từ develop để làm việc trên tính năng mới. Sau khi hoàn thành, tính năng sẽ được hợp nhất lại vào develop.
  • Phát hành: Khi develop ổn định và sẵn sàng phát hành, một nhánh release/ được tạo để kiểm tra và điều chỉnh cuối cùng. Khi đã sẵn sàng, nó được hợp nhất vào main (for production) và develop (để cập nhật).
  • Sửa lỗi Hotfixes: Nếu phát hiện lỗi nghiêm trọng trên production, một nhánh hotfix/ được tạo từ main, sửa lỗi, và sau đó hợp nhất vào cả maindevelop để giữ cả hai nhánh được cập nhật.

4. Tag Phiên Bản (Version Tags)

Sau khi hợp nhất một release/ hoặc hotfix/ vào main, bạn gắn tag cho commit với số phiên bản tương ứng (ví dụ: v1.0) để đánh dấu bản phát hành (release).

Tóm Tắt Các Lệnh Git Flow Quan Trọng

  • Bắt đầu một tính năng mới:
    git checkout -b feature/xyz develop
    
  • Hoàn thành một tính năng:

    git checkout develop && git merge feature/xyz
    
  • Khởi tạo một bản phát hành release:

    git checkout -b release/v1.0 develop
    
  • Hoàn tất bản release:

    git checkout main && git merge release/v1.0
    
  • Khởi tạo một hotfix khi có lỗi:

    git checkout -b hotfix/fix-bug main
    
  • Hoàn tất hotfix:

    git checkout main && git merge hotfix/fix-bug
    

Git Flow rất lý tưởng cho các team cần một quy trình có cấu trúc bài bản để quản lý mã nguồn.


D. MỘT SỐ CÂU HỎI THƯỜNG GẶP FAQ

Git HEAD là gì?

  • HEAD là một con trỏ tham chiếu đến commit hoặc branch hiện tại mà bạn đang làm việc.

  • Thông thường, nó trỏ đến commit mới nhất trong branch hiện tại của bạn.

  • Khi bạn tạo một commit mới, HEAD sẽ di chuyển lên phía trước để trỏ đến commit mới đó.

  • Nếu bạn chuyển sang các branch khác bằng git checkout, HEAD sẽ di chuyển để trỏ đến đỉnh của branch mới.

  • Ở trạng thái "detached HEAD", HEAD trỏ trực tiếp đến một commit cụ thể thay vì một branch, điều này có nghĩa là bạn không nằm trên branch nào cả.

    git checkout branch-name  # HEAD trỏ đến commit mới nhất trên 'branch-name'
    git checkout <commit-sha>  # Detached HEAD trỏ trực tiếp đến một commit cụ thể
    
    

Khác biệt giữa git stashgit add?

  1. git stash:
  • Tạm thời lưu các thay đổi trong working directory mà chưa sẵn sàng để commit.
  • Cho phép bạn chuyển sang các branch khác hoặc làm việc trên thứ khác mà không mất công việc hiện tại.
  • Các thay đổi được di chuyển vào một stash stack và có thể được áp dụng lại sau đó với git stash pop hoặc git stash apply.
  • Không ảnh hưởng đến staging area (index).
    git stash          # Lưu trữ các thay đổi hiện tại
    git stash pop  
    
  1. git add:
  • Di chuyển các thay đổi từ working directory vào staging area (index), chuẩn bị cho việc commit.
  • Chỉ các thay đổi đã được staged mới được bao gồm trong git commit tiếp theo.
  • Không lưu các thay đổi tạm thời; nó chuẩn bị chúng cho một commit vào repository.

Summary:

  • Sử dụng git stash để tạm thời lưu các thay đổi chưa được commit.
  • Sử dụng git add để stage các thay đổi mà bạn dự định sẽ commit.

Khác biệt giữa git revert, git reset, và git checkout?

  1. git revert:
  • Tạo một commit mới để hoàn tác các thay đổi của một commit trước đó cụ thể.
  • Giữ nguyên lịch sử commit, làm cho nó hữu ích khi hoàn tác các thay đổi trong môi trường cộng tác.
  • Không thay đổi lịch sử commit—chỉ thêm một commit mới để đảo ngược commit được chỉ định.
  • An toàn để sử dụng khi các thay đổi đã được đẩy lên repository chia sẻ.
  1. git reset:
  • Di chuyển con trỏ branch ngược lại đến một commit cụ thể, có thể thay đổi working directory và staging area.
  • Có thể thay đổi lịch sử commit (đặc biệt với --hard), làm cho nó phù hợp với các thay đổi chỉ nằm trên local mà bạn chưa chia sẻ.
  • Các tùy chọn khác nhau như --soft, --mixed, và --hard kiểm soát mức độ thay đổi.
  • Có thể gây rủi ro khi sử dụng trên các branch công khai, vì nó thay đổi lịch sử commit.
  1. git checkout:
  • Chủ yếu được sử dụng để chuyển giữa các branch hoặc xem trạng thái của file tại một commit cụ thể.
  • Không thay đổi lịch sử commit; nó chỉ thay đổi working directory hoặc branch bạn đang làm việc.
  • Có thể được sử dụng để tạo và chuyển sang một branch mới hoặc để tạm thời xem các commit cũ.
  • Trong các phiên bản Git mới hơn, git switch được khuyến nghị để chuyển giữa các branch, trong khi git restore được sử dụng để khôi phục các file.

Summary:

  • Sử dụng git revert để hoàn tác thay đổi một cách an toàn với một commit mới.
  • Sử dụng git reset để quay lại lịch sử và có thể thay đổi working directory của bạn.
  • Sử dụng git checkout để chuyển đổi giữa các branch hoặc xem trạng thái của các commit cụ thể.

Nếu bạn thấy bài viết này hữu ích, hãy cho mình biết bằng cách để lại 👍 hoặc bình luận!, hoặc nếu bạn nghĩ bài viết này có thể giúp ích cho ai đó, hãy thoải mái chia sẻ! Cảm ơn bạn rất nhiều! 😃


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí