玩轉Git

玩轉Git

前言


本文不是向你們介紹git怎麼安裝,怎麼關聯遠程倉庫,不對比SVN等不一樣版本管理器之間的差別,不羅列如git pull, git push, git commit 等使用git的基本姿式。結合我的平時在使用git中的一些經驗,給你們分享一些咱們在版本管理當中常常會遇到的場景及可使用的git操做。html

可能你會說,我在ide當中安裝git插件,想怎麼用就怎麼用,想什麼姿式就什麼姿式,還須要知道這些繁瑣的指令碼?git

當你熟悉命令行操做以後,你會發現它遠比插件控件操做快速許多,而且會讓你對git的瞭解更深一層。app


Git倉庫結構



要使用git,首先咱們須要簡單瞭解一個git倉庫的基本結構。當將咱們的項目初始化爲一個git工程後,咱們能夠簡單的將本地倉庫分紅三部分:ide


  1. git管理的整個工程被稱爲工做區(workspace)。
  2. 當咱們使用git add後,咱們選擇的改動文件會被添加到暫存區,(stage)以備後續進行提交。
  3. 當咱們使用git commit後,一個新的版本(version)就生成了,git版本線又向前推動了一步。


分支交互


對於分支(branch)的一切操做,咱們能夠簡化爲四個分支之間的交互。 優化


版本交互的第一原則是分支交互之間的清晰,拒絕進行本地和遠程分支之間的交叉行爲,如本地分支 A 拉取遠程分支 B 此種操做,如此會致使分支之間內容混亂。ui


指令

git stash 


當你正在火熱的作一個新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查看歷史修改時候,是否是很頭疼內容太多,找不到咱們要看的重點? 不用擔憂,可使用增強版。


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 diff  查看改動內容, 固然要在git add以前使用


git revert


我想要回滾到歷史的某個commit版本,該咋辦? 可使用溫柔的revert,加上commitid , 它不會影響你歷史的提交,只是將歷史的某個commit再次應用一遍。可是這樣操做太累贅,我想讓版本線乾淨一點怎麼辦?往下看


git reset


提交了好幾個版本,可是如今我要回滾,這咋辦?


git reset 【commitid】 將版本回滾到某個歷史commit,這個版本以後的全部改動依然保留。


git reset  【commitid】 --hard   乾乾淨淨的回滾到commitid版本,後面的改動我都不要了(用前請確認哦)。


git reset 會將當前版本回滾到某個指定版本,此後的提交都將會看不到。


git checkout


這裏不是說怎麼切分支!我對幾個文件作了一些改動,後來又想撤銷,怎麼辦?reset會所有撤銷的,但是我只想撤銷幾個文件的改動。


git checkout 【filename】 撤銷對於文件的更改,而且能夠同時撤銷多個文件更改。


git checkout .  加個點,可是更厲害,會將當前更改的文件所有撤銷,至關於git reset HEAD --hard ,用前確認。


git rebase 


每次我合完代碼,發現都會多一個commit,可是這個commit什麼改動內容都沒有,個人提交歷史就像是長了一個疙瘩,難受死強迫症。


git rebase 變基操做,和git merge一樣的使用方式,讓你的版本線不長疙瘩,可是兩個分支差別過大,rebase起來可能要比對的內容會有點多哦。


git rebase -i


一樣是rebase,爲何你能夠另起一行,只由於你真的太NP了。交互式變基操做,聽名字就很厲害。我發現好久前的一個commit不太合適,我想把它刪掉,怎麼辦?以前commit的message不合適,我想改下?


git rebase -i  修整你的版本歷史,就行修剪花叢的剪刀,有了它,你能夠花式優化提交歷史。(固然,不建議對歷史提交作大的改動)


git reflog


我發現本身回滾了錯誤的內容,仍是用的reset,以後的版本都找不到了,oh my god ?  不要慌,reflog 值得擁有,使用它,能夠查看到在當前工程所作的全部歷史操做,找到回滾前的版本commit,將回滾再回滾(有點繞),終於復原了。


git cherry-pick 


我想把hotfix分支改Bug的幾個commit合到dev分支,merge會長疙瘩,rebase操做起來要處理衝突,好麻煩。


git cherry-pick  能夠將工程當中,任何分支的任何commit拿(pick)當前分支。


git branch


git branch 查看本地分支

git branch  -r 查看遠程所有分支

git branch -a  查看本地和遠程的全部分支

git branch -vv  查看當前分支的來源 


git push origin -D


git push origin -D [originbranch]  刪除遠程分支,若是須要清理遠程分支,建議仍是在遠程倉庫中手動操做,從而方便確認。


git biset


項目出現了問題,可是代碼中很差肯定範圍,能夠嘗試 biset ,使用二分法快速定位錯誤。  


git biset start 【結束版本】 【起始版本】   找到一個確定不會有錯的歷史版本做爲起始版本,結束版本可使用HEAD(當前版本)

git biset good  認爲當前版本沒有復現問題

git biset bad  發現當前版本存在了問題

git biset reset 退出biset過程


阮老師詳細講解篇


結語


文中沒有對每一個指令的原理作詳細說明,旨在分享一些經常使用場景中可用的解決辦法。

相關文章
相關標籤/搜索