Các lệnh và thao tác Git nâng cao
- 23-01-2026
- Toanngo92
- 0 Comments
Mục lục
Additional Git Commands – Rebase
Rebasing là một lệnh Git nâng cao cho phép lập trình viên tích hợp các thay đổi từ nhánh này sang nhánh khác.
Không giống như merge (tạo ra một commit mới để kết hợp lịch sử của hai nhánh), rebase sẽ viết lại lịch sử commit bằng cách đặt các commit của một nhánh lên trên một nhánh khác.
Quá trình này tạo ra một lịch sử tuyến tính, gọn gàng hơn, tránh cấu trúc phân nhánh phức tạp do merge tạo ra.
Visual Representation
Giả sử có hai nhánh: main và feature.
- Nhánh
maincó các commit: A, B, C - Nhánh
featurecó các commit: D, E


Key Points of Rebasing
Rebase mang lại nhiều lợi ích rõ ràng trong việc quản lý lịch sử dự án.
1. Clean Project History
Rebasing giúp duy trì lịch sử dự án tuyến tính, dễ theo dõi hơn theo thời gian.
Điều này đặc biệt hữu ích khi review quá trình phát triển dự án vì tránh được sự phức tạp do nhiều nhánh và merge commit gây ra.
2. Avoiding Merge Commits
Một lợi thế lớn của rebase là tránh tạo merge commit.
Merge commit có thể làm lịch sử trở nên lộn xộn và khó truy vết.
Rebase áp dụng trực tiếp các thay đổi lên nhánh gốc, loại bỏ nhu cầu tạo thêm commit trung gian.
3. Improving Bisectability
Rebase giúp việc sử dụng lệnh git bisect dễ dàng hơn để xác định commit gây lỗi.
Với lịch sử tuyến tính, mỗi commit là hậu duệ trực tiếp của commit trước đó, giúp quá trình bisect chính xác và đơn giản hơn.
4. Conflict Resolution
Trong quá trình rebase, xung đột có thể xảy ra nếu các thay đổi ở nhánh hiện tại và nhánh gốc chồng chéo nhau.
Việc giải quyết xung đột trong rebase đòi hỏi cẩn trọng để đảm bảo lịch sử cuối cùng phản ánh đúng ý định thay đổi.
Dù có thể khó hơn merge, nhưng kết quả thường sạch và rõ ràng hơn.
Use Cases for Rebasing
Rebasing giúp giữ cho code luôn đồng bộ và lịch sử commit gọn gàng.
Hai cách sử dụng rebase phổ biến trong workflow:
- Giữ feature branch luôn cập nhật với main
Trước khi merge feature branch vào main, có thể rebase feature branch lên main mới nhất để đảm bảo tương thích và tránh xung đột. - Interactive rebasing (
git rebase -i)
Cho phép chỉnh sửa, sắp xếp lại hoặc squash commit trong quá trình rebase.
Rất hữu ích để làm sạch lịch sử commit trước khi merge vào nhánh dùng chung.
Practical Examples of Rebasing
Sơ đồ dưới đây mô tả quy trình rebase cơ bản:

Syntax
git rebase [branch]
Example
Rebase nhánh feature lên main:
git checkout feature-branch
git rebase main
Lệnh này sẽ di chuyển toàn bộ commit của feature-branch lên đầu nhánh main.
Interactive Rebase
Interactive rebase cho phép chỉnh sửa, sắp xếp lại, squash hoặc xóa commit trong một nhánh, mang lại khả năng kiểm soát cao hơn đối với lịch sử dự án.
Sử dụng:
git rebase -i [base-branch]
Điều này cho phép:
- Làm sạch commit log
- Gộp nhiều commit thành một
- Điều chỉnh message cho rõ ràng và có ý nghĩa hơn
Rất hữu ích khi chuẩn bị merge một nhánh vào main.
Syntax
git checkout features
git rebase -i HEAD~n
(n là số commit cần đưa vào rebase)
Example
git rebase -i HEAD~1


Staging Area
Staging area (còn gọi là index) là vùng trung gian nơi các thay đổi được tập hợp trước khi commit vào repository.
Nó đóng vai trò là khu vực chuẩn bị để lập trình viên xem xét và tổ chức các thay đổi trước khi ghi nhận vĩnh viễn vào lịch sử dự án.
Vai trò của staging area:
- Chọn lọc thay đổi cụ thể để commit
- Nhóm các thay đổi liên quan vào cùng một commit
- Review lại thay đổi để đảm bảo chính xác và đầy đủ

Tóm lại:
Thay đổi được thực hiện trong working directory → đưa vào staging area → commit vào local repository.
Adding Changes to the Staging Area
Staging area cho phép thu thập các thay đổi trước khi commit, giúp người dùng kiểm soát chính xác những gì sẽ được đưa vào commit tiếp theo.
Adding a Single File
Syntax
git add <file>
Example
git add test2.txt
(Trước khi chạy lệnh, đảm bảo file tồn tại)

Adding Multiple Files
Syntax
git add <file1> <file2> <file3>
Example
git add test3.txt test4.txt

Adding All Changes
Syntax
git add .
Example
git add .
Lệnh này đưa toàn bộ thay đổi trong thư mục hiện tại và các thư mục con vào staging area.
Unstaging and Unmodifying Files
Trong Git, đôi khi cần:
- Gỡ file khỏi staging area
- Hoàn tác thay đổi của file
Việc hiểu rõ các thao tác này giúp duy trì working directory sạch và commit chính xác.
Unstaging a Specific File
Syntax
git reset HEAD <file>
Example
git reset HEAD test1.txt
Lệnh này gỡ test1.txt khỏi staging area nhưng giữ nguyên thay đổi trong working directory.
Unstaging All Files
Syntax
git reset HEAD .
Lệnh này gỡ toàn bộ file khỏi staging area, cho phép xem xét lại nội dung commit.
Unmodifying Files
Unmodifying giúp hoàn tác thay đổi trong working directory, đưa file về trạng thái commit gần nhất.
Method 1: Using git checkout
git checkout -- test2.txt
Method 2: Using git restore
git restore test3.txt
Cú pháp git restore trực quan hơn, được giới thiệu ở các phiên bản Git mới.
Unmodifying All Files
git restore .
Lệnh này hủy toàn bộ thay đổi của các file đã track.
Stashing
Stashing cho phép tạm thời lưu các thay đổi trong working directory mà chưa sẵn sàng commit.
Rất hữu ích khi:
- Cần chuyển nhánh nhanh
- Cần pull code mới
- Chưa muốn commit phần đang làm dở
Vai trò của stashing:
- Context Switching: Chuyển task nhanh
- Collaboration: Giữ working tree sạch khi làm việc nhóm
- Experimentation: Thử nghiệm mà không ảnh hưởng lịch sử
Creating a Stash
Syntax
git stash
Example
git stash
Lệnh này lưu trạng thái hiện tại của working directory và staging area, đưa working directory về trạng thái sạch của commit gần nhất.

Creating a Stash with a Message
Tạo stash kèm theo thông điệp
Việc tạo một stash kèm theo thông điệp cho phép lập trình viên lưu các thay đổi với một nhãn mô tả, giúp dễ dàng nhận diện và quản lý nhiều stash khác nhau sau này. Điều này đặc biệt hữu ích khi làm việc trên nhiều tác vụ cùng lúc, vì thông điệp cung cấp ngữ cảnh cho các thay đổi đã được stash.
Cú pháp:
git stash push -m "Your message here"
Ví dụ:
git stash push -m "Stashing with commit message"

Listing Stashes
Liệt kê các stash
Việc liệt kê stash trong Git sẽ hiển thị tất cả các stash đã được lưu trong repository, bao gồm thông điệp và định danh của chúng. Điều này hữu ích cho việc xem lại và quản lý các thay đổi đã được stash, cho phép lập trình viên nhanh chóng tìm, áp dụng hoặc xóa các stash cụ thể khi cần.
Cú pháp:
git stash list
Ví dụ:
git stash list

Lệnh này hiển thị danh sách tất cả các stash cùng với thông điệp và mã định danh tương ứng của chúng.
Applying a Stash
Áp dụng một stash
Việc áp dụng stash trong Git sẽ khôi phục các thay đổi đã lưu từ một stash cụ thể vào thư mục làm việc (working directory) mà không xóa stash đó. Điều này hữu ích để tiếp tục công việc từ các thay đổi đã stash trước đó, đồng thời vẫn giữ stash cho việc sử dụng hoặc tham chiếu sau này.
Cú pháp:
git stash apply
Ví dụ:
git stash apply

Lệnh này áp dụng stash mới nhất vào thư mục làm việc, nhưng không loại bỏ stash khỏi danh sách stash.
Applying a Specific Stash
Áp dụng một stash cụ thể
Việc áp dụng một stash cụ thể trong Git sẽ khôi phục các thay đổi từ một stash xác định vào thư mục làm việc, cho phép tiếp tục đúng vị trí công việc đã dừng lại. Điều này đặc biệt hữu ích khi tồn tại nhiều stash và chỉ cần áp dụng một tập thay đổi cụ thể mà không ảnh hưởng đến các stash khác.
Cú pháp:
git stash apply stash@{index}
Ví dụ:
git stash apply stash@{0}

Lệnh này thay thế {index} bằng mã định danh của stash cụ thể trong danh sách stash.
Popping a Stash
Pop stash (áp dụng và xóa stash)
Lệnh pop stash trong Git sẽ khôi phục các thay đổi đã lưu từ một stash vào thư mục làm việc đồng thời xóa stash đó khỏi danh sách stash. Điều này hữu ích khi muốn tiếp tục làm việc với các thay đổi đã stash và giữ danh sách stash gọn gàng, sạch sẽ.
Cú pháp:
git stash pop
Ví dụ:
git stash pop

Lệnh này áp dụng stash mới nhất vào thư mục làm việc và xóa stash đó khỏi danh sách.
Dropping a Stash
Xóa một stash
Việc xóa (drop) một stash trong Git sẽ xóa vĩnh viễn một stash cụ thể khỏi danh sách stash mà không áp dụng các thay đổi của stash đó. Điều này hữu ích khi dọn dẹp các stash đã lỗi thời hoặc không còn cần thiết, đảm bảo chỉ giữ lại các stash liên quan trong repository.
Cú pháp:
git stash drop stash@{index}
Ví dụ:
git stash drop stash@{0}

Lệnh này xóa một stash cụ thể khỏi danh sách stash.
Clearing All Stashes
Xóa toàn bộ stash
Việc xóa toàn bộ stash trong Git sẽ xóa vĩnh viễn tất cả các stash khỏi repository. Điều này hữu ích khi dọn dẹp danh sách stash sau khi tất cả các thay đổi đã được áp dụng hoặc không còn cần thiết, giúp duy trì môi trường dự án gọn gàng và không bị lộn xộn.
Cú pháp:
git stash clear
Ví dụ:
git stash clear

Lệnh này xóa toàn bộ stash khỏi danh sách stash.
Forking and Feature Branches
Forking và Feature Branch
Hãy cùng thảo luận về forking và feature branch.
Forking
Fork là gì?
Forking là một khái niệm nền tảng trong Git, đặc biệt khi làm việc với các dự án mã nguồn mở hoặc cộng tác giữa nhiều nhóm khác nhau. Fork về bản chất là một bản sao cá nhân của một repository, được lưu trữ trên một máy chủ từ xa như GitHub hoặc GitLab.
Khi bạn fork một repository, bạn tạo ra một phiên bản riêng của dự án đó dưới tài khoản của mình, cho phép bạn tự do thử nghiệm các thay đổi mà không ảnh hưởng đến repository gốc.
Key Benefits of Forking
Lợi ích chính của Forking
Forking giúp việc quản lý thay đổi và cộng tác trong dự án trở nên dễ dàng hơn.
Isolation of Changes – Cô lập thay đổi
Forking cho phép bạn tách công việc của mình khỏi dự án gốc. Điều này đặc biệt hữu ích khi bạn muốn đề xuất các thay đổi lớn hoặc thử nghiệm các tính năng mới mà không làm ảnh hưởng đến sự ổn định của dự án chính.
Collaborative Development – Phát triển cộng tác
Forking hỗ trợ cộng tác, vì mỗi người cộng tác có thể làm việc trên fork của riêng mình và sau đó đề xuất các thay đổi quay lại repository gốc thông qua pull request.
Ownership and Control – Quyền sở hữu và kiểm soát
Khi người dùng fork một repository, họ có toàn quyền kiểm soát fork đó, bao gồm việc đẩy (push) thay đổi, tạo branch và quản lý repository theo nhu cầu của riêng mình.
Feature Branches
Nhánh tính năng
Feature branch là một công cụ mạnh mẽ để quản lý công việc trên các tính năng hoặc sửa lỗi cụ thể trong một dự án Git. Feature branch là một nhánh riêng được tạo ra từ nhánh main (hoặc master), nơi lập trình viên có thể tập trung phát triển một tính năng hoặc tác vụ cụ thể.
Khi công việc trên feature branch hoàn tất, nhánh này có thể được merge trở lại nhánh main.
Key Benefits of Feature Branches
Lợi ích chính của Feature Branch
Feature branch giúp các nhóm làm việc có tổ chức và hiệu quả hơn khi xử lý các tác vụ cụ thể.
[ảnh minh họa]
Focused Development – Phát triển tập trung
Feature branch cho phép lập trình viên tập trung vào một tác vụ hoặc tính năng duy nhất, giữ cho công việc được tổ chức và tách biệt khỏi các hoạt động phát triển khác trong dự án.
Parallel Development – Phát triển song song
Nhiều feature branch có thể được tạo và làm việc đồng thời, cho phép các nhóm phát triển nhiều tính năng song song mà không gây xung đột.
Easy Integration – Dễ dàng tích hợp
Khi một tính năng hoàn thành và đã được kiểm thử, feature branch có thể dễ dàng merge trở lại nhánh main, đảm bảo chỉ những công việc ổn định và hoàn chỉnh mới được tích hợp vào dự án.
Better Collaboration – Cộng tác tốt hơn
Feature branch giúp việc cộng tác trở nên dễ dàng hơn vì mỗi lập trình viên có thể làm việc trên branch riêng mà không làm gián đoạn công việc của người khác. Điều này cũng đơn giản hóa quá trình review code vì các thay đổi được cô lập trong từng branch cụ thể.
Ví dụ thực hành với README.md
Giả sử chúng ta có một file tên là README.md trong repository và nhiệm vụ là thêm một section mới vào file này.
Steps to Make Changes in Your Branch
Các bước thực hiện thay đổi trong branch của bạn
1. Check out the Feature Branch
Chuyển sang feature branch.
Cú pháp:
git checkout -b featurebranch
Lưu ý: Thay featurebranch bằng tên branch thực tế của bạn.
2. Open the README.md File
Mở file README.md bằng bất kỳ trình soạn thảo văn bản nào (ví dụ: Notepad hoặc VS Code).
Cú pháp:
notepad README.md

3. Edit the File
Trong file README.md, thêm nội dung sau vào cuối file:
## New Feature: Enhanced Documentation
This section provides an overview of the new features added to the project.
It includes updates and enhancements to the existing documentation.

4. Save and Close the File
Lưu các thay đổi và đóng trình soạn thảo sau khi thêm nội dung.
5. Stage the Changes
Sau khi thực hiện thay đổi, đưa file đã chỉnh sửa vào staging area.
Cú pháp:
git add README.md
6. Commit the Changes
Commit các thay đổi với thông điệp commit phù hợp.
Cú pháp:
git commit -m "Added a new section for enhanced documentation in README.md"

7. Push the Changes to the Remote Repository
Đẩy các thay đổi lên feature branch trên GitHub.
Cú pháp:
git push origin featurebranch


