Các lệnh Git hữu ích - git merge, git rebase, git cherry-pick, git log

Các lệnh Git hữu ích - git merge, git rebase, git cherry-pick, git log

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:

Git merge

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.

Git rebase

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 or nano ~/.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" git lg/ git lg1 để xem log
Install gitk: sudo apt install gitk
# Read more:

Đăng nhận xét

Mới hơn Cũ hơn