原文:Git 常用命令
從設(shè)計轉(zhuǎn)型開發(fā)的第一天起,老大只教我一件事葫录,使用 Git诉稍。
比起一上來就給我各種任務(wù)寫 HTML/CSS/JS 調(diào)各種 Bug, 讓我熟練掌握 Git 這件事至今我都非常感激。
毫無疑問地說灯萍,Git 是當今編程學(xué)習(xí)里最基本的必備技能。
我記得很清楚每聪,當時我問他旦棉,假如全世界的工具你只能保留一個在電腦齿风,你的選擇是什么?
Git绑洛,老大很肯定地回答救斑,當時我很不解。
3 年后真屯,如果現(xiàn)在要我回答這個問題脸候,我會給出同樣的答案。
Git 的強大一本書都不足以全部說明绑蔫,更何況一篇博客运沦。
本文記錄了我 3 年來使用 Git 最頻繁的命令(不包括最基本的add/commit/push/pull等),
很負責地說配深,學(xué)會這些基本也就能快樂地玩轉(zhuǎn) Git 了 (持續(xù)整理更新中)携添。
Hope you enjoy!
1. 超實用 Alias
alias g="git"
alias gb="git branch"
alias gco="git checkout"
alias gcmsg="git commit -m"
alias gamend="git commit --amend -C HEAD"
alias gst="git status"
alias log="git log --oneline --graph --decorate --color=always"
alias logg="git log --graph --all --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(bold white)— %an%C(reset)%C(bold yellow)%d%C(reset)' --abbrev-commit --date=relative"
2. 取回遠端 master
與本地 master
分支合并
gco master
g fetch --all 或者
g fetch origin master
g reset --hard origin/master(本地沒有修改,所以完全覆蓋也沒關(guān)系) 或者
g rebase origin/master(本地有修改還沒push)
3. 推送分支到遠端
假設(shè)現(xiàn)在所在的分支是import
凉馆,指定推送到遠端分支liujin-import
g push origin import:liujin-import
假如遠端的 liujin-import
分支已經(jīng)不需要薪寓,可以直接覆蓋掉
g push -f origin import:liujin-import
4. 追加文件到某個 commit
有時候修完某功能并提交了 commit 之后才發(fā)現(xiàn)還有一點小修改,這時候又不想再提交一個commit澜共,可以追加這個文件到前一個commit向叉,步驟如下:
git add 你要追加修改的文件
git commit --amend -C HEAD 或者 gamend
5. 查找包含某文件的 commit
git log 文件路徑
git show commit_id
或者
git log --follow filename(絕對路徑)
Ref: List all commit for a specific file
6. 把一個 commit 分拆為兩個 commit
老大常說要養(yǎng)成一個小改動對應(yīng)一個commit的習(xí)慣,但是有時候?qū)懙锰珌y懶得去分割就把很多改動做成了一個commit嗦董,這樣子增加了以后維護的難度母谎,所以要把一個 commit 分拆為多個 commit 怎么辦呢?
- 首先把你要分拆的 file reset 了:
git reset HEAD~1 path/to/file
# This doesn't delete your changes to path/to/file
- 接著修改當前這個 commit 的 message京革,命令是:
git commit --amend -v
# -v參數(shù)是打開editor編輯
- 然后就可以把 reset 出來那個 file 新建一個 commit奇唤,命令是:
git commit -v path/to/file
這樣就把一個 commit 分拆為兩個啦,_
7. 刪除某些 commit
git rebase -i HEAD~10
8. 追加修改到之前某個 commit
假如 gst
發(fā)現(xiàn)已經(jīng)有文件被修改匹摇,這時候需要把修改暫存起來咬扇。
git stash
接著找到你需要追加修改的那個commit id,如4b739bb
g rebase 4b739bb~ -i 或者
g rebase -i HEAD~5 #列出最近5個commit
這時候會自動打開編輯器廊勃,把你需要修改的 commit 前面的 pick
改成 edit
懈贺,保存,關(guān)閉編輯器坡垫,這時候會回到終端梭灿,再輸入:
g stash pop
把暫存的修改讀出來,然后做修改冰悠,g add .
堡妒,最后
g rebase --continue
9. 查找含有特定關(guān)鍵字的 commit
git log --grep
最基本的用法git log --grep=frotz --grep=nitfol --since=1.month
查找一個月以內(nèi)commit log message里含有frotz
或者nitfol
的 commitsgit log --grep=frotz --author=Linus
查找指定作者git grep -l -e frotz --and -e nitfol
查找同一行含有frotz
和nitfol
的文件git grep -l --all-match -e frotz -e nitfol
查找文件里面含有frotz
和nitfol
的文件(不局限于同一行)
10. 清空 git working copy 還沒追蹤的文件
git clean -f
git clean -f -d
如果還想刪除目錄git clean -f -X
如果只是想刪除忽略的文件git clean -f -x
如果想刪除忽略和非忽略的文件
11. 清理本地倉庫
長時間做一個項目,經(jīng)常需要 git fetch
溉卓,這樣做每次都會拉回遠端的全部分支皮迟。
即使遠端有些分支已經(jīng)刪除搬泥,但是運行git branch -a
還是會顯示已刪除的分支,
長時間下來這個列表就會很長很長万栅,這時候就需要清理一下本地的倉庫了:
git remote prune origin
# `prune`會刪除任何不存在于遠端倉庫的分支佑钾,這樣運行 `git branch -a`命令的時候頓時就清靜了
12. 創(chuàng)建追蹤遠端分支的本地分支
gb dev origin/r1-dev
#Branch dev set up to track remote branch r1-dev from origin.
13. 分支移動
g branch -f master HEAD~3
# 把 master 分支強制移到 HEAD 前面第三個 commit
14. Revert一個 Merge
git revert -m 1 M
-> W
---o---o---o---M---x---x---W
/
---A---B
15. 獲取短的 commit hash
git rev-parse --short HEAD
16. commit 了以后才記起來忘了創(chuàng)建 .gitignore
, 垃圾文件都已經(jīng)提交
比如說一個nodejs項目,一開始的時候就忘記了創(chuàng)建.gitnore
文件忽略掉node_modules
的內(nèi)容烦粒,所以其中的內(nèi)容就已經(jīng)被提交了休溶。
即使緊接著你在.gitignore
加了一行node_modules
, 已經(jīng)被提交的文件是不會自動刪除的。
這時候你就需要做的就是:
git rm --cached path/to/ignored
#nodejs案例就是
git rm -r --cached node_modules
17. 提交所有被刪除的文件
$ git add -u
這個命令告訴 git 自動更新已跟蹤的文件, 包括被刪除的已跟蹤文件扰她。
如果你用的是 git 2.0
$ git add -u :/
友情提示:從 git 2.0(2013年中)開始兽掰,以上命令會 stage 整個 working tree 的文件。
如果你只是想 stage 當前目錄的文件徒役,應(yīng)該這么用:
$ git add -u .
詳情可以去搜 "“git add -A” 和 “git add .” 的區(qū)別".
Ref: StackOverflow
18. 撤銷上一次 git add .
操作
這種情況通常是因為忘記添加.gitignore
文件孽尽,或者一時手快把一些非必要的文件(如node_modules
)跟蹤了, 解決辦法:
git reset
該命令會 unstage 你上一個 commit 增加的所有文件。
如果你只想 unstage 某些文件:
git reset -- <file 1> <file 2> <file n>
還可以 unstage 文件里某處的改動:
git reset -p