Skip to main content

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ặc current.
  • 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ừ remote origin -> git fetch origin main: Cập nhật data nhánh main từ remote origin
  • git merge origin/main: Merge origin main vào local HEAD
  • git pull origin main = git fetch origin main + git merge origin/main: Pull origin main về local HEAD
  • git push origin t1:newT1: Push local t1 lên origin newT1 (đổ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ánh feature đã được rebase vào nhánh dev (đọc ở dưới).
  • 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ào dev because it put all feature's commits behind the last commit ofdev -> Easy to resolve conflicts.

Merge, Rebase

  • git cherry-pick <commit-id>: Nhánh feature có commit F1F2. Ở nhánh master:

    • git merge feature sẽ merge cả F1F2 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ành s Conflict ...
  • Đã push: git reset HEAD~3 / (3rd trong git log) add, commit git push -f origin <branch-name>

Branch

  • git checkout -b newBranch: Tạo và chuyển sang nhánh newBranch
  • git branch -d test1: Xóa nhánh test1
  • git branch -m newName: Đổi tên nhánh đang checkout thành newName
  • 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ới HEAD@{0} là thao tác vừa làm → reset về thao tác trước đó là HEAD@{1}).
  • HEAD@{1} vs HEAD~1: 2nd của git reflog vs 2 commits older than HEAD của git 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ặc file-name).
  • reset vs revert: revert chỉ undo riêng 1 commit X, còn reset back về luôn commit đó luôn (undo hết ~ commit sau X). revert cũng sẽ tạo ra 1 commit mới, còn reset 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}’ vs git 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ũ

  1. 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
    Thay WIP ở cuối by a part of the title của stash/commit
  2. 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.