Git
Jargons
- HEAD: Khi làm việc với Git, chỉ một branch có thể check out tại một thời điểm - và đây được gọi là nhánh HEAD. Thông thường, đây còn được gọi là nhánh
active
hoặccurrent
. - Detached HEAD: When a specific commit is checked out instead of a branch.
Remote
git remote -v
: Show những remote repo mà local repo này liên kết, mặc định của Github làorigin
git fetch origin
: Cập nhật data từ remoteorigin
->git fetch origin main
: Cập nhật data nhánhmain
từ remoteorigin
git merge origin/main
: Merge originmain
vào localHEAD
git pull origin main
=git fetch origin main
+git merge origin/main
: Pull originmain
về localHEAD
git push origin t1:newT1
: Push localt1
lên originnewT1
(đổi name)
Merge, Rebase & Cherry-Pick
Cả 3 đều integrate changes from one branch into another branch.
git checkout feature
+git merge dev
- Nếu hủy:
git merge --abort
- Fix conflict → add. →
git merge --continue
→ Sửa message ở màn hình interactive → :wq - Nên dùng khi merge các nhánh
feature
với nhau vì ít cần quan tâm đến lịch sử commit, hoặc khi merge các nhánhfeature
đã đượcrebase
vào nhánhdev
(đọc ở dưới).
- Nếu hủy:
git checkout feature
+git rebase dev
, next steps are similar- KHÔNG dùng ở nhánh chính
dev
, chỉ sử dụng trên các nhánh phụfeature
trước khi merge vàodev
because it put allfeature
's commits behind the last commit ofdev
-> Easy to resolve conflicts.
- KHÔNG dùng ở nhánh chính
git cherry-pick <commit-id>
: Nhánh feature có commit F1 và F2. Ở nhánh master:git merge feature
sẽ merge cả F1 và F2 vào master.git cherry-pick <F1>
sẽ chỉ merge F1 vào master.
Squash 3 commit
- Chưa push:
git rebase -i HEAD~3
→ Từ hàng 2 trở xuống, đổi chữpick
thànhs
→ Conflict → ... - Đã push:
git reset HEAD~3
/ (3rd tronggit log
) → add, commit →git push -f origin <branch-name>
Branch
git checkout -b newBranch
: Tạo và chuyển sang nhánhnewBranch
git branch -d test1
: Xóa nhánhtest1
git branch -m newName
: Đổi tên nhánh đang checkout thànhnewName
git branch -a
: Show all remote branches
Mess Up
git reflog show master
(Xem nhật ký thao tác trên nhánh master) →git reset 'HEAD@{1}’
(vớiHEAD@{0}
là thao tác vừa làm → reset về thao tác trước đó làHEAD@{1}
).HEAD@{1}
vsHEAD~1
: 2nd củagit reflog
vs 2 commits older than HEAD củagit log --oneline
.
Reset
git reset (HEAD~1 / <commit-id>) --(soft / mixed / hard)
→ Về stage/local/xóa luôn.git status (<file-name>)
: Xem status (local, staging or committed) cả nhánh (hoặcfile-name
).reset
vsrevert
:revert
chỉ undo riêng 1 commitX
, cònreset
back về luôn commit đó luôn (undo hết ~ commit sauX
).revert
cũng sẽ tạo ra 1 commit mới, cònreset
thì ko.
Config User
git config --list --show-origin
git config --global user.email cdkhoa97@gmail.com
git config --global user.name "Finn Chau"
Stash
git stash
/git stash save 'message'
git stash apply ‘stash@{1}’
vsgit stash pop
: Apply nhưng ko xóa / xóa luôn stash.git stash list
-git stash clear
-git drop stash@{1}
Tìm lại và checkout commit/stash cũ
- Bash ONLY: Tìm lại ID của commit/stash cũ:
git fsck --unreachable | grep commit | cut -d" " -f3 | xargs git log --merges --no-walk --grep=WIP
ThayWIP
ở cuối by a part of the title của stash/commit - Thử version cũ hơn của pj (Detached HEAD):
git checkout -b test-branch 56a4e5c08 --index.js
- Tạo nhánh mới từcommit-id 56a4e5c08
→ do anything... →git checkout master
+git branch -d test-branch
.
Nếu ko có--index.js
→ phục hồi tất cả các file.
ETC
- Xóa file:
git rm .vscode/settings.json (--cached)
→ Xóa file (--cached
chỉ xóa trong git ko xóa thật, dùng khi .gitignore k hoạt động). - Vim:
ESC : W Q
→ Save & Quit.