第一篇博文,其實是日記和筆記【GIT的學習】

androidCDH發表於2016-08-17

皮膚不很好,心情也是。好悶 啊,快快好起來就好了。

又不睡覺,賊困。

七連跪,戒了戒了。


以下是筆記:

建立倉庫成功後,用CD【倉庫名】 進入倉庫,一層層進入

 

pwd命令用於顯示當前目錄

建立一個空目錄:

$ mkdir learngit

$ cd learngit

git init命令把這個目錄變成Git可以管理的倉庫

如果你沒有看到.git目錄,那是因為這個目錄預設是隱藏的,用ls -ah命令就可以看見。

 

1.把檔案新增到版本庫:

標準的UTF-8編碼

Notepad開啟檔案

1.第一步,用命令git add告訴Git,把檔案新增到倉庫:

$ git add readme.txt

第二步,用命令git commit告訴Git,把檔案提交到倉庫:

$ git commit -m"wrote a readme file"

[master (root-commit) cb926e7] wrote a readme file

 1 file changed,2 insertions(+)

 create mode100644 readme.txt


2.時光機穿梭反悔

 

2.1修改readme.txt檔案

 

執行git status命令看的是工作區的改變看看結果:告訴我們,readme.txt被修改過了,但還沒有準備提交的修改

git diff這個命令(檢視工作區和版本庫裡面最新版本的區別)看看:具體修改了什麼內容

2.2版本回退

像這樣,你不斷對檔案進行修改,然後不斷提交修改到版本庫裡,就好比玩RPG遊戲時,每通過一關就會自動把遊戲狀態存檔,如果某一關沒過去,你還可以選擇讀取前一關的狀態。有些時候,在打Boss之前,你會手動存檔,以便萬一打Boss失敗了,可以從最近的地方重新開始。Git也是一樣,每當你覺得檔案修改到一定程度的時候,就可以“儲存一個快照”,這個快照在Git中被稱為commit。一旦你把檔案改亂了,或者誤刪了檔案,還可以從最近的一個commit恢復,然後繼續工作,而不是把幾個月的工作成果全部丟失。

當然了,在實際工作中,我們腦子裡怎麼可能記得一個幾千行的檔案每次都改了什麼內容,不然要版本控制系統幹什麼。版本控制系統肯定有某個命令可以告訴我們歷史記錄,在Git中,我們用git log命令檢視最近到最遠的提交日誌

首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100

現在,我們要把當前版本“append GPL”回退到上一個版本“add distributed”,就可以使用git reset命令:

$ git reset --hard HEAD^

HEAD is nowat ea34578add distributed

但是此時最新版本已經在status 檢視列表消失。

但其實沒有消失,只要通過git reset命令再加上未來的版本號就可以回去。

版本號沒必要寫全,前幾位就可以了

Git的版本回退速度非常快,因為Git在內部有個指向當前版本的HEAD指標,當你回退版本的時候,Git僅僅是把HEAD從指向append GPL

改為指向add distributed

然後順便把工作區的檔案更新了。所以你讓HEAD指向哪個版本號,你就把當前版本定位在哪

當關閉了電腦,又回退了版本,又後悔了,此時用一個命令git reflog用來記錄你的每一次命令:

$ git reflogea34578 

HEAD@{0}:reset:moving to HEAD^

3628164 HEAD@{1}:commit:append GPL

ea34578 HEAD@{2}:commit:add distributed

cb926e7 HEAD@{3}:commit (initial):wrote a readme filePS:工作區與暫存區的關係

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013745374151782eb658c5a5ca454eaa451661275886c6000

 

2.X撤銷修改:

命令git checkout -- readme.txt意思就是,把readme.txt檔案在工作區的修改全部撤銷,這裡有兩種情況:

一種是readme.txt自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;

一種是readme.txt已經新增到暫存區後,又作了修改,現在,撤銷修改就回到新增到暫存區後的狀態。

總之,就是讓這個檔案回到最近一次git commitgit add時的狀態。

git checkout -- file命令中的--很重要,沒有--,就變成了“切換到另一個分支”的命令,我們在後面的分支管理中會再次遇到git checkout命令。

Git同樣告訴我們,用命令git reset HEAD file可以把暫存區的修改撤銷掉(unstage),重新放回工作區

場景1:當你改亂了工作區某個檔案的內容,想直接丟棄工作區的修改時,用命令git checkout -- file

場景2:當你不但改亂了工作區某個檔案的內容,還新增到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。

場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠端庫。

2.X刪除檔案:

命令git rm用於刪除一個檔案。如果一個檔案已經被提交到版本庫,那麼你永遠不用擔心誤刪,但是要小心,你只能恢復檔案到最新版本,你會丟失最近一次提交後你修改的內容

3.遠端倉庫:GitHub

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001374385852170d9c7adf13c30429b9660d0eb689dd43a000

使用前的準備。[SSH]

id_rsa是私鑰,不能洩露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。

3.1新增遠端倉庫

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013752340242354807e192f02a44359908df8a5643103a000

 

新增後,遠端庫的名字就是origin,這是Git預設的叫法,也可以改成別的,但是origin這個名字一看就知道是遠端庫。

$ git remote add origin git@github.com:【michaelliao】/【learngit】.git

 

從現在起,只要本地作了提交,就可以通過命令:

$ git push origin master

把本地master分支的最新修改推送至GitHub,現在,你就擁有了真正的分散式版本庫!

////然而我卡在了這一步!

但是莫名其妙成功了

 

3.2 從遠端庫克隆

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375233990231ac8cf32ef1b24887a5209f83e01cb94b000

$ git clone git@github.com:michaelliao/gitskills.gitCloning into'gitskills'...remote: Counting objects: 3, done.remote: Total 3 (delta0), reused0 (delta0)Receiving objects: 100% (3/3), done.

$ cd gitskills

$ ls

README.md

Clone = 下載。

 

 

4.分支管理:

版本回退裡,你已經知道,每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。

HEAD指向的就是當前分支。

 

 

4.1:建立與合併分支//切換時間線

1.首先,我們建立dev分支,然後切換到dev分支:

$ git checkout -b dev

Switched to a new branch'dev'

git checkout命令加上-b參數列示建立並切換,相當於以下兩條命令:

$ git branch dev$git checkout dev

Switched to branch'dev'

2.然後,用git branch命令檢視當前分支:

$ git branch

* dev

  master

git branch命令會列出所有分支,當前分支前面會標一個*號。

3.然後,我們就可以在dev分支上正常提交,比如對readme.txt做個修改,加上一行:

Creating anew branch is quick.

然後提交:

$ git add readme.txt

$ git commit -m "branch test"

[dev fec145a] branch test

 1 file changed,1 insertion(+)

現在,dev分支的工作完成,我們就可以切換回master分支:

$ git checkout master

Switched to branch'master'

切換回master分支後,再檢視一個readme.txt檔案,剛才新增的內容不見了!因為那個提交是在dev分支上,而master分支此刻的提交點並沒有變:

4.現在,我們把dev分支的工作成果合併到master分支上:

$ git merge dev

Updating d17efd8..fec145aFast-forward

 readme.txt |    1 +

 1 file changed,1 insertion(+)

git merge命令用於合併指定分支到當前分支。合併後,再檢視readme.txt的內容,就可以看到,和dev分支的最新提交是完全一樣的。

注意到上面的Fast-forward資訊,Git告訴我們,這次合併是“快進模式”,也就是直接把master指向dev的當前提交,所以合併速度非常快。

當然,也不是每次合併都能Fast-forward,我們後面會講其他方式的合併。

5.合併完成後,就可以放心地刪除dev分支了:

$ git branch -d dev

Deleted branch dev (was fec145a).

刪除後,檢視branch,就只剩下master分支了:

$ git branch

* master

因為建立、合併和刪除分支非常快,所以Git鼓勵你使用分支完成某個任務,合併後再刪掉分支,這和直接在master分支上工作效果是一樣的,但過程更安全。

小結

Git鼓勵大量使用分支:

檢視分支:git branch

建立分支:git branch <name>

切換分支:git checkout <name>

建立+切換分支:git checkout -b <name>

合併某分支到當前分支:git merge <name>

刪除分支:git branch -d <name>

4.2:解決合併分支衝突

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840202368c74be33fbd884e71b570f2cc3c0d1dcf000

當Git無法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。

git log --graph命令可以看到分支合併圖。

4.3:分支管理策略

通常,合併分支時,如果可能,Git會用Fast forward模式,但這種模式下,刪除分支後,會丟掉分支資訊。

如果要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支資訊。

.//操作成功,原理矇蔽。

//而且退不出來了。

在實際開發中,我們應該按照幾個基本原則進行分支管理:

首先,master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面幹活;

那在哪幹活呢?幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本釋出時,再把dev分支合併到master上,在master分支釋出1.0版本;

你和你的小夥伴們每個人都在dev分支上幹活,每個人都有自己的分支,時不時地往dev分支上合併就可以了。

所以,團隊合作的分支看起來就像這樣:

小結

Git分支十分強大,在團隊開發中應該充分應用。

合併分支時,加上--no-ff引數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而fast forward合併就看不出來曾經做過合併。

4.3:Bug分支

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137602359178794d966923e5c4134bc8bf98dfb03aea3000

修復bug時,我們會通過建立新的bug分支進行修復,然後合併,最後刪除;

當手頭工作沒有完成時,先把工作現場git stash一下,然後去修復bug,修復後,再git stash pop,回到工作現場。

4.4Feature特色,區域性分支

開發一個新feature,最好新建一個分支;

如果要丟棄一個沒有被合併過的分支,可以通過git branch -D <name>強行刪除。

4.5多人協作

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013760174128707b935b0be6fc4fc6ace66c4f15618f8d000

//這個很亂,實踐的時候在說

 

要檢視遠端庫的資訊,用git remote

$ git remote

origin

或者,用git remote -v顯示更詳細的資訊:

$ git remote -v

origin  git@github.com:michaelliao/learngit.git (fetch)

origin  git@github.com:michaelliao/learngit.git (push)

上面顯示了可以抓取和推送的origin的地址。如果沒有推送許可權,就看不到push的地址。

6.標籤管理

釋出一個版本時,我們通常先在版本庫中打一個標籤(tag),這樣,就唯一確定了打標籤時刻的版本。將來無論什麼時候,取某個標籤的版本,就是把那個打標籤的時刻的歷史版本取出來。所以,標籤也是版本庫的一個快照。

Git的標籤雖然是版本庫的快照,但其實它就是指向某個commit的指標(跟分支很像對不對?但是分支可以移動,標籤不能移動),所以,建立和刪除標籤都是瞬間完成的。

Git有commit,為什麼還要引入tag?

“請把上週一的那個版本打包釋出,commit號是6a5819e...”

“一串亂七八糟的數字不好找!”

如果換一個辦法:

“請把上週一的那個版本打包釋出,版本號是v1.2”

“好的,按照tag v1.2查詢commit就行!”

所以,tag就是一個讓人容易記住的有意義的名字,它跟某個commit綁在一起。

7.使用GitHub

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


相關文章