GIT là một version control system, việc thành thạo và nắm rõ các chiến lược chia nhánh git hiệu quả sẽ giúp giải quyết rất nhiều vấn đề cho lập trình viên khi làm việc cùng các member khác, quản lý phiên bản, xử lý conflict,...
Trong bài viết này tôi sẽ không quá đi sâu vào việc giải thích GIT hay như những công dụng của nó, phần này sẽ được trình bày trong một bài viết khác. Bài viết này sẽ tập trung vào các câu lệnh git cơ bản đến nâng cao thường được sử dụng trong các dự án dựa trên kinh nghiệm thực tế của tôi.
GIT từ cơ bản đến nâng cao
Phân biệt GIT và GITHUB
Bởi vì trong quá trình làm việc cùng team, mình nhận ra rằng có rất nhiều bạn đặc biệt là những bạn mới sử dụng git, những bạn fresher thường hay nhầm lẫn giữa 2 khái niệm git và github, điều này sẽ làm các bạn rối khi mình sử dụng 2 khái niệm này liên tục trong toàn bộ bài viết. Chính vì vậy trước khi chúng ta thực sự bước vào việc sử dụng git, mình muốn các bạn thực sự hiểu rõ 2 khái niệm này.
- Git là tên gọi là một hệ thống quản lý phiên bản phân tán phổ biến nhất hiện nay (Distributed Version Control System – DVCS). DVCS nghĩa là hệ thống giúp mỗi máy tính có thể lưu trữ nhiều phiên bản khác nhau của một mã nguồn được nhân bản (clone) từ một kho chứa mã nguồn (repository), mỗi thay đổi vào mã nguồn trên máy tính sẽ có thể ủy thác (commit) rồi đưa lên máy chủ nơi đặt kho chứa chính. Và một máy tính khác (nếu họ có quyền truy cập) cũng có thể clone lại source code từ kho chứa hoặc clone lại một tập hợp các thay đổi mới nhất trên máy tính kia. Trong Git, thư mục làm việc trên máy tính gọi là Working Tree.
- Đa số những người mới thường nhầm lẫn giữa git và github là bởi cứ nói đến git ta lại nghĩ đến github và ngược lại. Nhưng thực sự điều đó là sai lầm, github chỉ là một trong nhiều nhà cung cấp dịch vụ máy chủ repositories công cộng. Ta cũng còn có rất nhiều nhà cung cấp dịch vụ máy chủ khác như: gitlab, bitbucket,... Nhưng vì github miễn phí, cộng đồng đông đảo và có hỗ trợ rất nhiều tính năng như github actions, github pages,.. (và chúng cũng miễn phí nốt) nên nó trở thành top 1 trong server lưu trữ repositories. Chính bởi nó quá phổ biến nên mới dẫn đến việc nhầm lẫn ở trên.
Phần 1 - Những lệnh git cơ bản
Git version:
$ git --vKiểm tra phiên bản của git
Git config:
$ git config --g user.name "Dev name"
$ git config --g user.email "Dev email"
$ git config --list
Cấu hình git name, git email ở toàn cục. Những thông tin này sẽ được trích dẫn mỗi khi bạn commit
Note: Nếu bạn chỉ muốn cấu hình cho source code ở folder hiện tại, bạn hãy bỏ cờ --g ra khỏi câu lệnh config.
Git init:
$ git initKhởi tạo git trong thư mục dự án. Nó thường được sử dụng khi bạn mốn tạo một phiên bản git mới
Git remote:
$ git remote add origin https... <url> # Liên kết đến remote repository (local & GitHub)
$ git remote set-url <name> <new url> # Thay đổi địa chỉ của remote repository đã Liên kết vào địa chỉ của <new url>.
$ git remote rename <old> <new> # Thay đổi tên của remote repository đã Liên kết.
Git status
$ git status
$ git status --short
Kiểm tra trạng thái của kho lưu trữ. Cờ --short để giản lược thông tin cần thiết
Git add
Add những thay đổi của bạn trước khi thực hiện commit để lưu vào kho lưu trữ
$ git add . # add toàn bộ thay đổi
$ git add index.html # add file chỉ định, trong trường hợp này là file index.htmlGit commit
git commit giúp lưu lại các thay đổi của bạn vào kho lưu trữ
$ git commit -m "noi_dung_message"
$ git commit --amend -m "noi_dung_message" # ghi đè name commit gần nhất
$ git commit -m "noi_dung_message" --no-verify # bỏ qua check pre-commit
Git push
$ git push -u origin branch_mane #Push (đẩy) branch vào remote repository.
$ git push #Push (đẩy) tất cả mọi thay đổi (đã commit) lên remote repository.
$ git push -d origin branch_mane #Xóa một branch trên remote repository.
$ git push -f origin branch_mane #Push force sẽ apply toàn bộ log ở local của bạn lên branch ở repo.
Câu lệnh git push -f origin branch_mane sẽ xóa vĩnh viễn branch cũ Push branch mới. Dễ gây conflict cho người khác cẩn trọng trước khi dùng
Git branch
$ git branch -M branch_mane (main) #Đổi tên nhánh chính.
$ git branch #Kiểm tra các nhánh hiện có của bạn ở local.
$ git branch -c branch_mane
Hoặc:
$ git checkout -b branch_mane #Tạo một nhánh có tên “branch_mane” và hợp nhất (merge) nó với nhánh chính.
$ git branch -d branch_mane #Xóa một nhánh tại local có tên: "branch_mane" (nó phải thoả mãn đã được merge vào nhánh chính)
$ git branch -D branch_mane #Xóa một nhánh tại local có tên: "branch_mane"
$ git branch -a #Kiểm tra các branch hiện có trên remote repo của bạn.Git diff
$ git diff #So sánh sự khác biệt kể từ lần commit cuối
$ git log # Xem lịch sử commit, có thể dùng cờ --oneline để nhìn gọn hơnGit fetch
$ git fetch originhoặc
$ git fetchLà một trong những câu lệnh phổ biến nhất. Nó giúp ta kéo code từ repo về tất cả các nhánh nhưng ko thực hiện hợp nhất (merge) - bao gồm cả nhánh hiện tại đang trỏ. origin ở đây ám chỉ remote hiện tại, ngoài ra nó có thể thao tác với nhiều remote khác nhau với câu lệnh git nâng cao tôi sẽ trình bày cho bạn ở phần tiếp theo
Git merge
$ git merge branch_nameMerge branch branch_name với branch hiện tại bạn đang đứng.
Git pull
Kéo tất cả code từ branch1 về local:
$ git pull origin branch1Kéo tất cả thay đổi từ repo về local branch. Nó tương đương với git fetch + git merge:
git pull originGit clone
Câu lệnh này sẽ clone toàn bộ source code + commit từ 1 git repo url
$git clone <url>Được rồi, với tất cả những lệnh git trên thì tôi nghĩ rằng bạn đã hoàn toàn có thể chinh chiến được với các nhiệm vụ cơ bản hàng ngày rồi đó. Nhưng hãy tiếp tục đén với phần tiếp theo nếu bạn muốn tay to hơn nhé ^^.
Phần 2 - Những câu lệnh git nâng cao
Git rebase
Chắc nhiều bạn sẽ thắc mắc tại sao mình lại đưa rebase vào phần git nâng cao chẳng phải rebase cũng đang ngày càng được dùng nhiều hay sao? Đúng vậy, nhưng bạn có thực sự đã nắm vững rebase chưa thì hãy cùng tiếp tục xem nhé:
Rebase từ nhánh branch A về nhánh hiện tại
Khác với merge là rebase sẽ tạo ra các commit mới trên cùng 1 tree thay vì rẽ nhánh như merge
$ git rebase ARebase về một commit_id commit:
$ git rebase -i <commit_id>
Đây là một tính năng rất hữu ích giúp bạn có thể hoán đổi vị trí các commit, sửa đổi, thay thế, xoá bỏ kể từ commit_id commit được chỉ định. Nếu bạn cần tìm hiểu sâu hơn, vui lòng xem thêm bài hướng dẫn chi tiết việc sử dụng git rebase kết hợp với git lens.
Rebase continue
$ git rebase --continueTiếp tục quá trình rebase sau khi giải quyết một xung đột
Git revert
Đảo ngược commit có commit_id được chọn
$ git revert <commit_id>Xoá toàn bộ commit trước đó đưa branch về trạng thái commit_id được chọn
$ git reset --hard <commit_id>Đưa branch về trạng thái của commit_id được chọn nhưng giữ nguyên các thay đổi của file ở trạng thái stage
$ git reset <commit_id>hoặc
$ git reset --soft <commit_id>Git reflog
Chậm lại 1 giây, chớ vội đọc lướt nhé. Hẳn bạn sẽ nghĩ git log thì có gì mà nâng cao, nhưng ở đây là git reflog nó chính là thiên thần cứu sinh cho mọi lỗi lầm, ngay cả với việc bạn phạm lỗi tày đình với lệnh git reset --hard
$ git reflog
d375542 (HEAD -> main) HEAD@{0}: commit (initial): first commit.Nó cho phép xem lại lịch sử hoạt động của HEAD và các tham chiếu trên đó, bao gồm các thao tác commit, merge, rebase, reset, stash, cherry-pick, v.v. Cụ thể nó lưu lịch sử các commit và thao tác trên các nhánh và HEAD trên local repository của bạn, bất kể có bị xoá hay không, giúp bạn tìm lại các commit hoặc nhánh bị mất hoặc bị thay đổi.
Lịch sử của nó gồm 3 thành phần chính:
- ID của thao tác d375542, nó tương tự commit_id đây chính là key giúp bạn khôi phục lại thao tác
- (HEAD -> main) Biểu thị rằng HEAD đang trỏ đến nhánh main
- HEAD@{0}: thành phần quan trọng nhất. Thông số này diễn tả rằng thay đổi nằm ở vị trí của HEAD trước đây. Các thay đổi với GIT HEAD đực thực hiện thêm trong quá khứ sẽ biểu thị dạng HEAD@{1}, HEAD@{2},...
Thao tác giữa multi remote trên cùng 1 local source code
Add 1 remote vào source code (giả sử rằng bạn đã có remote origin)
$ git remote add <remote_name> <url>Ví dụ:
$ git remote add secondary git@abc.gitTa kiểm tra bằng lệnh git remote -v sẽ được kết quả:
origin git@origin.git (fetch)
origin git@origin.git (push)
secondary git@abc.git (fetch)
secondary git@abc.git (push)Pull giữa 2 remote branch
Kéo code từ branch A của remote secondary về nhánh hiện tại
$ git pull secondary APush giữa 2 remote
Đẩy toàn bộ code của HEAD hiện tại lên branch A của remote secondary. Có thể thêm cờ -f để push force vì đa phần trường hợp này code vs commit của 2 remote sẽ khác nhau. (nên cẩn thận khi dùn push force)
$ git push secondary HEAD:AMerge giữa 2 remote branch
$ git merge secondary ATổng kết
Git là một công cụ không thể thiếu khi phát triển phần mềm. Việc thành thạo sử dụng git cũng quan trọng như việc viết code, một lập trình viên có kinh nghiệm sẽ biết cách phối hợp các câu lệnh git linh hoạt để phù hợp với dự án của mình.

Ảnh trên mô tả toàn bộ luồng thao tác cơ bản giúp bạn dễ hình dung và dễ nhớ hơn.
Reviewed by David
on
tháng 10 15, 2024
Rating:
Không có nhận xét nào: