Skip to content

Instantly share code, notes, and snippets.

@azoom-t-d-tuan
Last active May 11, 2021 08:29
Show Gist options
  • Save azoom-t-d-tuan/83b5996c30dc33a3c3cf92938755bd49 to your computer and use it in GitHub Desktop.
Save azoom-t-d-tuan/83b5996c30dc33a3c3cf92938755bd49 to your computer and use it in GitHub Desktop.
Git Practice
Một số câu lệnh cơ bản
1. Git clone : để sao chép một repository có sẵn
2. git add . : thêm những thay đổi vào stage
3. git commit -m "<nội dung commit" : commit những thay đổi
4. git push <remote> <branch> : đẩy những thay đổi lên remote repository
------------------------------
1. Pull
- Tác dụng: tải về (hay fetch) dữ liệu từ một branch duy nhất $branch_name từ remote server và sau đó merge các thay đổi
từ remote này vào repository dưới local.
- Cú pháp: git pull $remote_origin $branch_name
- So sánh với fetch: fetch sẽ tải về (fetch) dữ liệu của toàn bộ các branch trên URL quy định bởi $remote_origin nhưng
không thực hiện việc merge các thay đổi này vào local.
2. Checkout
- Chuyển sang một nhánh đang tồn tại: git checkout $branch_name
- Tạo một nhánh mới: git checkout -b $branch_name
- Lưu ý: khi chuyển nhánh thì sẽ chuyển con trở HEAD sang nhánh mà mình chuyển đến. Ở đây có thể thực hiện một số commit,
nhưng khi quay lại nhánh cũ thì con trở HEAD sẽ vẫn trỏ tới commit ở thời điểm chạy lênh git checkout
3. Merge
- Tác dụng: để merge branch bất kì vào branch hiện tại.
- Cú pháp: git merge $branch_name
- Lưu ý: khi merge branch có thể xảy ra xung đột(conflict), khi ấy phải thực hiện sửa xung đột đó thì mới có thể merge.
4. Rebase
- Tác dụng: tương tự merge, rebase cũng có tác dụng tích hợp thay đổi của nhánh này vào nhánh khác.
- Cú pháp: git rebase $branch_name
- Rebase thực hiện bằng cách đi tới commit cha chung của hai nhánh (nhánh bạn đang làm việc và nhánh bạn đang muốn rebase),
tìm sự khác biệt trong mỗi commit của nhánh mà bạn đang làm việc, lưu lại các thay đổi đó vào một tập tin tạm thời, khôi
phục lại nhánh hiện tại về cùng một commit với nhánh bạn đang rebase, và cuối cùng áp dụng lần lượt các thay đổi.
- Rebase khác với Merge ở chỗ, nó sẽ đem tất cả các thay đổi ở nhánh feature đặt lên đầu của nhánh master, vì vậy ở master
ta sẽ thấy được một cây commit gồm từng commit trên branch feature chứ không phải chỉ một commit duy nhất như Merge.
5. Rebase -i HEAD
- Gộp các commit trong một branch với cú pháp: rebase -i HEAD~[number] với [number] là số commit muốn gộp lại, tính từ HEAD
- Có một số lựa chọn khi rebase -i như fixup hay squash
6. Git stash
- Để lưu lại các thay đổi trong trường hợp muốn tạm ngưng công việc(chuyển sang branch khác) mà không muốn thừa một commit
để lưu lại các thay đổi cũ.
- Cú pháp: git stash save
7. Git stash list
- Để xem lại các nội dung đã lưu
git stash list
stash@{0}: WIP on <branch_name>: <lastest commit>
stash@{1}: WIP on <branch_name>: <lastest commit>
để xem cả nội dung: git stash list -p
để xem nội dung 1 stash cụ thể: git stash show stash@{1}
8. Git stash apply
- Để tiếp tục làm việc với một stash cụ thể
ví dụ stash 1: git stash apply stash@{1}
9. Git cherry pick
-Lấy thay đổi từ một branch này và gộp vào branch khác. Nhưng điểm khác nhau lớn nhất giữa cherry-pick và merge, rebase là
cherry-pick chỉ gộp một commit được chỉ định từ một nhánh khác vào nhánh hiện tại trong khi merge và rebase sẽ gộp toàn bộ
các commit lại. Để sử dụng cherry-pick, ta cần xem lại log các commit sau đó lấy mã hash của commit cần được cherry-pick và
checkout sang nhánh cần được gộp commit của mã hash kia và thực hiện lệnh:
git cherry-pick <commit-hash-code>
10. git reset --hard origin/master (Cẩn thận khi dùng)
- Loại bỏ tất cả các thay đổi của branch hiện tại, đưa nó về giống hệt với origin/master
---------------------------------
Một số case thường dùng
- Pull có thể pull từ các nhánh khác với cú pháp chung là: git pull <remote> <branch>
trong đó remote và branch là 2 tham số mình có thể lựa chọn để pull về
- Rebase kết hợp vs Merge:
Trong trường hợp bạn muốn tổng hợp các commit vụn vặt trong một pull request nào đó trước lúc merge với nhánh khác thì
có thể thực hiện các bước:
+ rebase -i HEAD~<number> ,trong đó number là số commit mình muốn gộp lại, ngòai ra có thể chỉnh sửa nội dung của commit
sau khi gộp lại để phù hợp với nội dung của pull
+ tiến hành merge với nhánh khác.
- git reset HEAD^
Khi muốn quay trở lại một commit gần nhất thì sẽ sử dụng câu lệnh trên
- Một số lưu ý liên quan đến commit
Thay đổi nội dung commit: git commit --amend
Xuống dòng khi commit: git commit -m "<nội dung dòng 1>" -m "<nội dung dòng 2>" ...
- Khi rebase merge hoặc thực hiện các thao tác với git mà có vấn đề thì có thể cài đặt Extension: git graph ,để quan sát trực quan, hỗ trợ.
ref: https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph
- Khi đang làm việc ở một branch khác mà ở master có cập nhật và có ảnh hưởng đến code của mình thì sẽ thực hiện thứ tự:
+ checkout về master: git checkout master
+ pull code mới nhất từ master ở remote về local: git pull origin master
+ trở về nhánh hiện tại của mình: git checkout <branch_name>
+ rebase code mới nhất ở master: git rebase
@azoom-ha-phan
Copy link

azoom-ha-phan commented Sep 6, 2019

@azoom-t-d-tuan
Copy link
Author

azoom-t-d-tuan commented Nov 29, 2019

Khi có người khác push/force push lên branch của mình, nếu pull về sẽ gây conflict, xử lý và push lại thì sẽ tạo ra commit merge => Git tree sẽ k ổn.
Giải pháp:
git reset --hard origin/*branch-name : cập nhật ở local giống remote, có thể đổi option hard -> soft để giữ lại thay đổi của bản thân

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment