一篇文章,教你學會Git

在平常工做中,常常會用到Git操做。可是對於新人來說,剛上來對Git很陌生,操做起來也很懵逼。本篇文章主要針對剛開始接觸Git的新人,理解Git的基本原理,掌握經常使用的一些命令。git

1、Git工做流程程序員

一篇文章,教你學會Git

 

image架構

以上包括一些簡單而經常使用的命令,可是先不關心這些,先來了解下面這4個專有名詞。分佈式

  • Workspace:工做區
  • Index / Stage:暫存區
  • Repository:倉庫區(或本地倉庫)
  • Remote:遠程倉庫

工做區微服務

程序員進行開發改動的地方,是你當前看到的,也是最新的。源碼分析

日常咱們開發就是拷貝遠程倉庫中的一個分支,基於該分支進行開發。在開發過程當中就是對工做區的操做。性能

暫存區學習

若是想學習Java工程化、高性能及分佈式、深刻淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友能夠加個人Java高級交流:787707172,羣裏有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給你們。spa

.git目錄下的index文件, 暫存區會記錄git add添加文件的相關信息(文件名、大小、timestamp...),不保存文件實體, 經過id指向每一個文件實體。可使用git status查看暫存區的狀態。暫存區標記了你當前工做區中,哪些內容是被git管理的。3d

當你完成某個需求或功能後須要提交到遠程倉庫,那麼第一步就是經過git add先提交到暫存區,被git管理。

本地倉庫

保存了對象被提交 過的各個版本,比起工做區和暫存區的內容,它要更舊一些。

git commit後同步index的目錄樹到本地倉庫,方便從下一步經過git push同步本地倉庫與遠程倉庫的同步。

遠程倉庫

遠程倉庫的內容可能被分佈在多個地點的處於協做關係的本地倉庫修改,所以它可能與本地倉庫同步,也可能不一樣步,可是它的內容是最舊的。

小結

  1. 任何對象都是在工做區中誕生和被修改;
  2. 任何修改都是從進入index區纔開始被版本控制;
  3. 只有把修改提交到本地倉庫,該修改才能在倉庫中留下痕跡;
  4. 與協做者分享本地的修改,能夠把它們push到遠程倉庫來共享。

下面這幅圖更加直接闡述了四個區域之間的關係,可能有些命令不太清楚,不要緊,下部分會詳細介紹。

一篇文章,教你學會Git

 

image

2、經常使用Git命令

一篇文章,教你學會Git

 

image

網上找了個圖,別人整理的一張圖,很全很好,借來用下。下面詳細解釋一些經常使用命令。

HEAD

一篇文章,教你學會Git

 

image

在掌握具體命令前,先理解下HEAD。

HEAD,它始終指向當前所處分支的最新的提交點。你所處的分支變化了,或者產生了新的提交點,HEAD就會跟着改變。

add

一篇文章,教你學會Git

 

一篇文章,教你學會Git

 

commit

 

一篇文章,教你學會Git

 

 

commit相關命令也很簡單,主要實現將暫存區的內容提交到本地倉庫,並使得當前分支的HEAD向後移動一個提交點。

一篇文章,教你學會Git

 

branch

 

一篇文章,教你學會Git

 

 

涉及到協做,天然會涉及到分支,關於分支,大概有展現分支,切換分支,建立分支,刪除分支這四種操做。

一篇文章,教你學會Git

 

關於分支的操做雖然比較多,但都比較簡單好記。

merge

 

一篇文章,教你學會Git

 

 

merge命令把不一樣的分支合併起來。如上圖,在實際開放中,咱們可能從master分支中切出一個分支,而後進行開發完成需求,中間通過R3,R4,R5的commit記錄,最後開發完成須要合入master中,這便用到了merge。

一篇文章,教你學會Git

 

通常在merge以後,會出現conflict,須要針對衝突狀況,手動解除衝突。主要是由於兩個用戶修改了同一文件的同一塊區域。以下圖所示,須要手動解除。

 

一篇文章,教你學會Git

 

 

rebase

 

一篇文章,教你學會Git

 

 

rebase又稱爲衍合,是合併的另一種選擇。

在開始階段,咱們處於new分支上,執行git rebase dev,那麼new分支上新的commit都在master分支上重演一遍,最後checkout切換回到new分支。這一點與merge是同樣的,合併先後所處的分支並無改變。git rebase dev,通俗的解釋就是new分支想站在dev的肩膀上繼續下去。rebase也須要手動解決衝突。

rebase與merge的區別

如今咱們有這樣的兩個分支,test和master,提交以下:

D---E test
 /
A---B---C---F master複製代碼

在master執行git merge test,而後會獲得以下結果:

D--------E
 / 
A---B---C---F----G test, master複製代碼

在master執行git rebase test,而後獲得以下結果:

A---B---D---E---C'---F' test, master複製代碼

能夠看到,merge操做會生成一個新的節點,以前的提交分開顯示。而rebase操做不會生成新的節點,是將兩個分支融合成一個線性的提交。

若是你想要一個乾淨的,沒有merge commit的線性歷史樹,那麼你應該選擇git rebase

若是想學習Java工程化、高性能及分佈式、深刻淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友能夠加個人Java高級交流:787707172,羣裏有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給你們。

若是你想保留完整的歷史記錄,而且想要避免重寫commit history的風險,你應該選擇使用git merge

reset

一篇文章,教你學會Git

 

reset命令把當前分支指向另外一個位置,而且相應的變更工做區和暫存區。

一篇文章,教你學會Git

 

revert

一篇文章,教你學會Git

 

git revert用一個新提交來消除一個歷史提交所作的任何修改。

revert與reset的區別

一篇文章,教你學會Git

 

  • git revert是用一次新的commit來回滾以前的commit,git reset是直接刪除指定的commit。
  • 在回滾這一操做上看,效果差很少。可是在往後繼續merge之前的老版本時有區別。由於git revert是用一次逆向的commit「中和」以前的提交,所以往後合併老的branch時,致使這部分改變不會再次出現,減小衝突。可是git reset是之間把某些commit在某個branch上刪除,於是和老的branch再次merge時,這些被回滾的commit應該還會被引入,產生不少衝突。關於這一點,不太理解的能夠看這篇文章。
  • git reset 是把HEAD向後移動了一下,而git revert是HEAD繼續前進,只是新的commit的內容和要revert的內容正好相反,可以抵消要被revert的內容。

push

上傳本地倉庫分支到遠程倉庫分支,實現同步。

一篇文章,教你學會Git

 

其餘命令

一篇文章,教你學會Git

 

以上就是關於Git的一些經常使用命令及詳細闡述,相信能對Git有一個初步的認識。

歡迎工做一到八年的Java工程師朋友們加入Java高級交流:787707172

本羣提供免費的學習指導 架構資料 以及免費的解答

不懂得問題均可以在本羣提出來 以後還會有直播平臺和講師直接交流噢

相關文章
相關標籤/搜索