在平常工做中,常常會用到Git操做。可是對於新人來說,剛上來對Git很陌生,操做起來也很懵逼。本篇文章主要針對剛開始接觸Git的新人,理解Git的基本原理,掌握經常使用的一些命令。html
以上包括一些簡單而經常使用的命令,可是先不關心這些,先來了解下面這4個專有名詞。git
工做區 程序員
程序員進行開發改動的地方,是你當前看到的,也是最新的。markdown
日常咱們開發就是拷貝遠程倉庫中的一個分支,基於該分支進行開發。在開發過程當中就是對工做區的操做。oop
暫存區 fetch
.git目錄下的index文件, 暫存區會記錄git add
添加文件的相關信息(文件名、大小、timestamp...),不保存文件實體, 經過id指向每一個文件實體。可使用git status
查看暫存區的狀態。暫存區標記了你當前工做區中,哪些內容是被git管理的。spa
當你完成某個需求或功能後須要提交到遠程倉庫,那麼第一步就是經過git add
先提交到暫存區,被git管理。3d
本地倉庫版本控制
保存了對象被提交 過的各個版本,比起工做區和暫存區的內容,它要更舊一些。code
git commit
後同步index的目錄樹到本地倉庫,方便從下一步經過git push
同步本地倉庫與遠程倉庫的同步。
遠程倉庫
遠程倉庫的內容可能被分佈在多個地點的處於協做關係的本地倉庫修改,所以它可能與本地倉庫同步,也可能不一樣步,可是它的內容是最舊的。
下面這幅圖更加直接闡述了四個區域之間的關係,可能有些命令不太清楚,不要緊,下部分會詳細介紹。
網上找了個圖,別人整理的一張圖,很全很好,借來用下。下面詳細解釋一些經常使用命令。
在掌握具體命令前,先理解下HEAD。
HEAD,它始終指向當前所處分支的最新的提交點。你所處的分支變化了,或者產生了新的提交點,HEAD就會跟着改變。
add相關命令很簡單,主要實現將工做區修改的內容提交到暫存區,交由git管理。
git add . | 添加當前目錄的全部文件到暫存區 |
---|---|
git add [dir] | 添加指定目錄到暫存區,包括子目錄 |
git add [file1] | 添加指定文件到暫存區 |
commit相關命令也很簡單,主要實現將暫存區的內容提交到本地倉庫,並使得當前分支的HEAD向後移動一個提交點。
git commit -m [message] | 提交暫存區到本地倉庫,message表明說明信息 |
---|---|
git commit [file1] -m [message] | 提交暫存區的指定文件到本地倉庫 |
git commit --amend -m [message] | 使用一次新的commit,替代上一次提交 |
涉及到協做,天然會涉及到分支,關於分支,大概有展現分支,切換分支,建立分支,刪除分支這四種操做。
git branch | 列出全部本地分支 |
---|---|
git branch -r | 列出全部遠程分支 |
git branch -a | 列出全部本地分支和遠程分支 |
git branch [branch-name] | 新建一個分支,但依然停留在當前分支 |
git checkout -b [branch-name] | 新建一個分支,並切換到該分支 |
git branch --track [branch][remote-branch] | 新建一個分支,與指定的遠程分支創建追蹤關係 |
git checkout [branch-name] | 切換到指定分支,並更新工做區 |
git branch -d [branch-name] | 刪除分支 |
git push origin --delete [branch-name] | 刪除遠程分支 |
關於分支的操做雖然比較多,但都比較簡單好記。
merge命令把不一樣的分支合併起來。如上圖,在實際開放中,咱們可能從master分支中切出一個分支,而後進行開發完成需求,中間通過R3,R4,R5的commit記錄,最後開發完成須要合入master中,這便用到了merge。
git fetch [remote] | merge以前先拉一下遠程倉庫最新代碼 |
---|---|
git merge [branch] | 合併指定分支到當前分支 |
通常在merge以後,會出現conflict,須要針對衝突狀況,手動解除衝突。主要是由於兩個用戶修改了同一文件的同一塊區域。以下圖所示,須要手動解除。
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 reset —soft [commit] | 只改變提交點,暫存區和工做目錄的內容都不改變 |
---|---|
git reset —mixed [commit] | 改變提交點,同時改變暫存區的內容 |
git reset —hard [commit] | 暫存區、工做區的內容都會被修改到與提交點徹底一致的狀態 |
git reset --hard HEAD | 讓工做區回到上次提交時的狀態 |
git revert用一個新提交來消除一個歷史提交所作的任何修改。
revert與reset的區別
上傳本地倉庫分支到遠程倉庫分支,實現同步。
git push [remote][branch] | 上傳本地指定分支到遠程倉庫 |
---|---|
git push [remote] --force | 強行推送當前分支到遠程倉庫,即便有衝突 |
git push [remote] --all | 推送全部分支到遠程倉庫 |
git status | 顯示有變動的文件 |
---|---|
git log | 顯示當前分支的版本歷史 |
git diff | 顯示暫存區和工做區的差別 |
git diff HEAD | 顯示工做區與當前分支最新commit之間的差別 |
git cherry-pick [commit] | 選擇一個commit,合併進當前分支 |
以上就是關於Git的一些經常使用命令及詳細闡述,相信能對Git有一個初步的認識。