以上包括一些簡單而常用的命令,但是先不關心這些,先來了解下面這4個專有名詞。
工作區
程式設計師進行開發改動的地方,是你當前看到的,也是最新的。
平常我們開發就是拷貝遠端倉庫中的一個分支,基於該分支進行開發。在開發過程中就是對工作區的操作。
暫存區
.git目錄下的index檔案, 暫存區會記錄git add
新增檔案的相關資訊(檔名、大小、timestamp...),不儲存檔案實體, 通過id指向每個檔案實體。可以使用git status
檢視暫存區的狀態。暫存區標記了你當前工作區中,哪些內容是被git管理的。
當你完成某個需求或功能後需要提交到遠端倉庫,那麼第一步就是通過git add
先提交到暫存區,被git管理。
本地倉庫
儲存了物件被提交 過的各個版本,比起工作區和暫存區的內容,它要更舊一些。
git commit
後同步index的目錄樹到本地倉庫,方便從下一步通過git push
同步本地倉庫與遠端倉庫的同步。
遠端倉庫
遠端倉庫的內容可能被分佈在多個地點的處於協作關係的本地倉庫修改,因此它可能與本地倉庫同步,也可能不同步,但是它的內容是最舊的。
任何物件都是在工作區中誕生和被修改;
任何修改都是從進入index區才開始被版本控制;
只有把修改提交到本地倉庫,該修改才能在倉庫中留下痕跡;
與協作者分享本地的修改,可以把它們push到遠端倉庫來共享。
下面這幅圖更加直接闡述了四個區域之間的關係,可能有些命令不太清楚,沒關係,下部分會詳細介紹。
網上找了個圖,別人整理的一張圖,很全很好,借來用下。下面詳細解釋一些常用命令。
在掌握具體命令前,先理解下head。
head,它始終指向當前所處分支的最新的提交點。你所處的分支變化了,或者產生了新的提交點,head就會跟著改變。
add相關命令很簡單,主要實現將工作區修改的內容提交到暫存區,交由git管理。
新增當前目錄的所有檔案到暫存區
git add
新增指定目錄到暫存區,包括子目錄
git add
新增指定檔案到暫存區
commit相關命令也很簡單,主要實現將暫存區的內容提交到本地倉庫,並使得當前分支的head向後移動一個提交點。
提交暫存區到本地倉庫,message代表說明資訊
git commit -m
提交暫存區的指定檔案到本地倉庫
git commit --amend -m
使用一次新的commit,替代上一次提交
涉及到協作,自然會涉及到分支,關於分支,大概有展示分支,切換分支,建立分支,刪除分支這四種操作。
列出所有本地分支
git branch -r
列出所有遠端分支
git branch -a
列出所有本地分支和遠端分支
git branch
新建一個分支,但依然停留在當前分支
git checkout -b
新建一個分支,並切換到該分支
git branch --track
新建一個分支,與指定的遠端分支建立追蹤關係
git checkout
切換到指定分支,並更新工作區
git branch -d
刪除分支
git push origin --delete
刪除遠端分支
關於分支的操作雖然比較多,但都比較簡單好記。
merge命令把不同的分支合併起來。如上圖,在實際開放中,我們可能從master分支中切出一個分支,然後進行開發完成需求,中間經過r3,r4,r5的commit記錄,最後開發完成需要合入master中,這便用到了merge。
merge之前先拉一下遠端倉庫最新**
git merge
合併指定分支到當前分支
一般在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在master執行/a---b---c---f master
git merge test
,然後會得到如下結果:
d--------e在master執行/ \
a---b---c---f----g test, 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 —mixed
改變提交點,同時改變暫存區的內容
git reset —hard
暫存區、工作區的內容都會被修改到與提交點完全一致的狀態
git reset --hard head
讓工作區回到上次提交時的狀態
git revert用一個新提交來消除一個歷史提交所做的任何修改。
revert與reset的區別
上傳本地倉庫分支到遠端倉庫分支,實現同步。
上傳本地指定分支到遠端倉庫
git push --force
強行推送當前分支到遠端倉庫,即使有衝突
git push --all
推送所有分支到遠端倉庫
顯示有變更的檔案
git log
顯示當前分支的版本歷史
git diff
顯示暫存區和工作區的差異
git diff head
顯示工作區與當前分支最新commit之間的差異
git cherry-pick
選擇一個commit,合併進當前分支
git 常用命令 git常用命令的使用
1.touch readme.md 新建一個資料夾,在資料夾下右鍵bash出現命令列,輸入這行命令建立一個readme檔案2.git init 把當前資料夾變成一個git倉庫3.git add readme.md 新增檔案到倉庫 這裡只新增了一個readme檔案 git add a 新增所有檔案到本...
Git命令 git常用命令
一 git 狀態轉換圖 其中 untrack files 是指尚未被git所管理的檔案 changed but not updated 是指檔案被git管理,並且發生了改變,但改動還沒被git管理 這兩種狀態,都可以看成是改動還沒被git管理的狀態,我們這裡稱unstage狀態。staging是co...
git常用命令
git branch 顯示當前所在的分支,以及目前本地所有分支 前面有 標註的是當前所在分支 git branch 建立新的分支 git checkout b 建立新的分支並且切換到新分支上 git checkout 切換到新的分支上 此命令也可以用於切換到本地庫沒有,而遠端庫有的分支上 git s...