基礎命令
git init
把目錄變成Git可以管理的倉庫。git add
把檔案新增到倉庫。git commit
把檔案提交到倉庫git commit -m "這裡是檔案提交說明"
新增提交說明,方便查閱。git status
檢視追蹤的目錄檔案哪些做了修改。git stage
檢視倉庫當前狀態。git diff
檢視上次修改內容。git log
檢視歷史修改記錄。git log --pretty=online
只看提交說明
時光穿梭
git reset --hard HEAD^
回到上一個版本。git reset --hard 321ef1
回到版本為 321ef1到狀態,版本號沒必要寫全,前幾位就可以,Git會自動去找。git reflog
檢視歷史穿梭版本。git checkout -- file
丟棄工作區的修改。(git checkout
其實是用版本庫裡的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。)
HEAD
指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id
。 穿梭前,用git log
可以檢視提交歷史,以便確定要回退到哪個版本。 要重返未來,用git reflog
檢視命令歷史,以便確定要回到未來的哪個版本。
工作區和暫存區
工作區(Working Directory) 顧名思義就是當前工作的目錄。
版本庫(Repository)
工作區有一個隱藏目錄.git
,這個不算工作區,而是Git的版本庫。
Git的版本庫裡存了很多東西,其中最重要的就是稱為stage
(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master
,以及指向master
的一個指標叫HEAD
。
因為我們建立Git版本庫時,Git自動為我們建立了唯一一個
git add
命令將檔案新增到暫存區。git commit
命令將所有暫存區內容提交到當前分支。
master
分支,所以,現在,git commit
就是往master
分支上提交更改。
其實就是將需要提交的檔案修改通通放到暫存區,然後一次性提交暫存區的所有修改。
遠端倉庫
1.建立SSH Key
$ ssh-keygen -t rsa -C "youremail@example.com"
複製程式碼
2.關聯遠端倉庫
$ git remote add origin git@github.com:blacker/learngit.git
複製程式碼
blacker
為關聯的github
賬戶名,learngit
為倉庫名
3.推送到遠端庫
git push -u origin master
複製程式碼
git push
命令是把本地當前分支masrer
推送到遠端庫。
如果遠端庫是空的,第一次推送master
分支時,加上了-u
引數,Git不但會把本地的master
分支內容推送的遠端新的master
分支,還會把本地的master
分支和遠端的master
分支關聯起來,在以後的推送或者拉取時就可以使用簡化命令。
git push origin master
複製程式碼
錯誤處理
To github.com:hellowqw/leargit
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'git@github.com:hellowqw/leargit'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
複製程式碼
出現錯誤的主要原因是github中的README.md
檔案不在原生程式碼目錄中
解決
可以通過如下命令進行程式碼合併【注:pull=fetch+merge]
git pull --rebase origin master
複製程式碼
執行上面程式碼後可以看到原生程式碼庫中多了README.md
檔案
分支
建立倉庫時預設只有一個分支,即主分支master
。HEAD
嚴格來說不是指向提交,而是指向master
,master
才是指向提交的。
最初,master
分支是一條線,Git用master
指向最新的提交,在用HEAD
指向master
,就能確定當前分支,以及當前分支的提交點:
master
分支都會向前移動一步,這樣,隨著你不斷提交,master
分支的線也越來越長。
當建立新的分支,例如dev
時,Git新建了一個指標叫dev
,指向master
相同的提交,再把HEAD
指向dev
,就表示當前分支在dev
上:
git checkout -b dev
複製程式碼
-b
參數列示建立並切換分支,相當於以下兩條命令:
git branch dev
git checkout dev
複製程式碼
用git branch
命令檢視當前分支:
git branch
* dev
master
複製程式碼
Git建立一個分支很快,因為除了增加一個dev
指標,改變HEAD
的指向,工作區的檔案都沒有任何變化!
不過,從現在開始,對工作區的修改和提交就是針對dev分支了,比如新提交一次後,dev
指標往前移動一步,而master
指標不變:
假如在dev
上的工作完成了,就可以把dev
合併到master
上。Git怎麼合併呢?最簡單的方法,就是直接把master
指向dev
的當前提交,就完成了合併。
切換master
分支:
git checkout master
複製程式碼
此時狀態:
現在,把dev
分支的工作成果合併到master
分支上:
git merge dev
Updating d17efd8..fec145a
Fast-forward #快進模式也就是直接把master指向dev的當前提交,所以合併速度非常快。
readme.txt | 1 +
1 file changed, 1 insertion(+)
複製程式碼
git merge
命令用於合併指定分支到當前分支。
合併完分支後,甚至可以刪除dev
分支。
git branch -d dev
複製程式碼
刪除dev
分支就是把dev
指標給刪掉,刪掉後,就剩下了一條master
分支。
git branch
* master
複製程式碼
因為建立、合併和刪除分支非常快,所以Git鼓勵我們使用分支完成某個任務,合併後再刪掉分支,這和直接在master分支上工作效果是一樣的,但過程更安全。 #####小結 檢視分支:git branch 建立分支:git branch 切換分支:git checkout 建立+切換分支:git checkout -b 合併某分支到當前分支:git merge 刪除分支:git branch -d #分支管理策略 在實際開發中,我們應該按照幾個基本原則進行分支管理:
首先,master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面幹活;
那在哪幹活呢?幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本釋出時,再把dev分支合併到master上,在master分支釋出1.0版本;
你和你的小夥伴們每個人都在dev分支上幹活,每個人都有自己的分支,時不時地往dev分支上合併就可以了。
所以,團隊合作的分支看起來就像這樣:
令,上面有提到合併分支時又一個Fast forward
模式,需要注意到是這種模式下,刪除分支後,會丟掉分支資訊。
如果要強制禁用Fast forward
模式,Git就會在merge
時生成一個新的commit
,這樣,從分支歷史上就可以看出分支資訊。
git merge --no-ff -m "merge with no-ff" dev
複製程式碼