Lệnh cơ bản của Git, đơn giản, hiệu quả – điểm cộng cho các lập trình viên Việt Nam
Contents
- 1. Git là gì?
- 2. Cách hoạt động của Git đơn giản như thế nào?
- 3. Sử dụng các lệnh của Git cơ bản đơn giản, hiệu quả
- 4. Tips, Trick với git
- Kết luận
1. Git là gì?
Git là một hệ thống quản lý phiên bản phân tán (Distributed Version Control System – DVCS). Trên Git, ta có thể lưu trạng thái của file dưới dạng lịch sử cập nhật. Vì thế, có thể đưa file đã chỉnh sửa về trạng thái cũ hay có thể biết được file đã được chỉnh sửa chỗ nào bằng những lệnh git rất đơn giản.
Git là môi trường tuyệt vời cho các teamwork, khi sử dụng chung cùng một mã nguồn. Do đó biết được Git là một điểm cộng cho bạn trước người phỏng vấn do ở các công ty chúng ta thường làm việc teamwork cùng nhau.
2. Cách hoạt động của Git đơn giản như thế nào?
Như bạn thấy trên hình, mã nguồn sẽ được lưu online trên máy chủ, khi bạn muốn sử dụng thì bạn phải clone(nhân bản) về máy tính local của các bạn, khi bạn có chỉnh sửa và muốn cập nhật lên máy chủ, bạn phải commit để ghi lại thời điểm thay đổi, commit có tác dụng để sau này khi bạn có lỗi phát sinh muốn quay lại thời điểm trước thì đây là tác dụng của commit, sau khi commit thì bạn push lên máy chủ và những máy có clone project này về thì phải sử dụng pull để cập nhật lại dữ liệu thay đổi. Pull được sử dụng khi nào máy local đã có project đó mà muốn cập nhật lại dữ liệu không cần phải clone lại thêm một bản nữa.
3. Sử dụng các lệnh của Git cơ bản đơn giản, hiệu quả
1. Cài đặt Git như thế nào?
Bạn cài git vào máy tính tại đây nhé.
Ở đây mình chọn sử dụng github các bạn có thể sử dụng các nhà cung cấp khác như gitlab nha.
Để sử dụng yêu cầu bạn phải có tài khoản bạn đăng ký tại đây và login vào nhé.
2. Tạo một Repository trong Github như thế nào?
Ở góc phải trên của màn hình bạn click vào dấu + và click new repository.
Tiếp theo điền các thông tin cần thiết.
Bạn điền tên của repository, mô tả có thể có hoặc không, trạng thái cho mọi người xem hay chỉ bạn, có tạo file readme hay không, thông thường thì mình check để tạo file readme un. Và cuối cùng click create repository.
3. Sử dụng các lệnh cơ bản của Git
3.1 Lấy
3.1.1 Git Clone – lệnh cơ bản đầu tiên
Bạn lấy link repository cần clone.
Tại thư mục muốn lưu bạn làm như sau:
git clone url
3.1.2 git fetch origin
Lấy dữ liệu server về nhưng không merge vào code, chỉ để check có thay đổi không.
git fetch --all git fetch origin <tenBranch>
3.1.3 git submodule
Add repository khác làm library cho dự án, library xài chung nhiều dự án quản lý khó khăn thì xài cách này tiện hơn.
git submodule add <repository> [<path>] // Example git submodule add https://github.com/username/demo.git app/module git submodule update // pull code submodule
3.1.4 Sử dụng file
3.4.1 git format-patch
Tạo file để chuyển code sang người khác mà không sử dụng commit.
Đối với git chúng ta hay sử dụng việc đóng gói những thay đổi vào các commit và share cho các thành viên khác trong team. Tuy nhiên đôi khi chúng ta vì lý do nào đó mà không thể push lên repo chung. Khi đó việc dùng patch file là cực kì quan trọng và thuận lợi, chúng ta có thể trao đổi thông qua việc gửi email, share file. Thậm chí có thể quan sát các thay đổi trong từng file.
git format-patch HEAD~n // n là số lượng commit cần tạo file patch // tương ứng với số lượng file patch
Xem thêm: https://viblo.asia/p/su-dung-git-tao-patch-file-PdbGnLxOkyA
3.4.2 git apply
Tạo file patch xong thì sử dụng git apply để add code từ file đó vào.
git apply --stat file.patch // Kiểm tra xem patch sẽ thực hiện những thay đổi gì git apply --check file.patch // Kiểm tra xem file có apply được vô source code hay không git am --signoff < file.patch // Thực hiện apply // Chú ý bạn có thể bỏ tham số –signoff. // Hoặc nếu muốn apply nhiều file dùng *.patch thay cho tên file.
Xem thêm: https://viblo.asia/p/su-dung-git-tao-patch-file-PdbGnLxOkyA
3.4.3 git bundle
Thay vì sử dụng github, gitlab,… truyền online.
Thì cái này truyền offline qua file.
git bundle create <tenFile> <commit> <branchName> git clone <tenFile> <tenThuMuc> // clone repository từ file git bundle verify <tenFile> // apply code từ file vào git fetch <tenFile> <branchHienTai>:<tenBranchMoi> // apply vào và tạo branch mới // branch cũ giữ nguyên
3.2 Cấu hình
3.2.1 git config
Cấu hình git folder.
git config --global user.name <name> // config commit name git config --global user.email <email> // config email git config --global alias.<alias name> // add git command //Example: git config --global alias.unstage 'reset HEAD --' // when usage $ git unstage fileA // sẽ ngắn gọn hơn thay vì $ git reset HEAD -- fileA
3.2.2 git ignore
Sử dụng file .gitignore
Dùng để bỏ qua file hoặc folder khi commit code.
Các ký hiệu tham khảo trang chủ pattern format.
3.3 Check
3.3.1 Git Status – một lệnh đơn giản để kiểm tra trạng thái
Bạn thấy mình vừa tạo file mới và dùng git status để kiểm tra xem có file nào đã tạo hay chỉnh sửa không, đó là công dụng của lệnh git status.
3.3.2 git log
Xem lịch sử commit
git log git log --oneline git log --graph // xem dạng thanh biểu đồ bên trái git log -<limit> git log -p // show detail each commit git log --stat // show more file add or alter git log --author="<pattern>" // search commit by author git log --grep="<pattern>" // search commit by message git log <since>...<until> // search between commitId, branch name, HEAD, any other git log --file // show commit have file special git log --after="2014-7-1" --before="2014-7-4"
git shortlog
Nhóm commit theo cái gì đó, mặc định theo tác giả
git shortlog git shortlog -n // sắp xếp số lượng commit lớn hiển thị trước git shortlog -n -s // dạng dễ nhìn commit_number author git shortlog -n -s -e // thêm email commit_number author email
3.3.3 git reflog
Xem lịch sử thao tác, có thể git rết bất kỳ cái nào ở đây.
3.3.4 git remote
Xem và cấu hình remote cho git folder.
git remote -v // xem các origin remote git remote set-url origin <git remote url> // set lại url remote
3.3.5 git diff
So sánh sự khác nhau của code.
git diff git diff HEAD // xem sự thay đổi ở commit nào đó git diff --cached
3.3.6 gitk
Mở một trình trực quan git như source tree.
3.3.7 git revision
Là những tham số sử dụng cho filter git như git log, …
git log HEAD~5...HEAD~3 // => chỉ hiện thị HEAD ~4 chẳng hạn git log <rev1>..<rev2>
3.3.8 git fsck
Check file git system.
Mình không đi sâu vào lệnh này.
3.3.9 git ls-files
Liệt kê file và folder của dự án.
3.3.10 git ls-tree
Liệt kê danh sách file và folder của dự án nhưng nhiều thông tin hơn.
git ls-tree HEAD git ls-tree <branchName> // trên branch cụ thể git ls-tree <hash>
3.4 Commit
3.4.1 Git add – lệnh hiệu quả để thêm file vào commit
// thêm tất cả file đã chỉnh sửa và file mới vào commit tiếp theo git add . // hoặc git add * //chỉ thêm 1 file nào đó git add giaoDien.php
3.4.2 Git commit
//Sau khi đã add file thì tiến hành commit git commit -m"mô tả cho commit"
Nếu ở bước này bị lỗi tức là có file ở local khác với server bạn sử dụng git pull rồi làm lại git add . và git commit nhé.
git commit –amend
Gộp tiếp vào commit trước.
3.4.3 Git push
// Khi đã commit xong bạn dùng git push để chuyển file lên server git push //nếu yêu cầu đăng nhập thì bạn đăng nhập vào nhé.
3.4.4 Git pull
// git pull để kéo file từ server về mà không cần phải clone lại git pull
3.4.5 git notes
add note to commit.
git notes add -m "<message>" <commit>
3.4.6 git rm
Dùng xóa file mà không tạo thêm tracking delete for file.
Chỉ dùng cho file đã git add .
git rm <file> git rm -f <file>
3.4.7 git mv
Dùng đổi tên file mà không tạo thêm tracking for file.
Với lệnh này tracking sẽ là rename file … thay vì
delete file …
add file …
=> Do đó rename sử dụng lệnh này sẽ rõ ràng hơn.
Chỉ dùng cho file đã git add .
git mv <file> <fileNameNew> // có thể bao gồm cả đường dẫn vd test/text.txt
3.4.8 git tag
Add tag cho commit
git tag <tagName> <commit> git tag --list git push --tags git tag -d <tagName> // delete tag
3.4.9 git describe
Liên quan đến tags.
Cho biết tag trước đó, cách bao nhiêu commit, tag đó ở commit nào
git describe // lấy tag ở commit mới nhất làm default git describe <tagName> // describe theo tên tag // respone Tag gần nhất - cách bao nhiêu commit - commit chứa tag search //Example git descript v2 //=> response v1-35-gda9505f
3.4.10 git gc
Xóa file không cần thiết trong source code.
Mình không đi sâu vào lệnh này.
3.5 Gộp
3.5.1 Git cherry-pick
Lấy code commit của nhánh này bỏ qua nhánh kia.
Lấy code commit của nhánh A sang nhánh B.
Đôi khi, chúng ta chỉ muốn lấy 1 hay n commits từ 1 brach bỏ vào master, hoặc commit 1 lần và lên 2 branch
Cú pháp
git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff] [-S[<keyid>]] <commit>… git cherry-pick --continue git cherry-pick --quit git cherry-pick --abort
Lấy 1 commit từ 1 brach bỏ vào master
git checkout master git cherry-pick feature-A~1 # Hoặc chúng ta có thể chỉ định hash commit git cherry-pick C2
Lấy n commits từ 1 brach bỏ vào master
# Nếu muốn thêm 1 vài commit, không liên tục git cherry-pick commit_id1 commit_id3 # Nếu muốn thêm 1 loạt commit lần lượt cạnh nhau git cherry-pick commit_id1...commit_id5 # Với code trên, thì commit_id1 sẽ ko được thêm vào # Để đưa commit được tính vào trong branch muốn thêm thì git cherry-pick commit_id1^..commit_id5
1 lần commit cho cả 2 branches
# Đang ở branch-X, thực hiện commit để tạo ra commit A git add -A git commit -m " finish commit A" # Checkout sang branch Y và dùng cherry-pick nào git checkout branch-Y git cherry-pick branch-X
Fix conflict
git add . git commit
Tham khảo thêm: https://viblo.asia/p/git-nang-cao-git-cherry-pick-RQqKLQ9pZ7z
3.5.2 git rebase
Lấy code branch khác về branch hiện tại
Lấy commit branch A nối tiếp vào commit branch B (branch B lấy code từ branch A vào).
git rebase <tenBranch> // Khi bị conflict thì xử lý conflict và sử dụng lệnh sau để chạy rebase tiếp git rebase --continue
git rebase -i
Gộp nhiều commit lại thành 1 commit
git rebase -i HEAD~2 // 2 là số lượng commit cần gộp
3.5.3 git merge
Giống git rebase là lấy code từ branch khác về gộp vào branch hiện tại.
Nhưng:
- git merge ==> gộp commit theo trình tự thời gian
- git rebase ==> thêm các commit vào sau commit cuối cùng của branch hiện tại
Hình ảnh demo git merge
Hình ảnh demo git rebase
git mergetool
Hiển thị khung cho biết đã xảy ra xung đột thay đổi chỗ nào.
3.5.4 git merge-base
Tìm commit chung nhất để hợp nhất.
Mình không đi sâu vào lệnh này.
3.6 Branch
3.6.1 git branch
Tạo branch mới.
git branch <tenBranch>
3.6.2 git checkout
Lệnh chuyển branch.
git checkout <tenBranch>
git checkout -b
Tạo branch và chuyển luôn qua branch đó.
git checkout -b <tenBranch>
3.6.3 git stash
Lưu tạm lại code khi chuyển branch.
git stash save // lưu tạm version git stash list // hiện danh sách các bảng lưu tạm git stash apply <stash> hoặc git stash pop // lấy lại phiên làm việc trước //Example: git stash apply stash@{0} git stash --drop
3.6.4 git worktree
Đem các branch khác vào chung thư mục, thay vì phải chuyển qua lại giữa các branch.
git worktree <branchName> git worktree add <folder> <branchName> git worktree list
3.7 Rollback
3.7.1 git revert
Trả về code trước của một commit nào đó, add thêm 1 commit mới vào sau commit cuối cùng.
Hinh trên là revert, hình dưới là reset
git revert <commit>
3.7.2 git reset
Trả về một commit nào đó, xóa các commit phía sau commit đó.
git reset hình bên dưới, hình bên trên là git revert
git reset --soft <commit> // trả code của các commit trước đó khi đã git add (Staged) git reset --mixed <commit> // trả code của các commit trước đó khi chưa git add (working directory) git reset --hard <commit> // xóa bỏ hẳn luôn code của các commit trước đó
3.7.3 git restore
Đưa code từ staged về working directory
git restore -- . // => all file git restore -- <file>
3.7.4 git clean
Xóa code ở working directory.
git clean -n // xem xóa thế nào - chỉ file git clean -n -d // xem xóa thế nào - gồm file và folder git clean -f -n // xóa file git clean -f -n- d // xóa file và folder
3.8 Tìm kiếm
3.8.1 git grep
Dùng để tìm kiếm file or code trong folder git.
Cá nhân mình thì thấy lệnh này ít xài do VS Code đã có search. Nhưng khi lên server chắc có thể cần xài lệnh này.
git grep <search> // Example git grep 'test('
3.9 Export
3.9.1 git archive
Xuất souce code ra file zip,… mà không có thư mục .git
git archive --format <formatName> --output <path> <branchName> // Example git archive --format zip --output /full/path/to/zipfile.zip master
3.10. Debug
3.10.1 git bisect
Debug commit nào sửa làm chương trình bị sai.
Nó sẽ dựa vào commit good làm chương trình chạy và apply code từng commit sau nó để mình test chương trình còn đúng k? nếu đúng thì báo nó là good và nó tiếp tục apply commit mới vào để test tiếp.
git bisect start // bắt đầu debug git bisect bad // nói cho bisect commit này bad git bisect good // nói cho bisect commit này good git bisect good <commit> // nói bisect commit id này good
// Quy trình: 1. git bisect start 2. git bisect bad // => báo commit cuối cùng hiện tại bị bad 3. git bisect good <commit> // => báo commit này good nè bắt đầu từ đây 4. git bisect good // nếu commit good 5. git bisect reset // nếu commit bad => quay code về trạng thái trước khi bisect //Mô tả: 1. git bisect start 2. git bisect bad commit 5 BAD commit 4 commit 3 commit 2 commit 1 3. git bisect good commit_1 commit 5 BAD commit 4 commit 3 commit 2 commit 1 GOOD bisect qua commit 2 nó good => git bisect good commit 5 BAD commit 4 commit 3 commit 2 GOOD commit 1 GOOD bisect qua commit 3 nó bad => git bisect reset commit 5 BAD commit 4 commit 3 BAD commit 2 GOOD commit 1 GOOD => Lỗi nằm ở code commit 3
3.10.2 git blame
Dùng debug file.
Liệt kê sự thay đổi của file.
git blame <tenFile> git blame -L 1,2 <tenFile> // xem sự thay đổi ở dòng 1 và 2 của file git blame -L 1,+4 <tenFile> // xem sự thay đổi ở dòng 1 đến 4 của file git blame <tagName> <tenFile> // xem sự thay đổi ở commit có tag git blame -since=1.week <tenFile> // xem sự thay đổi file trong vòng 1 tuần // nó sẽ liệt kê hết // cái nào có dấu ^ là trước 1 tuần // không có dấu ^ là trong 1 tuần git blame -since=1.week <tenFile> | grep -v "^\^" // chỉ hiển thị thay đổi trong 1 tuần // không hiển thị trước 1 tuần // -v là nghịch đảo, phủ định lại vì grep là lấy
3.11 Các lệnh khác
3.11.1 git send-mail
Github hỗ trợ sẵn giao diện thao tác. (Vào github Settings/Notification).
Mình không đi sâu vào lệnh này.
3.38 git pull-request
Xem code thay đổi thế nào trước khi merge code.
Cái này github cũng hỗ trợ giao diện thao tác sẵn.
Mình không đi sâu vào lệnh này.
3.11.2 git instaweb
Thiết lập git web và duyệt web trên kho lưu trữ.
Mình không đi sâu vào lệnh này.
3.11.3 git filter-branch
Viết lại lịch sử commit
Mình không đi sâu vào lệnh này.
3.11.4 git daemon
Tạo một git server riêng.
Mình không đi sâu vào lệnh này.
3.11.5 git cat-file
Cho biết loại và thông tin các đối tượng của repository. là gì commit, blobs hay gì gì đó.
git cat-file -p <maBam> // nội dung của object git cat-file -s <maBam> // kích thước của object git cat-file -t <maBam> // loại của object
4. Tips, Trick với git
Tham khảo: https://viblo.asia/p/19-bi-kip-ban-co-the-dung-khi-pham-sai-lam-voi-git-dWrvwdmPRw38
Kết luận
Như vậy, với những lệnh cơ bản của git, bạn hoàn toán có thể làm việc nhóm, teamwork cùng nhau, cùng sử dụng chung một mã nguồn mà quản lý thì đơn giản, dễ dàng phải không nào. Cảm ơn bạn đã đọc bài viết.