當前位置:
首頁 > 知識 > 一篇文章,教你學會Git

一篇文章,教你學會Git

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

一、Git工作流程

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

Workspace:工作區

Index / Stage:暫存區

Repository:倉庫區(或本地倉庫)

Remote:遠程倉庫

工作區

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

平常我們開發就是拷貝遠程倉庫中的一個分支,基於該分支進行開發。在開發過程中就是對工作區的操作。

暫存區

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

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

本地倉庫

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

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

遠程倉庫

遠程倉庫的內容可能被分布在多個地點的處於協作關係的本地倉庫修改,因此它可能與本地倉庫同步,也可能不同步,但是它的內容是最舊的。

小結

任何對象都是在工作區中誕生和被修改;

任何修改都是從進入index區才開始被版本控制;

只有把修改提交到本地倉庫,該修改才能在倉庫中留下痕迹;

與協作者分享本地的修改,可以把它們push到遠程倉庫來共享。

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

二、常用Git命令

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

HEAD

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

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

add

add相關命令很簡單,主要實現將工作區修改的內容提交到暫存區,交由git管理。

commit

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

branch

涉及到協作,自然會涉及到分支,關於分支,大概有展示分支,切換分支,創建分支,刪除分支這四種操作。

merge

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

一般在merge之後,會出現conflict,需要針對衝突情況,手動解除衝突。主要是因為兩個用戶修改了同一文件的同一塊區域。如下圖所示,需要手動解除。

rebase

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

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

rebase與merge的區別

現在我們有這樣的兩個分支,test和master,提交如下:

在master執行git merge test,然後會得到如下結果:

在master執行git rebase test,然後得到如下結果:

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

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

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

reset

reset命令把當前分支指向另一個位置,並且相應的變動工作區和暫存區。

revert

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

revert與reset的區別

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有一個初步的認識。

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 優才學院 的精彩文章:

困擾程序員的30種軟體開發問題,你是否時曾相識?
「殺一個程序員祭天」什麼鬼
七夕將至,你的「對象」還好嗎?
面試官問:PC端與移動端在UI設計方面什麼區別
vue快速入門的三個小實例

TAG:優才學院 |

您可能感興趣

一篇文章學懂Shell腳本,最簡明的教程在這裡
一篇文章教會你 Event loop——瀏覽器和 Node
一篇文章學會使用 Android IPC 多進程
一篇文章搞定Markdown
學習 HTML5 Canvas 這一篇文章就夠了
一篇文章掌握Gradle多項目構建
這是一篇科普文章—kǒng lóng
BMC Materials 副主編崔文國:我希望每一篇文章都能給研究人員帶來啟發
一篇文章踩遍Python中的坑
最全的Excel公式入門教程,一篇文章學會excel就夠了!
這篇文章,要給大家介紹一位美女,她叫Paola Antonini
一篇文章教你如何用 Python 記錄日誌
一篇文章讀懂Python賦值與拷貝
柑橘屬的歷史,就在Nature的這篇文章里
一篇文章帶你了解Https加密
轟動性成果,6篇Nature Genetics及2篇Nature Biotec文章同時闡述棉花基因組學進展
Oculus 聯合創始人發表博客文章:Magic Leap 就是一個悲劇
每日摘要:兩篇Nature Genetics玉米基因組文章
上乾貨!一篇文章匯總Tophatter最新賣家工具與銷售tips
一篇文章帶你了解運維重器 Tencent Hub