Git版本控制下的工程區域隻有三種
1.版本庫(Repository)
在工作區中有一個隐藏目錄.git,這個檔案夾就是Git的版本庫,裡面存放了Git用來管理該工程的所有版本資料,也可以叫本地倉庫
2.工作區(WorkingDirectory)
日常工作的代碼檔案或者文檔所在的檔案夾
3.暫存區(stage)
一般存放在工程根目錄.gitindex檔案中是以我們也可以把暫存區叫作索引(index)
Git版本控制下的檔案狀态隻有三種
1.已送出(committed)
該檔案已經被安全地儲存在本地資料庫中了
2.已修改(modified)
修改了某個檔案,但還沒有送出儲存
3.已暫存(staged)
把已修改的檔案放在下次送出時要儲存的清單中
工程準備
git init用于在本地目錄下建立git項目倉庫。
執行git init後,目前目錄下自動生成一個名為.git的目錄,這代表目前項目所在目錄已納入Git管理。.git目錄下存放着本項目的Git版本庫
下圖可知,Git倉庫下的.git目錄預設是不可見的,有一定程度上是出于防止使用者誤操作考慮

git clone用于克隆遠端工程到本地磁盤
本地指令行執行git clone [URL]
新增/删除/移動檔案到暫存區
在送出你修改的檔案之前,需要git add把檔案添加到暫存區
如果該檔案是新建立,尚未被git跟蹤的,需要先執行git add将該檔案添加到暫存區,再執行送出。如果檔案已經被git追蹤,即曾經送出過的。在早期版本的git中,需要git add再送出;在較新版本的git中不需要git add即可送出。
git rm将指定檔案徹底從目前分支的緩存區删除,是以它從目前分支的下一個送出快照中被删除。
如果一個檔案被git rm後進行了送出,那麼它将脫離git跟蹤,這個檔案在之後的節點中不再受git工程的管理。
執行git rm後,該檔案會在緩存區消失。你也可以直接從硬碟上删除檔案,然後對該檔案執行git commit,git會自動将删除的檔案從索引中移除,效果一樣。
git mv指令用于移動檔案,也可以用于重命名檔案。
例1:需要将檔案git_test.txt 從目前目錄移動到config目錄下,可執行
git mv git_test.txt config
例2:需要将檔案git_test.txt 重命名為new_git_test.txt,可執行:
git mv config/git_test.txt config/new_git_test.txt
檢視工作區
git diff用于比較項目中任意兩個版本(分支)的差異,也可以用來比較目前的索引和上次送出間的差異。
比較兩個節點之間的差異
比較兩個分支之間的差異
目前的索引和上次送出間的差異
在diff後面加--name-status參數,隻看檔案清單
git status指令用于顯示工作目錄和暫存區的狀态。
使用此指令能看到修改的git檔案是否已被暫存,新增的檔案是否納入了git版本庫的管理。下例中的資訊表明:git1.txt已被修改并暫存,git2.txt已被修改但未暫存,git3.txt已被删除并暫存,git4.txt已被建立但未跟蹤。
送出更改的檔案
git commit主要是将暫存區裡的檔案改動送出到本地的版本庫
git commit一般需要附帶送出描述資訊,是以常見用法是:git commit filename -m “commit message”
送出成功後,git日志可查到此次送出的id和送出的描述資訊
如果要一次性送出所有在暫存區改動的檔案到版本庫,可以執行git commit -am “comitmessage”
檢視日志
git log用于檢視送出曆史
預設不加其他參數的話,git log會按送出時間由近到遠列出所有的曆史送出日志。每個日志基本包含送出節點、作者資訊、送出時間、送出說明等。
常用的日志指令格式:git log
git log配合不同參數具有相當靈活強大的展示功能,常見的如--name-status/-p/--pretty/--graph等等。
推送至遠端倉庫
在使用git commit指令将自己的修改從暫存區送出到本地版本庫後,可以使用git push将本地版本庫的分支推送到遠端伺服器上對應的分支。
成功推送遠端倉庫後,其他開發人員可以擷取到你新送出的内容。
常用的推送指令格式:git push origin branch_name
branch_name決定了你的本地分支推送成功後,在遠端伺服器上的分支名,其他人據此可以擷取該分支上的改動内容。
你的本地分支名可以與推送到遠端的分支名不同:git push origin branch_name:new_branch_name
分支管理
git branch指令可檢視本地工程的所有git分支名稱。
其中master分支前面的“*”表示目前工作區所在的分支是master。
如果想檢視遠端伺服器上有哪些分支,執行git branch -r,傳回的分支名帶origin字首,表示在遠端;如果想檢視遠端伺服器和本地工程所有分支,那麼執行git branch -a。
建立分支指令:git branch new_branch_name/git checkout -b branch_name
git branch和git checkout -b都可以用于建立分支(預設基于目前分支節點建立)
git branch建立分支後并不會切換到新分支;
git checkout -b建立分支後會自動切換到新分支。
git branch -d和git branch -D都可以用來删除本地分支,後者大寫表示強制删除。
有時候當事分支上包含了未合并的改動,或者當事分支是目前所在分支,則-d無法删除,需要使用強制删除來達到目的。
常用的删除分支指令格式:git branch -d branch_name/git branch -D branch_name删除伺服器上的遠端分支可以使用git branch -d -r branch_name,其中branch_name為本地分支名,删除後,還要推送到伺服器上才行,即git push origin:branch_name
git checkout指令除了建立分支,還用來切換分支,當然比較官方的叫法是“檢出”。
有時候目前分支工作區存在修改而未送出的檔案,與目的分支上的内容沖突,會導緻checkout切換失敗,這時候,可以使用git checkout -f進行強制切換。
常用的切換分支指令格式:git checkout branch_name
git checkout對象可以是分支,也可以是某個送出節點或者節點下的某個檔案
git pull的作用是從遠端伺服器中擷取某個分支的更新,再與本地指定的分支進行自動合并。
指令格式:git pull origin remote_branch:local_branch
如果遠端分支和本地分支相同,直接執行:git pull origin remote_branch
git fetch的作用是,從遠端伺服器中擷取某個分支的更新到本地倉庫。
與git pull不同,git fetch在擷取到更新後,并不會進行合并(即git merge)操作,這樣能留給使用者一個操作空間,确認git fetch内容符合預期後,再決定是否手動合并節點。
常用的擷取遠端分支更新指令格式:git fetch origin remote_branch:local_branch
如果遠端分支和本地分支相同,直接執行:git fetch origin remote_branch
分支合并
git merge指令是用于從指定的分支(節點)合并到目前分支的操作。
git會将指定的分支與目前分支進行比較,找出二者最近的一個共同節點base,之後将指定分支在base之後分離的節點合并到目前分支上。分支合并,實際上是分支間差異送出節點的合并。
指令格式:git merge branch_name
如果你要将其他分支的送出節點合并到目前分支,那麼git rebase和git merge都可以達到目的。
常用的合并指令格式:git rebase branch_name
git rebase、git merge背後的實作機制和對合并後節點造成的影響有很大差異,有各自的風險存在。
撤銷操作
git reset通常用于撤銷目前工作區中的某些git add/commit操作,可将工作區内容回退到曆史送出節點。
指令格式:git reset commit_id
git checkout .用于回退本地所有修改而未送出的檔案内容。
git checkout .這是條有風險的指令,因為它會取消本地工作區的修改(相對于暫存區),用暫存區的所有檔案直接覆寫本地檔案,達到回退内容的目的。但它不給使用者任何确認機會,是以謹慎使用。
常用的回退指令格式:git checkout .
如果僅僅想回退某個檔案的未送出改動可以使用git checkout -filename來達到目的;如果想将工作區回退(檢出)到某個送出版本,可以使用git checkout commit_id。