1. Windows上安裝Git
??在Windows上使用Git陪蜻,可以從Git官網(wǎng)直接下載安裝程序慎陵,(網(wǎng)速慢的同學(xué)請移步國內(nèi)鏡像)仲闽,然后按默認(rèn)選項(xiàng)安裝即可脑溢。
??安裝完成后,在開始菜單里找到“Git”->“Git Bash”赖欣,蹦出一個類似命令行窗口的東西屑彻,就說明Git安裝成功!
??安裝完成后顶吮,還需要最后一步設(shè)置酱酬,在命令行輸入:
$ git config --global user.name "Your Name"
$ git config --global user.email "Your Email"
2.創(chuàng)建版本庫
2.1 將一個目錄(可以非空)作為該倉庫目錄
$ mkdir learngit
$ cd learngit
注:為了避免遇到莫名其妙的問題,目錄名和文件名最好不要包含中文
2.2 通過git init命令把這個目錄變成Git可以管理的倉庫:
$ git init
Initialized empty Git repository in E:/git/learnGit/.git/
??當(dāng)前目錄下多了一個.git的目錄云矫,這個目錄是Git來跟蹤管理版本庫的膳沽,沒事千萬不要手動修改這個目錄里面的文件,不然改亂了让禀,就把Git倉庫給破壞了挑社。
2.3 將文件添加到版本庫
說明:
??所有的版本控制系統(tǒng),其實(shí)只能跟蹤文本文件的改動巡揍,比如TXT文件痛阻,網(wǎng)頁,所有的程序代碼等等腮敌,Git也不例外阱当。版本控制系統(tǒng)可以告訴你每次的改動,比如在第5行加了一個單詞“Linux”糜工,在第8行刪了一個單詞“Windows”弊添。而圖片、視頻這些二進(jìn)制文件捌木,雖然也能由版本控制系統(tǒng)管理油坝,但沒法跟蹤文件的變化,只能把二進(jìn)制文件每次改動串起來刨裆,也就是只知道圖片從100KB改成了120KB澈圈,但到底改了啥,版本控制系統(tǒng)不知道帆啃,也沒法知道瞬女。
??千萬不要使用Windows自帶的記事本編輯任何文本文件。原因是Microsoft開發(fā)記事本的團(tuán)隊使用了一個非常弱智的行為來保存UTF-8編碼的文件努潘,他們自作聰明地在每個文件開頭添加了0xefbbbf(十六進(jìn)制)的字符诽偷,你會遇到很多不可思議的問題坤学,比如,網(wǎng)頁第一行可能會顯示一個“?”渤刃,明明正確的程序一編譯就報語法錯誤拥峦,等等,都是由記事本的弱智行為帶來的卖子。建議你下載Notepad++代替記事本略号,不但功能強(qiáng)大,而且免費(fèi)洋闽!記得把Notepad++的默認(rèn)編碼設(shè)置為UTF-8 without BOM即可玄柠。添加步驟:
-
創(chuàng)建一個readme.txt,內(nèi)容如下:
write a readme.txt
-
用git add命令添加到倉庫
$ git add readme.txt
-
用git commit命令提交到倉庫
$ git commit -m "wrote a readme.txt file" [master (root-commit) dce98bd] wrote a readme.txt file 1 file changed, 1 insertion(+) create mode 100644 readme.txt
3. 時光機(jī)穿梭
修改readme.txt為:
write a readme.txt
change 1
運(yùn)行g(shù)it status查看結(jié)果:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
如果能看看具體修改了什么內(nèi)容诫舅,使用git diff:
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 79589fa..2319020 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1,2 @@
write a readme.txt
+change 1
使用git add命令添加到倉庫:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
使用git commit提交到倉庫:
$ git commit -m 'change1'
[master 4cb3c0f] change1
1 file changed, 1 insertion(+)
再用git status查看倉庫狀態(tài):
$ git status
On branch master
nothing to commit, working tree clean
3.1.版本回退
??再進(jìn)行一次修改用于測試版本回退羽利,當(dāng)前readme.txt中的內(nèi)容為:
write a readme.txt
change 1
change 2
??git log命令顯示從最近到最遠(yuǎn)的提交日志:
$ git log
commit cb0e5027fbd8a470bfcba948fa5c3207b096a27b (HEAD -> master)
Author: GuoYuebo <2698895442@qq.com>
Date: Sat Jan 20 18:11:29 2018 +0800
change 2
commit 4cb3c0f255c88be164056f83cf5d6c87957924f9
Author: GuoYuebo <2698895442@qq.com>
Date: Sat Jan 20 17:33:08 2018 +0800
change1
commit dce98bd01d5cd1847dcebbcb231aff2b54155d44
Author: GuoYuebo <2698895442@qq.com>
Date: Sat Jan 20 17:21:22 2018 +0800
wrote a readme.txt file
??如果嫌輸出信息太多,看得眼花繚亂的刊懈,可以試試加上--pretty=oneline參數(shù):
$ git log --pretty=oneline
cb0e5027fbd8a470bfcba948fa5c3207b096a27b (HEAD -> master) change 2
4cb3c0f255c88be164056f83cf5d6c87957924f9 change1
dce98bd01d5cd1847dcebbcb231aff2b54155d44 wrote a readme.txt file
開始回退:
??首先这弧,Git必須知道當(dāng)前版本是哪個版本,在Git中虚汛,用HEAD表示當(dāng)前版本匾浪,上一個版本就是HEAD,上上一個版本就是HEAD卷哩,當(dāng)然往上100個版本寫100個比較容易數(shù)不過來蛋辈,所以寫成HEAD~100。HEAD只是指向某個版本的指針将谊。
??回退使用git reset命令冷溶。--hard命令后面再解釋:
$ git reset --hard HEAD^
HEAD is now at 4cb3c0f change1
$ git log --pretty=oneline
4cb3c0f255c88be164056f83cf5d6c87957924f9 (HEAD -> master) change1
dce98bd01d5cd1847dcebbcb231aff2b54155d44 wrote a readme.txt file
$ cat readme.txt
write a readme.txt
change 1
??要想從過去回到未來可以通過上面commit id的記錄:
$ git reset --hard cb0e5027fbd8a470bfcba948fa5c3207b096a27b
HEAD is now at cb0e502 change 2
$ cat readme.txt
write a readme.txt
change 1
change 2
??若沒有記錄以前版本的commit id,可以通過git reflog顯示之前的提交記錄
$ git reflog
cb0e502 (HEAD -> master) HEAD@{0}: reset: moving to cb0e5027fbd8a470bfcba948fa5c3207b096a27b
4cb3c0f HEAD@{1}: reset: moving to HEAD^
cb0e502 (HEAD -> master) HEAD@{2}: commit: change 2
4cb3c0f HEAD@{3}: commit: change1
dce98bd HEAD@{4}: commit (initial): wrote a readme.txt file
??可以通過git reset和其中的commit id回到未來
$ git reset --hard cb0e502
HEAD is now at cb0e502 change 2
3.2.工作區(qū)和暫存區(qū)
- 工作區(qū)
??就是你在電腦里能看到的目錄尊浓,比如我的learngit文件夾就是一個工作區(qū) - 版本庫和暫存區(qū)
??工作區(qū)有一個隱藏目錄.git逞频,這個不算工作區(qū),而是Git的版本庫眠砾。Git的版本庫里存了很多東西虏劲,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動創(chuàng)建的第一個分支master褒颈,以及指向master的一個指針叫HEAD。 -
提交過程
??第一步是用git add把文件添加進(jìn)去励堡,實(shí)際上就是把文件修改添加到暫存區(qū)谷丸;
??第二步是用git commit提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支应结。
3.3.管理修改
??git管理的是修改刨疼,從以下現(xiàn)象可以看出泉唁。
??操作步驟:第一次修改 -> git add -> 第二次修改 -> git commit。這樣只會提交第一次修改的內(nèi)容揩慕⊥ば螅可以使用git diff HEAD -- readme.txt查看已提交和第二次修改的區(qū)別(后一個相對前一個)。
$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index 82e1ccc..1f087a5 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
write a readme.txt
change 1
change 2
-change 3
+change 4
3.4. 撤銷修改
場景1:當(dāng)你改亂了工作區(qū)某個文件的內(nèi)容迎卤,想直接丟棄工作區(qū)的修改時拴鸵,用命令git checkout -- file。該命令使工作區(qū)的文件回到最近一次git add或git commit時的版本蜗搔。
場景2:當(dāng)你不但改亂了工作區(qū)某個文件的內(nèi)容劲藐,還添加到了暫存區(qū)時,想丟棄修改樟凄,分兩步聘芜,第一步用命令git reset HEAD file,就回到了場景1缝龄,第二步按場景1操作汰现。
場景3:已經(jīng)提交了不合適的修改到版本庫時,想要撤銷本次提交叔壤,參考版本回退一節(jié)瞎饲,不過前提是沒有推送到遠(yuǎn)程庫。
3.5. 刪除文件
先在本地刪除文件百新,再使用命令git rm刪掉企软,并且git commit
若錯刪,則使用git checkout -- file恢復(fù)
4. 遠(yuǎn)程倉庫
-
創(chuàng)建SSH Key
??在用戶主目錄下饭望,看看有沒有.ssh目錄仗哨,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件铅辞,如果已經(jīng)有了厌漂,可直接跳到下一步。如果沒有斟珊,打開Shell(Windows下打開Git Bash)苇倡,創(chuàng)建SSH Key:$ ssh-keygen -t rsa -C "youremail@example.com"
??你需要把郵件地址換成你自己的郵件地址,然后一路回車囤踩,使用默認(rèn)值即可旨椒,由于這個Key也不是用于軍事目的,所以也無需設(shè)置密碼堵漱。
??如果一切順利的話综慎,可以在用戶主目錄里找到.ssh目錄,里面有id_rsa和id_rsa.pub兩個文件勤庐,這兩個就是SSH Key的秘鑰對示惊,id_rsa是私鑰好港,不能泄露出去,id_rsa.pub是公鑰米罚,可以放心地告訴任何人钧汹。
- 將密鑰添加到GitHub賬戶中
??登陸GitHub,打開“Account settings”录择,“SSH Keys”頁面拔莱,然后,點(diǎn)“New SSH Key”糊肠,填上任意Title辨宠,在Key文本框里粘貼id_rsa.pub文件的內(nèi)容。
4.1.添加遠(yuǎn)程庫
- 首先货裹,登陸GitHub嗤形,然后,在右上角找到“Create a new repo”按鈕弧圆,創(chuàng)建一個新的倉庫赋兵。
- 在Repository name填入learngit,其他保持默認(rèn)設(shè)置搔预,點(diǎn)擊“Create repository” 按鈕霹期,就成功地創(chuàng)建了一個新的Git倉庫。
- 使用命令
git remote add origin git@server-name:userName/repo-name.git
關(guān)聯(lián)一個遠(yuǎn)程庫拯田,其中origin為遠(yuǎn)程庫的名稱 - 關(guān)聯(lián)后历造,使用命令
git push -u origin master
第一次推送master分支的所有內(nèi)容; - 加上了-u參數(shù)船庇,Git不但會把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支吭产,還會把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來,在以后的推送或者拉取時就可以簡化命令鸭轮。
- 當(dāng)你第一次使用Git的clone或者push命令連接GitHub時臣淤,會得到一個警告,輸入yes即可
- 此后窃爷,每次本地提交后邑蒋,只要有必要,就可以使用命令
git push origin master
推送最新修改按厘;
4.2. 從遠(yuǎn)程庫克隆
$ git clone git@github.com:GuoYuebo/learnGit.git
5. 分支管理
5.1 創(chuàng)建與合并分支
??在版本回退里医吊,你已經(jīng)知道,每次提交逮京,Git都把它們串成一條時間線遮咖,這條時間線就是一個分支。截止到目前造虏,只有一條時間線御吞,在Git里,這個分支叫主分支漓藕,即master分支陶珠。HEAD嚴(yán)格來說不是指向提交,而是指向master享钞,master才是指向提交的揍诽,所以,HEAD指向的就是當(dāng)前分支栗竖。
??一開始的時候暑脆,master分支是一條線,Git用master指向最新的提交狐肢,再用HEAD指向master添吗,就能確定當(dāng)前分支,以及當(dāng)前分支的提交點(diǎn).
??每次提交份名,master分支都會向前移動一步碟联,這樣,隨著你不斷提交僵腺,master分支的線也越來越長:
??當(dāng)我們創(chuàng)建新的分支鲤孵,例如dev時,Git新建了一個指針叫dev辰如,指向master相同的提交普监,再把HEAD指向dev,就表示當(dāng)前分支在dev上:
??假如我們在dev上的工作完成了琉兜,就可以把dev合并到master上凯正。Git怎么合并呢?最簡單的方法呕童,就是直接把master指向dev的當(dāng)前提交漆际,就完成了合并:
??所以Git合并分支也很快!就改改指針夺饲,工作區(qū)內(nèi)容也不變奸汇!合并完分支后,甚至可以刪除dev分支往声。刪除dev分支就是把dev指針給刪掉擂找,刪掉后,我們就剩下了一條master分支:
下面開始實(shí)戰(zhàn):
- 首先浩销,我們創(chuàng)建dev分支贯涎,然后切換到dev分支:
$ git checkout -b dev
Switched to a new branch 'dev'
- git checkout命令加上-b參數(shù)表示創(chuàng)建并切換,相當(dāng)于以下兩條命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
- 用git branch命令查看當(dāng)前分支,git branch命令會列出所有分支慢洋,當(dāng)前分支前面會標(biāo)一個*號:
$ git branch
* dev
master
修改readme.txt塘雳,并使用add和commit提交
-
切換回master分支:
$ git checkout master
切換回master分支后陆盘,再查看一個readme.txt文件,剛才添加的內(nèi)容不見了败明!因?yàn)槟莻€提交是在dev分支上隘马,而master分支此刻的提交點(diǎn)并沒有變
[圖片上傳失敗...(image-a3e556-1519900739501)]
- 把dev分支的工作成果合并到master分支上,git merge命令用于合并指定分支到當(dāng)前分支。合并后妻顶,再查看readme.txt的內(nèi)容酸员,就可以看到,和dev分支的最新提交是完全一樣的讳嘱。注意到上面的Fast-forward信息幔嗦,Git告訴我們,這次合并是“快進(jìn)模式”沥潭,也就是直接把master指向dev的當(dāng)前提交邀泉,所以合并速度非常快叛氨。當(dāng)然呼渣,也不是每次合并都能Fast-forward,我們后面會講其他方式的合并:
$ git merge dev
Updating 1f62bd2..8b89ed2
Fast-forward
readme.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
- 合并完成后寞埠,就可以放心地刪除dev分支了:
$ git branch -d dev
Deleted branch dev (was 8b89ed2).