本文不是向你們介紹git怎麼安裝,怎麼關聯遠程倉庫,不對比SVN等不一樣版本管理器之間的差別,不羅列如git pull, git push, git commit 等使用git的基本姿式。結合我的平時在使用git中的一些經驗,給你們分享一些咱們在版本管理當中常常會遇到的場景及可使用的git操做。html
可能你會說,我在ide當中安裝git插件,想怎麼用就怎麼用,想什麼姿式就什麼姿式,還須要知道這些繁瑣的指令碼?git
當你熟悉命令行操做以後,你會發現它遠比插件控件操做快速許多,而且會讓你對git的瞭解更深一層。app
要使用git,首先咱們須要簡單瞭解一個git倉庫的基本結構。當將咱們的項目初始化爲一個git工程後,咱們能夠簡單的將本地倉庫分紅三部分:ide
對於分支(branch)的一切操做,咱們能夠簡化爲四個分支之間的交互。 優化
版本交互的第一原則是分支交互之間的清晰,拒絕進行本地和遠程分支之間的交叉行爲,如本地分支 A 拉取遠程分支 B 此種操做,如此會致使分支之間內容混亂。ui
當你正在火熱的作一個新Feature時,郵件中收到了提醒,又有討厭的Bug來煩人了,此時須要切換到hotfix分支改Bug,可是新功能作了一半又不適合提交新版本,該怎麼辦?spa
git stash 能夠幫助你把當前的修改存入到單獨的空間當中,使工做區乾乾淨淨,而後就能夠切換分支作其餘操做了。插件
git stash list 查看stash空間被存儲的內容命令行
git stash pop 應用stash空間的第一條內容,即上一次stash的內容cdn
git stash apply 應用stash空間的某一條存儲記錄
git stash save 能夠爲你的stash添加備註,標明stash的內容
git stash clear 清空stash空間的所有內容。(使用前確認,誤用追悔莫及)
使用git log查看歷史修改時候,是否是很頭疼內容太多,找不到咱們要看的重點? 不用擔憂,可使用增強版。
git log --patch 【commitid】 查看某一個commit版本的修改內容,一次定位。
git log --graph 查看git版本線,commit的歷史記錄,及分支間合併狀況
git log --oneline 若是嫌棄graph內容太多,交叉線看到頭暈,oneline 可讓信息更精簡
git log --grep 記得好久前我改過這個Bug,可是過久找不到了,只記得commit備註。不要緊,可使用grep搜索到具體的commit,you won't miss it。
打算提交前,我想看看我都改了些什麼,萬一改了不應改的地方怎麼辦?
git diff 查看改動內容, 固然要在git add以前使用
我想要回滾到歷史的某個commit版本,該咋辦? 可使用溫柔的revert,加上commitid , 它不會影響你歷史的提交,只是將歷史的某個commit再次應用一遍。可是這樣操做太累贅,我想讓版本線乾淨一點怎麼辦?往下看 ↓
提交了好幾個版本,可是如今我要回滾,這咋辦?
git reset 【commitid】 將版本回滾到某個歷史commit,這個版本以後的全部改動依然保留。
git reset 【commitid】 --hard 乾乾淨淨的回滾到commitid版本,後面的改動我都不要了(用前請確認哦)。
git reset 會將當前版本回滾到某個指定版本,此後的提交都將會看不到。
這裏不是說怎麼切分支!我對幾個文件作了一些改動,後來又想撤銷,怎麼辦?reset會所有撤銷的,但是我只想撤銷幾個文件的改動。
git checkout 【filename】 撤銷對於文件的更改,而且能夠同時撤銷多個文件更改。
git checkout . 加個點,可是更厲害,會將當前更改的文件所有撤銷,至關於git reset HEAD --hard ,用前確認。
每次我合完代碼,發現都會多一個commit,可是這個commit什麼改動內容都沒有,個人提交歷史就像是長了一個疙瘩,難受死強迫症。
git rebase 變基操做,和git merge一樣的使用方式,讓你的版本線不長疙瘩,可是兩個分支差別過大,rebase起來可能要比對的內容會有點多哦。
一樣是rebase,爲何你能夠另起一行,只由於你真的太NP了。交互式變基操做,聽名字就很厲害。我發現好久前的一個commit不太合適,我想把它刪掉,怎麼辦?以前commit的message不合適,我想改下?
git rebase -i 修整你的版本歷史,就行修剪花叢的剪刀,有了它,你能夠花式優化提交歷史。(固然,不建議對歷史提交作大的改動)
我發現本身回滾了錯誤的內容,仍是用的reset,以後的版本都找不到了,oh my god ? 不要慌,reflog 值得擁有,使用它,能夠查看到在當前工程所作的全部歷史操做,找到回滾前的版本commit,將回滾再回滾(有點繞),終於復原了。
我想把hotfix分支改Bug的幾個commit合到dev分支,merge會長疙瘩,rebase操做起來要處理衝突,好麻煩。
git cherry-pick 能夠將工程當中,任何分支的任何commit拿(pick)到當前分支。
git branch 查看本地分支
git branch -r 查看遠程所有分支
git branch -a 查看本地和遠程的全部分支
git branch -vv 查看當前分支的來源
git push origin -D [originbranch] 刪除遠程分支,若是須要清理遠程分支,建議仍是在遠程倉庫中手動操做,從而方便確認。
項目出現了問題,可是代碼中很差肯定範圍,能夠嘗試 biset ,使用二分法快速定位錯誤。
git biset start 【結束版本】 【起始版本】 找到一個確定不會有錯的歷史版本做爲起始版本,結束版本可使用HEAD(當前版本)
git biset good 認爲當前版本沒有復現問題
git biset bad 發現當前版本存在了問題
git biset reset 退出biset過程
文中沒有對每一個指令的原理作詳細說明,旨在分享一些經常使用場景中可用的解決辦法。