在日常工作中,經(jīng)常會用到Git操作。但是對于新人來講,剛上來對Git很陌生,操作起來也很懵逼。本篇文章主要針對剛開始接觸Git的新人,理解Git的基本原理,掌握常用的一些命令。
一、Git工作流程 
以上包括一些簡單而常用的命令,但是先不關(guān)心這些,先來了解下面這4個專有名詞。 工作區(qū) 程序員進(jìn)行開發(fā)改動的地方,是你當(dāng)前看到的,也是最新的。 平常我們開發(fā)就是拷貝遠(yuǎn)程倉庫中的一個分支,基于該分支進(jìn)行開發(fā)。在開發(fā)過程中就是對工作區(qū)的操作。 暫存區(qū) .git目錄下的index文件, 暫存區(qū)會記錄git add 添加文件的相關(guān)信息(文件名、大小、timestamp...),不保存文件實(shí)體, 通過id指向每個文件實(shí)體??梢允褂?code>git status查看暫存區(qū)的狀態(tài)。暫存區(qū)標(biāo)記了你當(dāng)前工作區(qū)中,哪些內(nèi)容是被git管理的。 當(dāng)你完成某個需求或功能后需要提交到遠(yuǎn)程倉庫,那么第一步就是通過git add 先提交到暫存區(qū),被git管理。 本地倉庫 保存了對象被提交 過的各個版本,比起工作區(qū)和暫存區(qū)的內(nèi)容,它要更舊一些。 git commit 后同步index的目錄樹到本地倉庫,方便從下一步通過git push 同步本地倉庫與遠(yuǎn)程倉庫的同步。
遠(yuǎn)程倉庫 遠(yuǎn)程倉庫的內(nèi)容可能被分布在多個地點(diǎn)的處于協(xié)作關(guān)系的本地倉庫修改,因此它可能與本地倉庫同步,也可能不同步,但是它的內(nèi)容是最舊的。 小結(jié) 任何對象都是在工作區(qū)中誕生和被修改; 任何修改都是從進(jìn)入index區(qū)才開始被版本控制; 只有把修改提交到本地倉庫,該修改才能在倉庫中留下痕跡; 與協(xié)作者分享本地的修改,可以把它們push到遠(yuǎn)程倉庫來共享。
下面這幅圖更加直接闡述了四個區(qū)域之間的關(guān)系,可能有些命令不太清楚,沒關(guān)系,下部分會詳細(xì)介紹。 
二、常用Git命令 
網(wǎng)上找了個圖,別人整理的一張圖,很全很好,借來用下。下面詳細(xì)解釋一些常用命令。 HEAD 
在掌握具體命令前,先理解下HEAD。 HEAD,它始終指向當(dāng)前所處分支的最新的提交點(diǎn)。你所處的分支變化了,或者產(chǎn)生了新的提交點(diǎn),HEAD就會跟著改變。 add 
add相關(guān)命令很簡單,主要實(shí)現(xiàn)將工作區(qū)修改的內(nèi)容提交到暫存區(qū),交由git管理。 git add . | 添加當(dāng)前目錄的所有文件到暫存區(qū) |
---|
git add <dir> | 添加指定目錄到暫存區(qū),包括子目錄 | git add <file1> | 添加指定文件到暫存區(qū) |
commit 
commit相關(guān)命令也很簡單,主要實(shí)現(xiàn)將暫存區(qū)的內(nèi)容提交到本地倉庫,并使得當(dāng)前分支的HEAD向后移動一個提交點(diǎn)。 git commit -m <message> | 提交暫存區(qū)到本地倉庫,message代表說明信息 |
---|
git commit <file1> -m <message> | 提交暫存區(qū)的指定文件到本地倉庫 | git commit --amend -m <message> | 使用一次新的commit,替代上一次提交 |
branch 
涉及到協(xié)作,自然會涉及到分支,關(guān)于分支,大概有展示分支,切換分支,創(chuàng)建分支,刪除分支這四種操作。 git branch | 列出所有本地分支 |
---|
git branch -r | 列出所有遠(yuǎn)程分支 | git branch -a | 列出所有本地分支和遠(yuǎn)程分支 | git branch <branch-name> | 新建一個分支,但依然停留在當(dāng)前分支 | git checkout -b <branch-name> | 新建一個分支,并切換到該分支 | git branch --track <branch><remote-branch> | 新建一個分支,與指定的遠(yuǎn)程分支建立追蹤關(guān)系 | git checkout <branch-name> | 切換到指定分支,并更新工作區(qū) | git branch -d <branch-name> | 刪除分支 | git push origin --delete <branch-name> | 刪除遠(yuǎn)程分支 |
關(guān)于分支的操作雖然比較多,但都比較簡單好記。 merge 
merge命令把不同的分支合并起來。如上圖,在實(shí)際開放中,我們可能從master分支中切出一個分支,然后進(jìn)行開發(fā)完成需求,中間經(jīng)過R3,R4,R5的commit記錄,最后開發(fā)完成需要合入master中,這便用到了merge。 git fetch <remote> | merge之前先拉一下遠(yuǎn)程倉庫最新代碼 |
---|
git merge <branch> | 合并指定分支到當(dāng)前分支 |
一般在merge之后,會出現(xiàn)conflict,需要針對沖突情況,手動解除沖突。主要是因?yàn)閮蓚€用戶修改了同一文件的同一塊區(qū)域。如下圖所示,需要手動解除。 
rebase 
rebase又稱為衍合,是合并的另外一種選擇。 在開始階段,我們處于new分支上,執(zhí)行git rebase dev ,那么new分支上新的commit都在master分支上重演一遍,最后checkout切換回到new分支。這一點(diǎn)與merge是一樣的,合并前后所處的分支并沒有改變。git rebase dev ,通俗的解釋就是new分支想站在dev的肩膀上繼續(xù)下去。rebase也需要手動解決沖突。 rebase與merge的區(qū)別 現(xiàn)在我們有這樣的兩個分支,test和master,提交如下: D---E test 在master執(zhí)行git merge test ,然后會得到如下結(jié)果: D--------E 在master執(zhí)行git rebase test ,然后得到如下結(jié)果: A---B---D---E---C'---F' test, master 可以看到,merge操作會生成一個新的節(jié)點(diǎn),之前的提交分開顯示。而rebase操作不會生成新的節(jié)點(diǎn),是將兩個分支融合成一個線性的提交。 如果你想要一個干凈的,沒有merge commit的線性歷史樹,那么你應(yīng)該選擇git rebase 如果你想保留完整的歷史記錄,并且想要避免重寫commit history的風(fēng)險,你應(yīng)該選擇使用git merge reset 
reset命令把當(dāng)前分支指向另一個位置,并且相應(yīng)的變動工作區(qū)和暫存區(qū)。 git reset —soft <commit> | 只改變提交點(diǎn),暫存區(qū)和工作目錄的內(nèi)容都不改變 |
---|
git reset —mixed <commit> | 改變提交點(diǎn),同時改變暫存區(qū)的內(nèi)容 | git reset —hard <commit> | 暫存區(qū)、工作區(qū)的內(nèi)容都會被修改到與提交點(diǎn)完全一致的狀態(tài) | git reset --hard HEAD | 讓工作區(qū)回到上次提交時的狀態(tài) |
revert 
git revert用一個新提交來消除一個歷史提交所做的任何修改。 revert與reset的區(qū)別 
git revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commit。 在回滾這一操作上看,效果差不多。但是在日后繼續(xù)merge以前的老版本時有區(qū)別。因?yàn)間it revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch時,導(dǎo)致這部分改變不會再次出現(xiàn),減少沖突。但是git reset是之間把某些commit在某個branch上刪除,因而和老的branch再次merge時,這些被回滾的commit應(yīng)該還會被引入,產(chǎn)生很多沖突。關(guān)于這一點(diǎn),不太理解的可以看這篇文章。 git reset 是把HEAD向后移動了一下,而git revert是HEAD繼續(xù)前進(jìn),只是新的commit的內(nèi)容和要revert的內(nèi)容正好相反,能夠抵消要被revert的內(nèi)容。
push 上傳本地倉庫分支到遠(yuǎn)程倉庫分支,實(shí)現(xiàn)同步。 git push <remote><branch> | 上傳本地指定分支到遠(yuǎn)程倉庫 |
---|
git push <remote> --force | 強(qiáng)行推送當(dāng)前分支到遠(yuǎn)程倉庫,即使有沖突 | git push <remote> --all | 推送所有分支到遠(yuǎn)程倉庫 |
其他命令 git status | 顯示有變更的文件 |
---|
git log | 顯示當(dāng)前分支的版本歷史 | git diff | 顯示暫存區(qū)和工作區(qū)的差異 | git diff HEAD | 顯示工作區(qū)與當(dāng)前分支最新commit之間的差異 | git cherry-pick <commit> | 選擇一個commit,合并進(jìn)當(dāng)前分支 |
以上就是關(guān)于Git的一些常用命令及詳細(xì)闡述,相信能對Git有一個初步的認(rèn)識。
|