原文:Git 經常使用命令node
從設計轉型開發的第一天起,老大隻教我一件事,使用 Git。
比起一上來就給我各類任務寫 HTML/CSS/JS 調各類 Bug, 讓我熟練掌握 Git 這件事至今我都很是感激。
毫無疑問地說,Git 是當今編程學習裏最基本的必備技能。git
我記得很清楚,當時我問他,假如全世界的工具你只能保留一個在電腦,你的選擇是什麼?
Git,老大很確定地回答,當時我很不解。
3 年後,若是如今要我回答這個問題,我會給出一樣的答案。編程
Git 的強大一本書都不足以所有說明,更況且一篇博客。
本文記錄了我 3 年來使用 Git 最頻繁的命令(不包括最基本的add/commit/push/pull等),
很負責地說,學會這些基本也就能快樂地玩轉 Git 了 (持續整理更新中)。bash
Hope you enjoy!編輯器
bashalias 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"
master
與本地 master
分支合併bashgco master g fetch --all 或者 g fetch origin master g reset --hard origin/master(本地沒有修改,因此徹底覆蓋也不要緊) 或者 g rebase origin/master(本地有修改還沒push)
假設如今所在的分支是import
,指定推送到遠端分支liujin-import
工具
bashg push origin import:liujin-import
假如遠端的 liujin-import
分支已經不須要,能夠直接覆蓋掉學習
bashg push -f origin import:liujin-import
有時候修完某功能並提交了 commit 以後才發現還有一點小修改,這時候又不想再提交一個commit,能夠追加這個文件到前一個commit,步驟以下:fetch
bashgit add 你要追加修改的文件 git commit --amend -C HEAD 或者 gamend
git log 文件路徑 git show commit_id
或者設計
git log --follow filename(絕對路徑)
Ref: List all commit for a specific filecode
老大常說要養成一個小改動對應一個commit的習慣,可是有時候寫得太亂懶得去分割就把不少改動作成了一個commit,這樣子增長了之後維護的難度,因此要把一個 commit 分拆爲多個 commit 怎麼辦呢?
git reset HEAD~1 path/to/file # This doesn't delete your changes to path/to/file
git commit --amend -v # -v參數是打開editor編輯
git commit -v path/to/file
這樣就把一個 commit 分拆爲兩個啦,^_^
git rebase -i HEAD~10
假如 gst
發現已經有文件被修改,這時候須要把修改暫存起來。
git stash
接着找到你須要追加修改的那個commit id,如4b739bb
g rebase 4b739bb~ -i 或者 g rebase -i HEAD~5 #列出最近5個commit
這時候會自動打開編輯器,把你須要修改的 commit 前面的 pick
改爲 edit
,保存,關閉編輯器,這時候會回到終端,再輸入:
g stash pop
把暫存的修改讀出來,而後作修改,g add .
,最後
g rebase --continue
git log --grep
git log --grep=frotz --grep=nitfol --since=1.month
查找一個月之內commit log message裏含有 frotz
或者 nitfol
的 commits
git 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
的文件(不侷限於同一行)
git clean -f
git clean -f -d
若是還想刪除目錄
git clean -f -X
若是隻是想刪除忽略的文件
git clean -f -x
若是想刪除忽略和非忽略的文件
長時間作一個項目,常常須要 git fetch
,這樣作每次都會拉回遠端的所有分支。
即便遠端有些分支已經刪除,可是運行git branch -a
仍是會顯示已刪除的分支,
長時間下來這個列表就會很長很長,這時候就須要清理一下本地的倉庫了:
bashgit remote prune origin # `prune`會刪除任何不存在於遠端倉庫的分支,這樣運行 `git branch -a`命令的時候頓時就清靜了
bashgb dev origin/r1-dev #Branch dev set up to track remote branch r1-dev from origin.
bashg branch -f master HEAD~3 # 把 master 分支強制移到 HEAD 前面第三個 commit
git revert -m 1 M
-> W
---o---o---o---M---x---x---W / ---A---B
bashgit rev-parse --short HEAD
.gitignore
, 垃圾文件都已經提交好比說一個nodejs項目,一開始的時候就忘記了建立.gitnore
文件忽略掉node_modules
的內容,因此其中的內容就已經被提交了。
即便緊接着你在.gitignore
加了一行node_modules
, 已經被提交的文件是不會自動刪除的。
這時候你就須要作的就是:
bashgit rm --cached path/to/ignored #nodejs案例就是 git rm -r --cached node_modules
$ git add -u
這個命令告訴 git 自動更新已跟蹤的文件, 包括被刪除的已跟蹤文件。
若是你用的是 git 2.0
$ git add -u :/
友情提示:從 git 2.0(2013年中)開始,以上命令會 stage 整個 working tree 的文件。
若是你只是想 stage 當前目錄的文件,應該這麼用:
$ git add -u .
詳情能夠去搜 "「git add -A」 和 「git add .」 的區別".
Ref: StackOverflow
git add .
操做這種狀況一般是由於忘記添加.gitignore
文件,或者一時手快把一些非必要的文件(如node_modules
)跟蹤了, 解決辦法:
bashgit reset
該命令會 unstage 你上一個 commit 增長的全部文件。
若是你只想 unstage 某些文件:
git reset -- <file 1> <file 2> <file n>
還能夠 unstage 文件裏某處的改動:
git reset -p