Mục lục
I. Intro & Install
Git là 1 hệ thống Distributed revision control (Distributed version control or decentralized version control), tạm dịch là hệ thống quản lý source phân tán.
Chỉ mất 3s để đồng bộ metadata.
Cài đặt
Documents
https://help.github.com/enterprise/2.9/
II. Config
1. Short commands
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.st 'status -s '
Linux:
Config file’s location: ~/.gitconfig
Windows:
Config file’s location: C:\Users\{your_name}\.gitconfig
[core]
preloadindex = true
fscache = true
autocrlf = true
quotepath = off
[gc]
auto = 256
[user]
email = lcdung@example.com
name = lcdung
[color]
ui = true
[alias]
tree = log --oneline --decorate --all --graph
st = status -s
ig = update-index --assume-unchanged
no-ig = update-index --no-assume-unchanged
co = checkout
getlog = log --oneline -10
[credential]
helper = cache
git config --global user.email "your_email@example.com"
git config --global user.username"lcdung"
2. Remember username and password when using [http]
git config --global credential.helper cache
git config credential.helper cache
3. Ignore files
Edit file .gitignore
git update-index --assume-unchanged
git update-index --no-assume-unchanged
III. Basic commands
1. Remote:
Mặc định (origin repository trên server và local repository trên local)
1. Add remote
git remote add <remote_name> <url>
2. Checking name of current remote
git remote -v
# View existing remotes
# origin https://github.com/user/repo.git (fetch)
# origin https://github.com/user/repo.git (push)
3. Rename remote
git remote rename <old_name> <new_name>
4. Set URL remote
git remote set-url origin https://github.com/user/repo2.git
# Change the 'origin' remote's URL
5. Delete
git remote rm <remote_name>
2. Add files
1. Add multi files
git add <file1> <file2> ....
2. Add all files
# Only adding modified files and new files
git add .
# Adding all (deleted, modified and new)
git add --all
3. Pull
git pull
git pull <remote_name> <branch_name>
4. Push
git push <remote_name> <branch_name>
# Force update
git push -f <remote_name> <branch_name>
5. Fetch
# Update remote without deleting branches
git fetch <remote_name>
# Update remote and deleting branch (if have)
git fetch <remote_name> --prune
IV. Main commands
1. Init
git init
2. Clone
# Clone repo:
git clone <url> {folder_name}
# Clone single branch of repo:
git clone -b <branch_name> <url> {folder_name}
3. Status
git status
git status -s
4. Branch
# List all branch of local:
git branch
# List all branch of local and remote:
git branch --all
# Create new branch and does not switch to new branch
git branch <new_branch>
# Create new branch and switch to new branch
git checkout -b <new_branch>
# Rename current branch to new_branch_name
git branch -m new_branch_name
# Delete branch on local
git branch -D <branch_name1> <branch_name2> ...
# Delete branch on remote
git push origin :<branch_name1> :<branch_name2> ...
git push origin --delete <branch_name1> <branch_name2>
5. Add files
# Add multi files
git add <file1> <file2> ....
# Add all files
## Only adding modified files and new files
git add .
## Adding all (deleted, modified and new)
git add --all
6. Commit
# Commit a message
git commit -m "Sample message"
# Edit commit message of last commit
git commit --amend -m "Edit sample message"
7. Logs
# View short logs:
git log --oneline -10
# View pretty logs:
git log --oneline --decorate --all --graph
8. Checkout
# Checkout to branch
git checkout <branch_name>
# Checkout to commit hash
git checkout <commit_hash>
# Checkout file with commit hash
git checkout <commit_hash> <file_path>
# Checkout file from another branch
git checkout <branch_name> <file_path>
9. Reset
# Reset HEAD
git reset --hard
git reset origin/master --hard
# Reset with commit hash
git reset <commit_hash>
10. Revert
# Revert with commit hash
git revert <commit_hash>
11. Merge
git merge <branch_name>
12. Rebase
Để tích hợp các thay đổi từ nhánh này vào nhánh khác và commit trong nhánh hiện tại. (https://git-scm.com/book/vi/v1/Ph%C3%A2n-Nh%C3%A1nh-Trong-Git-Rebasing)
Rebase on branch: When rebase other brach need checkout other branch.
# Rebase <branch_name> into current branch
git rebase <branch_name>
# Rebase <branch_name2> into <branch_name1>
git rebase <branch_name1> <branch_name2>
Rebase on commit: When rebase other brach need checkout other branch.
git rebase -i <commit_hash>
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
13. Cherry-pick
lấy commit từ branch khác về branch hiện tại.
git cherry-pick <commit_hash1> <commit_hash2> ..
14. Diff
So sánh code
# Diff two commit:
git diff <commit_hash1> <commit_hash2>
# Diff two branches:
git diff <branch_name1> <branch_name2>
# Diff file on two branches:
git diff <branch_name1> <branch_name2> -- <file_path>
15. Stash
Backup hiện trạng đang làm và nhảy code về bất kỳ version được backup trước đó.
# Stashed all changed
git stash
# List all stash
git stash list
# Show detail a stash
git stash show stash@{0}
# Apply latest stash to current branch
git stash pop
# Apply stash{0} into current branch
git stash pop stash@{0}
# Apply stash{0} into current branch
git stash apply stash@{0}
# Drop stash{0} into current branch
git stash drop stash@{0}
# Clear all stash
git stash clear
V. Tips & Notes
List all ignore files:
git ls-files -v | grep '^h'
Count modified files:
git status | grep 'modified:' | wc -l
Ignore chmod file:
git config core.fileMode false
Some commands need to push with option -f:
reset
rebase
commit --amend
VI. Q&A
- Lúc commit rồi mà phát hiện ra commit đó sai quá sai thì phải undo hay xóa cái commit đó ra sao?
- Muốn quay lại commit thứ N thì làm sao?
Thông thường và dể dùng nhất là dùng git reset tuy nhiên còn vài cách khác dễ dùng hơn nửa đấy!
Bạn có thể tham khảo tại bài này -> Giới thiệu 3 cách undo commit hoặc loại bỏ commit cơ bản
- Tôi đang chưa hiểu rõ sự khác biệt giữa
git merge
vàgit rebase
là gì? - Tại sao tôi lại dùng git rebase mà không phải merge trong dự án này?
- git rebase nó hay bị nhiều conflict hơn git merge?
- git merge dễ tra log hơn git rebase đúng không vì rebase sửa log lại hết rồi ?
Lý do áp dụng rebase trong dự án là cho mọi thứ đều dễ dàng xem, điều tra log khi xem qua transport plan trong git. Chính vì thế việc áp dụng rebase cho từng brach riêng biệt là cách để cac developer có tư duy logic tốt log một cách có hệ thống những commit thực sự quan trọng và cần thiết để tra cứu sau này hạn chế commit spam ngoài ý muốn.
Việc conflict trong git là điều không thể tránh khỏi khi merge hay rebase branch khác mà làm chung trên 1 file mình chưa thấy dẫn chứng nào là rebase conflict nhiều hơn merge.
Bạn muôn biết rõ sự khác biệt này thì vào xem bài viết này -> Sự khác biệt giữa git merge và git rebase
- Trước khi commit mới thì mình phải pull code mới về, mà nếu gặp conflict thì phải xử lý, nếu xử lý ko khéo thì mất code của mình làm, vậy phải làm sao đây?
- Nếu chỉ backup 1 lần cho 1 commit thì cực quá vì pull nhiều branch thì sao?
- Mình đang làm branch hiện tại chưa muốn commit, mà phải qua branch khác fix bug dùm member vậy thì phải làm sao?
Nhìn chung mọi câu hỏi đều xoay quanh việc bạn muốn backup code mà chưa thể commit được! Có 1 câu thần chú mà mình hay dùng đó là git stash nó cho phép bạn backup mọi lúc, không giới hạn số lần backtup và bạn dễ dàng tra cứu lại những gì bạn backup nữa.
Bạn muôn biết rõ sự khác biệt này thì vào xem bài viết này -> Tổng hợp sử dụng git stash hiệu quả