天天看點

git commit指令如何送出一個指定檔案_Git常用指令總結

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

一、Git工作流程

工作區

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

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

暫存區

.git目錄下的index檔案, 暫存區會記錄git add添加檔案的相關資訊(檔案名、大小、timestamp...),不儲存檔案實體, 通過id指向每個檔案實體。可以使用git status檢視暫存區的狀态。暫存區标記了你目前工作區中,哪些内容是被git管理的。

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

本地倉庫

儲存了對象被送出 過的各個版本,比起工作區和暫存區的内容,它要更舊一些。

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

遠端倉庫

遠端倉庫的内容可能被分布在多個地點的處于協作關系的本地倉庫修改,是以它可能與本地倉庫同步,也可能不同步,但是它的内容是最舊的。

小結

  1. 任何對象都是在工作區中誕生和被修改;
  2. 任何修改都是從進入index區才開始被版本控制;
  3. 隻有把修改送出到本地倉庫,該修改才能在倉庫中留下痕迹;
  4. 與協作者分享本地的修改,可以把它們push到遠端倉庫來共享。

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

git commit指令如何送出一個指定檔案_Git常用指令總結

二、常用git指令

HEAD

git commit指令如何送出一個指定檔案_Git常用指令總結

在掌握具體指令前,先了解下HEAD。

HEAD,它始終指向目前所處分支的最新的送出點。你所處的分支變化了,或者産生了新的送出點,HEAD就會跟着改變。

add

add相關指令很簡單,主要實作将工作區修改的内容送出到暫存區,交由git管理。

git add .
           

添加目前目錄的所有檔案到暫存區

git add 
           

添加指定目錄到暫存區,包括子目錄

git add 
           

添加指定檔案到暫存區

commit

commit相關指令也很簡單,主要實作将暫存區的内容送出到本地倉庫,并使得目前分支的HEAD向後移動一個送出點。

git commit -m 
           

送出暫存區到本地倉庫,message代表說明資訊

git commit  -m 
           

送出暫存區的指定檔案到本地倉庫

git commit --amend -m 
           

使用一次新的commit,替代上一次送出

branch

git commit指令如何送出一個指定檔案_Git常用指令總結

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

git branch
           

列出所有本地分支

git branch -r
           

列出所有遠端分支

git branch -a
           

列出所有本地分支和遠端分支

git branch 
           

建立一個分支,但依然停留在目前分支

git checkout -b 
           

建立一個分支,并切換到該分支

git branch --track 
           

建立一個分支,與指定的遠端分支建立追蹤關系

git checkout 
           

切換到指定分支,并更新工作區

git branch -d 
           

删除分支

git push origin --delete 
           

删除遠端分支

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

merge

git commit指令如何送出一個指定檔案_Git常用指令總結

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

git fetch 
           

merge之前先拉一下遠端倉庫最新代碼

git merge 
           

合并指定分支到目前分支

一般在merge之後,會出現conflict,需要針對沖突情況,手動解除沖突。主要是因為兩個使用者修改了同一檔案的同一塊區域。

rebase

git commit指令如何送出一個指定檔案_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

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

reset

git commit指令如何送出一個指定檔案_Git常用指令總結

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

git reset —soft 
           

隻改變送出點,暫存區和工作目錄的内容都不改變

git reset —mixed 
           

改變送出點,同時改變暫存區的内容

git reset —hard 
           

暫存區、工作區的内容都會被修改到與送出點完全一緻的狀态

git reset --hard HEAD
           

讓工作區回到上次送出時的狀态

revert

git commit指令如何送出一個指定檔案_Git常用指令總結

git revert用一個新送出來消除一個曆史送出所做的任何修改。

revert與reset的差別

git commit指令如何送出一個指定檔案_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 push 
           

上傳本地指定分支到遠端倉庫

git push  --force
           

強行推送目前分支到遠端倉庫,即使有沖突

git push  --all
           

推送所有分支到遠端倉庫

其他指令

git status
           

顯示有變更的檔案

git log
           

顯示目前分支的版本曆史

git diff
           

顯示暫存區和工作區的差異

git diff HEAD
           

顯示工作區與目前分支最新commit之間的差異

git cherry-pick 
           

選擇一個commit,合并進目前分支

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

繼續閱讀