æ¬å¤å¿åæ»ç»äºå¸¸ç¨ç Git å½ä»¤è¡æä»¤ï¼ä»¥ä¾å¿«éåèã
å建ä¸ä¸ªæ°çæ¬å°åå¨åº
$ git init [项ç®åç§°]
å éåå¨åº(代ç ä»åº)
$ git clone <git_url>
å°åå¨åºå éå°æå®ç®å½
$ git clone <git_url> æå®ç®å½
å°åå¨åºå éå°æå®ç®å½ï¼å¹¶æå®åæ¯
$ git clone <git_url> -b <忝åç§°> æå®ç®å½
å¨å·¥ä½ç®å½ä¸æ¾ç¤ºä¿®æ¹åçæä»¶ï¼ä¸ºæ¨çä¸ä¸æ¬¡æäº¤æå
$ git status
æåæä»¶ï¼åå¤æäº¤
$ git add [file]
æåæææ´æ¹çæä»¶ï¼åå¤æäº¤
$ git add .
å°æææåæä»¶æäº¤å°çæ¬ååå²è®°å½
$ git commit -m "commit message"
å°ææè·è¸ªçæä»¶æäº¤å°çæ¬ååå²è®°å½
$ git commit -am "commit message"
åæ¶æåæä»¶ï¼ä¿çæä»¶æ´æ¹
$ git reset [file]
å°ææå 容æ¢å¤å°æå䏿¬¡æäº¤
$ git reset --hard
å·²æ´æ¹ä½æªæåå 容çå·®å¼
$ git diff
å·² commited ä½å°æªæäº¤çå 容çå·®å¼
$ git diff --staged
卿å®åæ¯ä¹ååºç¨å½å忝çä»»ä½æäº¤
$ git rebase [branch]
设置å°éå å°æ¨çæäº¤åæ ç¾çåç§°
$ git config --global user.name "name"
设置å°éå å°æ¨çæäº¤åæ ç¾ tags ççµåé®ä»¶å°å
$ git config --global user.email "email"
å¯ç¨ Git è¾åºçä¸äºçè²
$ git config --global color.ui auto
卿æ¬ç¼è¾å¨ä¸ç¼è¾å ¨å±é ç½®æä»¶
$ git config --global --edit
æ¾ç¤ºæ¬å° repo é
置设置
$ git config --list
å é¤å ¨å±è®¾ç½®
$ git config --global --unset <entry-name>
ååºæææ¬å°åæ¯
$ git branch
ååºææåæ¯ï¼æ¬å°åè¿ç¨
$ git branch -av
åæ¢å° my_branchï¼å¹¶æ´æ°å·¥ä½ç®å½
$ git checkout my_branch
åå»ºå¹¶åæ¢å°æ°åæ¯new_branch
$ git checkout -b new_branch
å é¤å为 my_branch ç忝
$ git branch -d my_branch
å 餿¬å°åå¨è¿ç¨ä¸åå¨ç忝
$ git remote prune origin
å°åæ¯ A åå¹¶å°åæ¯ B
$ git checkout branchB
$ git merge branchA
æ è®°å½åæäº¤
$ git tag my_tag
ä»è¿ç¨åæ¯ä¸åå»ºå¹¶åæ¢å°æ¬å°åæ¯
$ git checkout -b <branch-name> origin/<branch-name>
# ä¿å已修æ¹ååé¶æ®µçæ´æ¹
$ git stash
# ååºéèæä»¶æ´æ¹çå æ 顺åº
$ git stash list
# ä»åå¨å æ é¡¶é¨ç¼åå·¥ä½
$ git stash pop
# 丢å¼åå¨å æ é¡¶é¨çæ´æ¹
$ git stash drop
# åå°æä¸ª stash çç¶æ
$ git stash apply <stash@{n}>
# å 餿æç stash
$ git stash clear
æ¾ç¤ºå½åæ´»å¨åæ¯çæäº¤åå²
$ git log
æ¾ç¤º branchA ä¸ä¸å¨ branchB ä¸çæäº¤
$ git log branchB..branchA
æ¾ç¤ºæ´æ¹æä»¶çæäº¤ï¼å³ä½¿è·¨éå½å
$ git log --follow [file]
æ¾ç¤º branchA ä¸çå å®¹ä¸ branchB ä¸çå 容çå·®å¼
$ git diff branchB...branchA
以人类å¯è¯»çæ ¼å¼æ¾ç¤º Git ä¸çä»»ä½å¯¹è±¡
$ git show [SHA]
æä»¶ .gitignore æå®äº Git åºè¯¥å¿½ç¥ç æªè·è¸ªç æä»¶
| :- | :- |
|---|---|
è¡é¦ # | å
¨è¡æ³¨éï¼ä¸æ¯æè¡å°¾ç±»æ³¨é (è½¬ä¹ \#) |
è¡é¦ ! | å¦å®æ¨¡å¼ (è½¬ä¹ \!) |
** | å¹é ä»»æè·¯å¾ |
* | å¹é ä»»æå¤ä¸ªå符 |
? | å¹é ä»»æä¸ä¸ªå符 |
doc/** | å¹é
doc æä»¶å¤¹ä¸çå
¨é¨å
容 |
doc/**/a | å¹é
ä»»ææ·±åº¦è·¯å¾ä¸ç a æä»¶ææä»¶å¤¹ |
/ | 表示路å¾åé符ï¼ä¸åºåæä½ç³»ç» |
/ ç»å°¾ | ä» ä¼å¹é æä»¶å¤¹ï¼å¦åä¼å¹é æä»¶åæä»¶å¤¹ |
| ç©ºè¡ | ä¸å¹é 任使件 |
| è¡å°¾ç©ºæ ¼ | é»è®¤è¢«å¿½ç¥ï¼å¯ä½¿ç¨\è¿è¡è½¬ä¹ |
| è¡é¦ç©ºæ ¼ | 被æ£å¸¸å¤çï¼ä¸ä¼è¢«å¿½ç¥ |
å½å .gitignore æä»¶å®ä¹è§åçä¼å
级é«äºä¸çº§è·¯å¾ .gitignore å®ä¹è§åçä¼å
级ï¼åå®ä¹çè§åä¼å
级é«äºåé¢å®ä¹è§åçä¼å
级
# 忽ç¥å½åç®å½logsæä»¶å¤¹ä¸çå
¨é¨å
容
/logs/
/logs/*
/logs/**
# ä¸è¿°å æ¡è§åçæ
# å¿½ç¥ Mac ç³»ç»æä»¶ï¼å
æ¬ä»»æåè·¯å¾ä¸çååæä»¶ï¼å¤¹ï¼
.DS_store
# å¿½ç¥ node_modules æä»¶å¤¹ï¼å
æ¬ä»»æåè·¯å¾ä¸çååæä»¶å¤¹
node_modules/
# 忽ç¥ä»»æåè·¯å¾ä¸buildãtargetæä»¶å¤¹ï¼
# ä½ä¸å¿½ç¥src/mainãsrc/testä¸çbuildãtargetæä»¶å¤¹
build/
!**/src/main/**/build/
!**/src/test/**/build/
target/
!**/src/main/**/target/
!**/src/test/**/target/
# ä½¿ç¨ ! éæ°å
嫿宿件ï¼å¤¹ï¼
!logs/.gitkeep
# ä»å·¥ä½ç®å½ä¸å 餿件并æåå é¤
git rm <filename>
# ä»çæ¬æ§å¶ä¸å 餿件ä½å¨æ¬å°ä¿çæä»¶
git rm --cached <filename>
# æ´æ¹æä»¶åå¹¶åå¤æäº¤
git mv <filename-orig> <filename-renamed>
ä»è¯¥ Git è¿ç¨è·åææåæ¯
$ git fetch [alias]
å°è¿ç¨åæ¯åå¹¶å°å½ååæ¯ä»¥ä½¿å ¶ä¿æææ°ç¶æ
$ git merge [alias]/[branch]
# 没æå¿«è¿
$ git merge --no-ff [alias]/[branch]
# ä»
å¿«è¿
$ git merge --ff-only [alias]/[branch]
å°æ¬å°åæ¯æäº¤ä¼ è¾å°è¿ç¨åå¨åºåæ¯
$ git push [alias] [branch]
ä»è·è¸ªè¿ç¨åæ¯è·åå¹¶åå¹¶ä»»ä½æäº¤
$ git pull
å°å¦ä¸ä¸ªåæ¯çä¸ä¸ªç¹å®æäº¤åå¹¶å°å½å忝
$ git cherry-pick [commit_id]
æ·»å ä¸ä¸ª git URL ä½ä¸ºå«å
$ git remote add [alias] [url]
æ¾ç¤ºæ¨è®¾ç½®çè¿ç¨åå¨åºçåç§°
$ git remote
æ¾ç¤ºè¿ç¨åå¨åºçåç§°å URL
$ git remote -v
å é¤è¿ç¨åå¨åº
$ git remote rm [remote repo name]
æ´æ¹ git repo ç URL
$ git remote set-url origin [git_url]
ä»é¡¹ç®ä¸å 餿件并æåå é¤ä»¥è¿è¡æäº¤
$ git rm [file]
æ´æ¹ç°ææä»¶è·¯å¾å¹¶æåç§»å¨
$ git mv [existing-path] [new-path]
æ¾ç¤ºæææäº¤æ¥å¿ï¼å¹¶æç¤ºä»»ä½ç§»å¨çè·¯å¾
$ git log --stat -M
# 设置é»è®¤è¡ä¸ºï¼ä»¥é²äººä»¬æ²¡æè®¾ç½® core.autocrlf
* text=auto
# æç¡®å£°ææ¨å¸æå§ç»è§èåå¹¶å¨ç»å¸æ¶
# 转æ¢ä¸ºæ¬æºè¡ç»å°¾çææ¬æä»¶
*.c text
*.h text
# 声æå¨ç»å¸æ¶å§ç»ä»¥ CRLF è¡ç»å°¾çæä»¶
*.sln text eol=crlf
# 表示ææçæ£äºè¿å¶ä¸ä¸åºä¿®æ¹çæä»¶
*.png binary
*.jpg binary
# æ è®°æåæ¶æ è®°è¦æ ¹æ®åå¨åºçè¯è¨ç»è®¡æ°æ®è
# å¿½ç¥æé»è®¤éèå·®å¼çè·¯å¾
search/index.json linguist-generated=true
# 以ä¸å±æ§ç»è®¡ SQL æä»¶
*.sql linguist-detectable=true
# ä»ç»è®¡ä¿¡æ¯ä¸æé¤
docs/formatter.rb linguist-documentation=false
# å°å®ä»¬ä»ç»è®¡ä¿¡æ¯ä¸æé¤
special-vendored-path/* linguist-vendored
# å°ææ .rb æä»¶æ£æµä¸º Java æä»¶
*.rb linguist-language=Java
$ cat ~/.ssh/config
Host gitlab.com
# ç´æ¥ä½¿ç¨ sh**socks æä¾ç socks5 代ç端å£
ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p
Host github.com
ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p
éåæåçæäº¤æ¶æ¯
$ git commit --amend -m "new message"
ä¿®æ¹ææ°çæäº¤è䏿´æ¹æäº¤æ¶æ¯
$ git commit --amend --no-edit
$ git log --show-signature
$ git rebase -i HEAD~3
# 表示è¦ä¿®æ¹å½åçæ¬çåæ°ç¬¬ä¸æ¬¡ç¶æ
# å°è¦æ´æ¹çè®°å½è¡é¦åè¯ pick æ¹ä¸º edit
pick 96dc3f9 æäº¤ commit æè¿°å
容 1
pick f1cce8a æäº¤ commit æè¿°å
容 2
pick 6293516 æäº¤ commit æè¿°å
容 3
# Rebase eeb03a4..6293516 onto eeb03a4
# (3 commands)
#
# Commands:
# p, pick = ä½¿ç¨æäº¤
# r, reword = ä½¿ç¨æäº¤ï¼ä½ç¼è¾æäº¤æ¶æ¯
# e, edit = ä½¿ç¨æäº¤ï¼ä½åæ¢ä¿®æ¹
# s, squash = ä½¿ç¨æäº¤ï¼ä½èåå°å
åçæäº¤ä¸
# f, fixup = å squashï¼ä½ä¸¢å¼æ¤æäº¤çæ¥å¿æ¶æ¯
# x, exec = ä½¿ç¨ shell è¿è¡å½ä»¤(该è¡çå
¶ä½é¨å)
# d, drop = å é¤æäº¤
ä¿åå¹¶éåºï¼ä¼å¼¹åºä¸é¢æç¤º
# æ¨ç°å¨å¯ä»¥ä¿®æ¹æäº¤ï¼ä½¿ç¨
#
# git commit --amend
#
# å¯¹æ´æ¹æå°æ»¡æåï¼è¿è¡
#
# git rebase --continue
#
# 1. éè¿è¿æ¡å½ä»¤è¿å
¥ç¼è¾æ´æ¹ commitï¼ä¿åéåº
$ git commit --amend
# 2. ä¿åéåºç¡®è®¤ä¿®æ¹ï¼ç»§ç»æ§è¡ä¸é¢å½ä»¤,
$ git rebase --continue
# å¦æä¿®æ¹å¤æ¡è®°å½å夿§è¡ä¸é¢ä¸¤æ¡å½ä»¤ç´å°å®æææä¿®æ¹
# æåï¼ç¡®ä¿æ²¡æäººæäº¤è¿è¡æ¨éï¼æå¥½ä¸è¦å -f å¼ºå¶æ¨é
$ git push -f origin master
$ git commit -v --amend
éåæåçæäº¤ä¿¡æ¯
# æ¤é䏿¡è®°å½
$ git reset --hard HEAD~1
# 强å¶åæ¥å°è¿ç¨ä»åº
$ git push -f origin HEAD:master
# 妿æçä¿®æ¹ä»¥åå å
¥æååºçè¯
$ git reset --hard
# è¿åææä¿®æ¹ï¼ä¸ä¼å 餿°å¢çæä»¶
$ git checkout .
# ä¸é¢å½ä»¤ä¼å 餿°å¢çæä»¶
$ git clean -xdf
# åæ¢å° B 忝
$ git checkout <B>
# å° A 忝 <hash-id> çå
容 pick å° B 忝
$ git cherry-pick <hash-id>
$ git update-ref -d HEAD
æææçæ¹å¨é½éæ°æ¾åå·¥ä½åºï¼å¹¶æ¸
空ææç commitï¼è¿æ ·å°±å¯ä»¥éæ°æäº¤ç¬¬ä¸ä¸ª commit äº
$ git fetch --all && git reset --hard origin/master
æå¼æ¬å°ææçä¿®æ¹ï¼åå°è¿ç¨ä»åºçç¶æ
$ git log Branch1 ^Branch2
$ git clone --bare https://github.com/username/project.git
$ https://gitee.com/username/newproject.git
$ cd project.git
$ git push --mirror https://gitee.com/username/newproject.git
$ git clone https://gitee.com/username/newproject.git
$ git submodule add <ä»åºå°å> <忍¡åè·¯å¾>
$ git clone <repository_url> --recursive
$ git submodule update --remote
$ cd <path_to_submodule>
$ git checkout <commit_hash>
$ git submodule status
$ git submodule init
$ cd ..
$ git checkout <commit_hash>
$ git submodule update --remote
$ cd <path_to_submodule>
$ git fetch --tags
$ git checkout $(git describe --tags $(git rev-list --tags --max-count=1))
# æ·»å ææå·²åå¨ç忍¡å
$ git submodule foreach --recursive git submodule add <repository_url>
# æ´æ°ææå模åå°ææ°æäº¤
$ git submodule foreach --recursive git pull origin master
# æ£åºç¹å®ç忍¡åè·¯å¾
$ git submodule foreach --recursive git checkout <branch_name>
# è·åä»åºä¸çææå模ååå
$ git submodule foreach --recursive git fetch
# è·åå¹¶å并忍¡åçè¿ç¨åæ¯
$ git submodule foreach --recursive git pull origin <branch_name>
# å°å模åè¿åå°ç¶ä»åºä¸çåå§æäº¤
$ git submodule foreach --recursive git checkout .
# è·å忍¡åçæ´æ°å¹¶å¿½ç¥æ¬å°ä¿®æ¹
$ git submodule foreach --recursive git fetch --all
$ git submodule foreach --recursive git reset --hard origin/master
$ cd <path_to_submodule>
$ git pull
$ git submodule deinit <path_to_submodule>
$ git rm <path_to_submodule>
$ cd <path_to_submodule>
$ git checkout <branch_name>
$ git submodule init
$ git submodule update
$ cd <path_to_submodule>
$ git checkout tags/<tag_name>
$ git help config
è·å帮å©ä¿¡æ¯ï¼æ¥çä¿®æ¹ä¸ªäººä¿¡æ¯çåæ°
git config core.fileMode false
ä¸åå°æä»¶çæéååè§ä½æ¹å¨
$ git config --global core.autocrlf input
èªå¨è½¬æ¢åå¤ªå¤§ï¼æäº¤å°gitæ¯èªå¨å°æ¢è¡ç¬¦è½¬æ¢ä¸º lf
$ git config --list
$ git config --global core.quotepath false
$ git config --global --unset <entry-name>
# æ¥ç代ç
$ git config --global http.proxy
$ git config --global https.proxy
$ git config --global socks.proxy
# 设置代ç
# éç¨äº privoxy å° socks å议转为 http åè®®ç http 端å£
$ git config --global http.proxy http://127.0.0.1:1080
$ git config --global https.proxy http://127.0.0.1:1080
$ git config --global socks.proxy 127.0.0.1:1080
# 忶代ç
$ git config --global --unset http.proxy
$ git config --global --unset https.proxy
$ git config --global --unset socks.proxy
# åªå¯¹ github.com 设置代ç
$ git config --global http.https://github.com.proxy socks5://127.0.0.1:1080
$ git config --global https.https://github.com.proxy socks5://127.0.0.1:1080
# åæ¶ github.com 代ç
$ git config --global --unset http.https://github.com.proxy
$ git config --global --unset https.https://github.com.proxy
$ 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 å½ä»¤çæ¶åå°±ä¸ç¨åè¾å
¥ä¸å¤§æ®µäºï¼ä¾å¦æä»¬è¦æ¥çç¶æï¼åªéï¼
$ git st
ä¹å¯ä»¥ççï¼æ´å¤å«å
# æ¥çgit ç设置
$ git config --get core.ignorecase
# 设置大å°åææ
$ git config core.ignorecase false
# è¿ç¨æä¿©ç¸åç®å½ï¼éè¿è¿ç§æ¹å¼æ¸
餿ï¼ç¶åæäº¤è®°å½
$ git rm -r --cached <ç®å½/æä»¶>
éå½å为new
$ git branch -m <new>
$ git branch -m <old> <new> #éå½å忝
æ¨éå¹¶éç½®
$ git push origin -u <new>
å é¤è¿ç¨åæ¯
$ git push origin --delete <old> #æ¹æ³1
$ git push origin :oldBranchName #æ¹æ³2
æå 容æç´¢æ´æ¹
$ git log -S'<a term in the source>'
æ¾ç¤ºç¹å®æä»¶éæ¶é´çåå
$ git log -p <file_name>
æå°åºå¾é ·çæ¥å¿å¯è§å
$ git log --pretty=oneline --graph --decorate --all
ååºææåæ¯åå ¶ä¸æ¸¸
$ git branch -vv
å¿«é忢å°ä¸ä¸ä¸ªåæ¯
$ git checkout -
åªè·åææè¿ç¨åæ¯
$ git branch -r
ä»å¦ä¸ä¸ªåæ¯ç¾åºå个æä»¶
$ git checkout <branch> -- <file>
å 餿¬å°åå¨è¿ç¨ä¸åå¨ç忝
$ git remote prune origin
$ git rev-parse HEAD # e10721cb8859b2c
# è·åç hash
$ git rev-parse --short HEAD # e10721c
$ git branch --merged master | grep -v '^\*\| master' | xargs -n 1 git branch -d
$ git diff --name-only --diff-filter=U
è¾åºå·¥ä½åºåæååºç different (ä¸å)ã
$ git diff
è¿å¯ä»¥å±ç¤ºæ¬å°ä»åºä¸ä»»æä¸¤ä¸ª commit ä¹é´çæä»¶åå¨ï¼
$ git diff <commit-id> <commit-id>
git diff --cached
$ git diff HEAD
è¾åºå·¥ä½åºãæååº åæ¬å°æè¿ççæ¬(commit)çdifferent(ä¸å)ã
$ git branch --merged master | grep -v '^\*\| master' | xargs -n 1 git branch -d
$ git branch -u origin/mybranch
æè
å¨ push æ¶å ä¸ -u åæ°
git push origin/mybranch -u
å
³èä¹åï¼git branch -vv å°±å¯ä»¥å±ç¤ºå
³èçè¿ç¨åæ¯åäº, åæ¶æ¨éå°è¿ç¨ä»åºç´æ¥ï¼git pushï¼ä¸éè¦æå®è¿ç¨ä»åº
$ git remote show origin
$ git describe --tags --abbrev=0
$ git commit --amend --author='Author Name <email@address.com>'
$ git remote add origin <remote-url>
$ git remote -v
$ git checkout <stash@{n}> -- <file-path>
$ git ls-files -t
$ git ls-files --others
$ git ls-files --others -i --exclude-standard
$ git bundle create <file> <branch-name>
$ git clone repo.bundle <repo-dir> -b <branch-name>
æ°å»ºä¸ä¸ªåæ¯ï¼åæ¯å
容就æ¯ä¸é¢ git bundle create å½ä»¤å¯¼åºçå
容
$ git rebase --autostash
$ git fetch origin pull/<id>/head:<branch-name>
$ git diff --word-diff
$ git clean -X -f
$ git status --ignored
$ git checkout --orphan <branch-name>
ç¸å½äºä¿åä¿®æ¹ï¼ä½æ¯éå commit åå²
$ git show <branch-name>:<file-name>
$ git clone --depth=1 https://github.com/user/repo.git
åªä¼ clone æè¿ä¸æ¬¡æäº¤ï¼å°åå° clone æ¶é´
å ³é track æå®æä»¶çæ¹å¨ï¼ä¹å°±æ¯ Git å°ä¸ä¼å¨è®°å½è¿ä¸ªæä»¶çæ¹å¨
git update-index --assume-unchanged path/to/file
æ¢å¤ track æå®æä»¶çæ¹å¨
git update-index --no-assume-unchanged path/to/file
git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads
ææ°çæ¾å¨æä¸é¢
git reset <file-name>
䏿·»å åæ°ï¼é»è®¤æ¯ -mixed
# 对äºä½¿ç¨ git@ åè®®çï¼å¯ä»¥é
ç½® socks5 代ç
# macOS ç³»ç»ç¼è¾ ~/.ssh/config æä»¶ï¼æ·»å è¿å è¡ï¼è®¾ç½® github 代ç
Host github.com
ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p
è®¾ç½®ä¸æ¸¸ä»åº
$ git remote add upstream https://github.com/jaywcjlove/reference.git
æ¬å°é¡¹ç®æä½
$ git fetch upstream # è·å䏿¸¸ä»åºæ´æ°
$ git stach # æåæ¬å°ä¿®æ¹(妿æ)
$ git branch -a # ååºææè¿ç¨ä»åºå°å(éå¿
é¡»)
$ git rebase remotes/upstream/main # 使ç¨è¿ç¨ä»åºçæäº¤è®°å½æ¥éåæ¬å°æäº¤è®°å½
$ git push -f # å¼ºå¶æ¨éå°è¿ç¨(github)ä»åº
$ git stach pop # æ¢å¤æåçæ¬å°ä¿®æ¹(妿æ)
username éè¦æ¹æèªå·±çgit log --author="username" --pretty=tformat: --numstat | awk \
'{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -
git log --format='%aN' | sort -u |\
while read name; do echo -en "$name\t";\
git log --author="$name" --pretty=tformat: --numstat | awk \
'{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done
è¿éæ¯æåååï¼ä¹å¯ä»¥æ´æ¹æå
git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 10
git log --oneline | wc -l
$ git blame <file-name>
blame çææä¸ºè´£æªï¼ä½ æçã
$ git whatchanged --since='2 weeks ago'
$ git log --all --grep='<given-text>'
éè¿ grep æ¥æ¾ï¼given-text: æéè¦æ¥æ¾çåæ®µ
$ git ls-files | xargs -r du -hs
$ git count-objects -vH
$ git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | awk '/^blob/ {print substr($0,6)}' | sort --numeric-sort --key=2 --reverse | head -n 10 | cut -c 13-
<type>(<scope>): <short summary>
â â â
â â ââ⫸ ç´§åç®ççæè¿°ï¼æ é大åï¼ä¹ä¸éè¦ç¨å¥å·ç»å°¾
â â
â ââ⫸ Commit èå´: animations|bazel|benchpress|common|compiler|compiler-cli|core|
â elements|forms|http|language-service|localize|platform-browser|
â platform-browser-dynamic|platform-server|router|service-worker|
â upgrade|zone.js|packaging|changelog|docs-infra|migrations|ngcc|ve|
â devtools....
â
ââ⫸ Commit ç±»å: build|ci|doc|docs|feat|fix|perf|refactor|test
website|chore|style|type|revert
| ç±»å | æè¿° |
|---|---|
feat: | æ°ç¹æ§ |
fix(scope): | ä¿®å¤ scope ä¸ç Bug |
feat!: / feat(scope)!: | breaking change / éæ API |
chore(deps): | æ´æ°ä¾èµ |
| ç±»å | æè¿° |
|---|---|
build: | åæ´å½±åçæ¯æå»ºç³»ç»æè å¤é¨ä¾èµ (å¦: gulp, npm) |
ci: | ä¿®æ¹äº CI é ç½®æä»¶æèæ¬ (å¦: Github Action, Travis) |
chore: | ãéè¦ã åæ´ä¸å½±åæºä»£ç ææµè¯ï¼å¦æ´æ°äºè¾ å©å·¥å ·ãåºç) |
docs: | åªä¿®æ¹äºææ¡£ |
feat: | ãéè¦ã ä¸ä¸ªæ°ç¹æ§ |
fix: | ãéè¦ã ä¿®å¤äºä¸ä¸ª Bug |
perf: | å¢å¼ºæ§è½ç代ç åæ´ |
refactor: | å¹¶éä¿®å¤ Bug ææ·»å æ°ç¹æ§ç代ç åæ´ |
revert: | åé代ç |
style: | åæ´ä¸å½±åä¸äºææä¹ç代ç (å¦: å é¤ç©ºæ ¼ãæ ¼å¼å代ç ãæ·»å åå·ç) |
test: | æ·»å æµè¯ä»£ç æä¿®æ£å·²æçæµè¯ |
$ git diff commit_id > my.patch
æ£æ¥è¡¥ä¸
# æ£æ¥ä¸è¿ä¸ªè¡¥ä¸è½å¦è¢«æ£å¸¸åºç¨
$ git apply --check path/to/my.patch
使ç¨è¡¥ä¸
# æ£æ¥éè¿ä½¿ç¨è¯¥è¡¥ä¸
$ git apply < path/to/my.patch
è¥æå²çªåè§£å³
# æ£æ¥ä¸éè¿å¯ä»¥èªå¨åå
¥patchä¸å²çªç代ç ï¼åæ¶ä¿çå²çªé¨å
$ git apply --reject path/to/my.patch
# å建æå® commit sha1 id ä¹åç n 次æäº¤è¡¥ä¸
$ git format-patch commit_id -n
# å建 300f59991f22826c8478f0c019387c4ca815b085 è¿ä¸ªæäº¤çpatch
$ git format-patch commit_id -1
# æåå½å忝æä¸é¢ç3次æäº¤ï¼çæè¡¥ä¸
$ git format-patch -3
# åéè
å¯ä½¿ç¨ git-send-email åé git format-patch çç»æç»æ¥æ¶è
# æ¥æ¶è
ä¿åé®ä»¶å°æä»¶ email.txtï¼ç¶ååºç¨è¡¥ä¸å建ä¸ä¸ªæäº¤ï¼ä¼èªå¨å
å«ä½è
çä¿¡æ¯
$ git am < email.txt