Các lệnh Git hữu ích
1. Các lệnh cơ bản
$ git init Tạo repository local $ git clone [remote_url] Copy remote repo về local $ git checkout -b [branch_name] Tạo và chuyển sang branch mới $ git add . Stage tất cả các file thay đổi $ git status Kiểm tra trạng thái $ git commit -m "message" Gắn message vào commit $ git push origin [branch_name] Push code từ branch đã chỉ định lên remote repository $ git push origin HEAD Push code từ branch hiện tại lên Remote repository (cùng tên branch) $ git branch -m [branch_name sau khi đổi] Sửa lại tên branch $ git branch -d [branch_name] Xóa branch đã tồn tại và branch này đã được merge về master $ git branch -D [branch_name] Xóa branch ở local có commit nhưng chưa được merge $ git push origin --delete branch_name Xóa branch ở remote server $ git branch | grep -v "master" | xargs git branch -D Xóa tất các nhánh ở local $ git diff file_path Xem thay đổi
2. Merge nhánh
$ git checkout master Chuyển sang nhánh master $ git pull origin master Lấy code mới nhất về nhánh master trên local $ git checkout branch_name Chuyển sang nhánh cần merge các thay đổi của nó vào master mới nhất $ git merge master Merge nhánh hiên tại vào master ================= Resolve Conflict ====================== Xử lý các file bị conflict $ git add . Add các file đã xử lý vào index $ git commit -m "Resolve Conflict" Commit code
Một commit merge mới sẽ xuất hiện ở lịch sử commit của nhánh
feature, giống như một mối nối để ghép lại lịch sử của cả 2 nhánh.
Bạn sẽ có một cấu trúc commit trông giống như này:
3. Rebase
$ git checkout master Chuyển sang nhánh master $ git pull origin master Lấy code mới nhất về nhánh master trên local $ git checkout branch_name Chuyển sang nhánh cần merge các thay đổi của nó vào master mới nhất $ git rebase master Merge nhánh hiên tại vào master ================= Resolve Conflict ====================== $ git status Kiểm tra các file bị conflict Xử lý các file bị conflict $ git add file_path Add các file đã xử lý vào index $ git rebase --continue Sau khi sửa conflict, tiếp tục lại lệnh rebase $ git rebase --abort Huỷ rebase
Rebase sẽ đưa toàn bộ những commit mới tạo ở nhánh feature nối tiếp
vào "ngọn" của nhánh master, nhưng thay vì sử dụng một
commit merge
, nó sẽ viết lại lịch sử của project bằng cách tạo
ra những commit mới ứng với mỗi commit ban đầu của nhánh feature.
Lợi ích chính của việc rebase là bạn sẽ nhận được một lịch sử commit rõ
ràng, dễ theo dõi hơn. Đầu tiên, nó sẽ giúp loại bỏ những commit không cần
thiết như khi sử dụng
git merge
. rebase
giúp tạo
ra lịch sử commit có dạng tuyến tính, xuyên suốt project từ khi bắt đầu cho
đến hiện tại. Khi đó chúng ta sẽ dễ dàng điều hướng, kiểm tra lịch sử
project.
4. Sửa commit message
$ git log --oneline Xem lại lich sử commit $ git commit --amend -m "new message" Sửa lại commit message ngay trước đó $ git log --oneline Xác nhận lại commit message đã sửa
5. Xoá 1 commit đã lỡ commit nhầm hoặc Undo merge commit (Merge Pull Request)
Tuỳ vào từng trường hợp mà ta có 3 cách sau để đưa lịch sử commit về như cũ Cách 1: Chỉ đưa HEAD về như cũ $ git reset --soft HEAD~ Cách 2: Đưa HEAD và index về như cũ $ git reset HEAD~ Cách 3: Đưa cả index, working tree về 1 commit trước đó $ git reset --hard HEAD~ ===== Undo merge commit or merge PR ===== Look at your commit graph (git log --oneline --graph --color --all --decorate). You will see commits from the pull request, and you will see your own commits, and a merge commit (if it was not a fast-forward merge). You just have to find the last of your own commits before the merge, and reset the branch to this commit. $ git checkout master $ git reset --hard [commit] $ git log --oneline --graph --color --all --decorate $ git push -f origin master
6. Khi lỡ tay xóa mất commit
Xem lại toàn bộ lịch sử commit $ git reflog Chọn commit muốn phục hồi và khôi phục lại ví dụ: git reset --hard HEAD@{2} $ git reset --hard [commit]
7. Khi lỡ tay xóa mất branch
Xem lại toàn bộ lịch sử commit $ git reflog Từ các commit này, chọn rồi tạo branch mới ví dụ: git branch new-branch HEAD@{2} $ git branch branch_name [commit]
8. Stash code hiện tại
Tạm thời lưu lại các phần công việc còn đang làm dở $ git stash -u Lấy lại các nội dung công việc đang làm dở trước đó $ git stash pop
9. Cherry pick code
cherry-pick
là một cách để checkout 1 commit bất kỳ tại 1 branch
được chỉ định về brach hiện tại. Hay chính là git cherry-pick sẽ bốc thay đổi
của 1 commit trên 1 nhánh nào đó áp dụng vào nhánh hiện tại.
========= 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 Xem lại lich sử commit của chứa commit muốn cherry pick $ git log --oneline Lấy 1 commit từ 1 brach bỏ vào branch hiện tại $ git cherry-pick [commit_id] Lấy 1 Pull Request commit từ 1 brach bỏ vào branch hiện tại (Cherry pick 1 Pull Request/Merge commmit) $ git cherry-pick -m 1 [commit_id]
10. Git tag
Gắn tag cho mỗi commit để có thể xem lại thông tin của commit trước
Lightweight Tag: Đánh dấu snapshot của commit
Annotated Tag: Có thể đặt tiêu đề cho tag và khi xem nó sẽ có thông
tin về người tag, ngày tag,..
========== CÁCH TẠO LIGHTWEIGHT TAG ========= $ git tag Xem list tag đã tạo $ git tag tag_name Tạo tag => Đánh dấu cho lần commit cuối cùng $ git show tag_name Xem thông tin của lần commit được gắn tag ========== CÁCH TẠO ANNATATED TAG ========= Tạo Annotated Tag $ git tag -a tag_name -m "message" Tạo Annotated Tag ========== CÁCH TẠO ANNATATED TAG CHO COMMIT CŨ ========= $ git log --pretty=oneline Xem mã checksum của các lần commit trước $ git tag -a tag_name checksum_code[chỉ cần 5 ký tự đầu] -m "message" Thêm tag cho các commit cũ ========== PUSH TAG: Mặc định git push sẽ không push các tag đã được tạo lên repository ========= $ git push --tags Đẩy toàn bộ tag lên repository => release tags ========== TẠO BRANCH TỪ TAG ========= $ git checkout -b branch_name tag_name Tự động chuyển sang nhaansh branch_name, kèm theo đó là dữ liệu của lần commit đươc gắn tag tag_name
11. Remote repository
Kiểm tra tên remote $ git remote -v --- Khi clone về git sẽ tự động đặt cho remote làorigin
--- Mỗi repo có 2 hành động là:fetch
: lấy dữ liệu về từ server -puush
: gửi dữ liệu lên server --- Rename remote --- $ git remote rename old_name new_name --- Remove remote --- $ git remote remove remote_name --- Tạo thêm 1 remote --- $ git remote add remote_name URL $ git fetch remote_name --- Chỉ lấy về và lưu vào database của Git trên local --- --- Gộp vào repo local --- $ git merge remote_name $ git pull remote_name Lấy code từ remote về và tự động merge vào local --- Xem toàn bộ branch của remote --- $ git remote show remote_name
12. Xem git log đẹp hơn
Open git config $git config --list
ornano ~/.gitconfig
Xem log với graph oneline $ git log --oneline --graph --color --all --decorate =========== CUSTOM GIT LOG ========== Config git log: Git log with pretty-formats Advanced Git log Git config tutorials Some example git config $ git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit $ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" $ git config --global alias.hist "log --graph --date-order --date=short --pretty=format:'%C(auto)%h%d %C(reset)%s %C(bold blue)%ce %C(reset)%C(green)%cr (%cd)'"
git lg
để xem log
$ Cách xem này có thể thấy HEAD (con trỏ của branch hiện tại)
Add text below to ~/.gitconfig
[alias]
lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1"
Gõ git lg/ git lg1
để xem log
Install gitk:
sudo apt install gitk
# Read more: