第一篇博文,其實是日記和筆記【GIT的學習】
皮膚不很好,心情也是。好悶 啊,快快好起來就好了。
又不睡覺,賊困。
七連跪,戒了戒了。
以下是筆記:
建立倉庫成功後,用CD【倉庫名】 進入倉庫,一層層進入
pwd命令用於顯示當前目錄
建立一個空目錄:
$ mkdir learngit
$ cd learngit
如果你沒有看到.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 commit或git 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
使用前的準備。[SSH]
id_rsa是私鑰,不能洩露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
3.1新增遠端倉庫
新增後,遠端庫的名字就是origin,這是Git預設的叫法,也可以改成別的,但是origin這個名字一看就知道是遠端庫。
$ git remote add origin git@github.com:【michaelliao】/【learngit】.git
$ git push origin master
把本地master分支的最新修改推送至GitHub,現在,你就擁有了真正的分散式版本庫!
////然而我卡在了這一步!
但是莫名其妙成功了
3.2 從遠端庫克隆
$ 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:解決合併分支的衝突
當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分支
修復bug時,我們會通過建立新的bug分支進行修復,然後合併,最後刪除;
當手頭工作沒有完成時,先把工作現場git stash一下,然後去修復bug,修復後,再git stash pop,回到工作現場。
4.4Feature(特色,區域性)分支
開發一個新feature,最好新建一個分支;
如果要丟棄一個沒有被合併過的分支,可以通過git branch -D <name>強行刪除。
4.5多人協作
//這個很亂,實踐的時候在說
要檢視遠端庫的資訊,用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
相關文章
- Git和Maven的學習筆記GitMaven筆記
- git 和 vim 學習筆記Git筆記
- Git的學習筆記Git筆記
- git學習筆記Git筆記
- 【Git】學習筆記–clone和本地修改Git筆記
- git checkout 和 git reset 的區別 —— Git 學習筆記 09Git筆記
- Pro Git 學習筆記Git筆記
- Git命令學習筆記Git筆記
- git學習筆記5Git筆記
- git學習筆記6Git筆記
- git學習筆記(一)Git筆記
- git學習筆記(二)Git筆記
- Git—學習筆記1Git筆記
- git學習筆記 1Git筆記
- git學習筆記1Git筆記
- GIT學習筆記一git initGit筆記
- Git 的特點—— Git 學習筆記 02Git筆記
- Oracle DBA學習日記筆記Oracle筆記
- Git極簡學習筆記Git筆記
- git入門學習筆記Git筆記
- Git進階學習筆記Git筆記
- 取得 Git 倉庫 —— Git 學習筆記 04Git筆記
- git rebase(變基)—— Git 學習筆記 19Git筆記
- git常用命令-Git學習筆記Git筆記
- Git 簡單使用學習筆記Git筆記
- Java小白的學習日記一(自用筆記)Java筆記
- Myth 關於Git的學習筆記Git筆記
- 【讀書筆記】安卓學習筆記第一篇——個人雜談筆記安卓
- git status 命令總結 —— Git 學習筆記 06Git筆記
- git checkout 命令詳解—— Git 學習筆記 16Git筆記
- Vue知乎日報的學習筆記Vue筆記
- Git 的安裝與初次使用 —— Git 學習筆記 03Git筆記
- Git 分支的建立與切換 —— Git 學習筆記 14Git筆記
- 1.Less學習筆記第一篇筆記
- 撤銷操作 —— Git 學習筆記 12Git筆記
- numpy的學習筆記\pandas學習筆記筆記
- 這是第一篇筆記筆記
- AS 學習筆記 for in 和 for each in筆記