Git 基礎
第一章 下載以及使用
下載地址:
1.1配置git
? 在命令行模式里輸入以下命令
? git config --gobal user.name "用戶名"
? git config --gobal user.email "郵箱名"
注:全英文,不能用中文
? 輸入完后檢查是否輸入成功
? git config --list
若:

? 顯示除了user.name 以及 user.email 即輸入成功;
1.2Git理論基礎
##### 1.三顆樹
? 工作區域 暫存區域 Git倉庫

##### 2.Git的工作流程
? 1.在工作目錄中添加,修改文件
? 2.將需要進行版本管理的文件放入暫存區域
? 3.將暫存區域的文件提交到Git倉庫
? Git管理的三種狀態:
? 1.以修改 modified
? 2.以暫存 staged
? 3.已提交 committed
#### 1.3 創建Git項目
? 1.在磁盤中創建一個文件夾MyProject 用來存放你的Git項目
? 2.然后打開命令CMD 進入存放MyProject 的磁盤 , 并用輸入 cd MyProject 進入文件夾
? 3.輸入命令 git init 會顯示初始化了一個空的git倉庫(如圖):
?
并且在文件夾中創建了一個git文件(如圖):
? 
? 4.在當前MyProject文件夾內創建一個md類型的文本(文本名為README) 并以notepad++打開(為防止亂碼,可把notepad++內的編碼格式改為 UTF-8無BOM編碼格式; (即工作流程中的第一步)
? 5.輸入命令: git add README.md (即工作流程中的第二步,將README文件添加至暫存區域)
? 回車之后再輸入: git commit -m "add a readme file" (commit 提交,即工作流程中的第三步,將暫存區域內的README文件提交到git倉庫)
? 引號內是寫入對這次提交做的一個說明(做了什么),
? 顯示如下圖:

?
1.4 git status
作用: 查看此時 git 的狀態
? 輸入 git status 即可查看此時git的狀態 (如圖):
?
? 在一個默認的分區 master 中
? 沒有需要提交的文件,當前的工作目錄是干凈的
1.5添加協議 開源
? 1.在當前文件夾創建一個md (文件名為 LICENSE) ,里面寫MIT的開源協議
? 將README內的內容進行編輯;
? 此時 在 git status 下查看 ,可發現:
?
? 此時發現 , README.md 是已經添加到了暫存區域并提交的
? 而 LICENSE.md 是未被跟蹤的狀態 ( 即在工作區域內的,圓括號內代表git給我們的建議 );
?
? 2.將LECENSE添加至暫存區域并查看狀態
?
?
1.6 git reset HEAD
將LECENSE添加至暫存區域后,會提示出 是否使用 git reset HEAD 的操作(若不 操作則不用理他)
作用: 撤銷上一次的操作 ,返回上一個版本 HEAD表示當前版本 上一個表示HEAD~
是將git倉庫中的內容恢復到暫存區域中
一般 會 HEAD(1100) 這樣寫
? git reset <版本快照 文件名/路徑> 也可以指定文件名
1.git reset --mixed HEAD~ (默認)
? -移動HEAD的指向,將其指向上一個快照
-將HEAD移動后指向的快照回滾到暫存區域
-
git reset --soft HEAD~ (僅僅只是修改了HEAD指針,相當于撤銷git commit 這一步而已
-移動HEAD的指向,將其指向上一個快照
- git reset --hard HEAD~ (同時影響了三顆樹)
? -移動HEAD的指向,將其指向上一個快照
? -將HEAD移動后指向的快照回滾到暫存區域
? -將暫存區域的文件還原到工作目錄
區別詳情請參考1.9的例1
1.7 git checkout
作用1: git checkout --<file> 將暫存區內的文件內容覆蓋工作目錄的文件內容
作用2: git checkout 分支名 切換到指定分區
如在1.5的操作中,我們將LICENSE的這個文件提交到了暫存區域中,在使用git commit -m " add a license file" 命令將其提交到git倉庫;
之后,如果我們對LICENSE內的內容進行編輯或者修改,如將LICENSE協議內首行的<year>換為2017;
( 此時可以理解為LICENSE有倆個版本,一個是最開始在暫存區中的版本(即year),一個是工作目錄下的版本(即2017)
此時,在輸入 git status 來查看git的工作狀態,會提示出
是否將已改動的文本添加至暫存區域中 ;
-
是否將暫存區域中對應的這個文件內容覆蓋工作目錄的文件內容
如下圖( README 和 LICENSE 倆個文件都是改動過的 ):

此時 若輸入git add LICENSE.md 回車
? git commit -m " add a license file"
? 則將暫存庫里和工作目錄中的LICENSE 的內容都修改了
? 若輸入 git checkout -- LICENSE.md
? 則暫存庫里的內容沒被修改,并且工作目錄中的內容也會變為暫存庫中的內容
1.8 git log
作用: 查看歷史提交
歷史提交 最新的提交在最頭上;
? git log --decorate --oneline 只顯示快照的說明 ID 不顯示作者,日期等其他信息(能精簡快照歷史信息)
? --graph 以圖形的方式顯示
? --all 顯示所有的分支
? 如下圖:有倆個分支master feature
?
? d1d14c6表示的是倆個分支共同擁有的
1.9 git reset 和 git checkout 的區別

? 不難看出
? checkout 是將工作區域內的內容恢復成暫存區域
? reset 是將git倉庫內的內容恢復成上一個版本
? 恢復文件:
? checkout 命令和 reset 命令都可以用于恢復指定快照的指定文件,并且他們都不會改變HEAD指針的指向.
? 區別是: reset 命令只將指定文件恢復到暫存區域(--mixed) , 而checkout 命令是同時覆蓋暫存區域和工作目錄.
? ( 如果你想使用 git reset --hard HEAD~ README.md 命令讓reset 同時覆蓋工作目錄,但git會告訴你不行,因為此時,reset不允許使用--soft或者--hard 選項.SO 恢復文件上,reset要安全一些)
? 區別:
? 1.對于reset --hard 命令,checkedout 命令更安全,因為 checkedout 命令在切換分支前會先檢查一下當前的工作狀態,如果不是 "clean"的話,git不會允許你這樣做,而 resert --hard 命令則是直接覆蓋所有數據;
? 2.如何更新HEAD指向, reset 命令會移動 HEAD所在分支的指向,而 checkout 命令只會移動HEAD自身來指向另一個分支.
例1:
? 1.在master 中創建3個txt , 1.txt 2.txt 3.txt 并添加到git 倉庫,
? 2.git checkout -b feature 創建一個分支feature并將指針指向它,
? 3.在分支feature中創建1個名為 feature1.txt 的文件并添加到git倉庫,
? 4.使用 git checkout master 跳回到 master中,再在master中創建1個名為 master1.txt 的文件并添加到git倉庫中,
? 5.再執行 git reset --hard feature 此時查看git log 對比第4步和第5步
?
? 說明: git reset --hard feature命令將HEAD 指向的分支(即master)以及HEAD本身都切到了feature分支里,換句話說,原來的快照已經消失了(master1.txt那個快照不見了).
? 6.此時執行 git reset --soft HEAD~ 和 git reset HEAD~
?
? 說明 : --soft 僅僅將指針HEAD指向了上一個快照, --mixed 也會將指針HEAD指向上一個快照, mixed還會將HEAD指針移動后的快照回滾到暫存區域 此時查看git status:
?
? 說明: 回到了" 還沒有將3.txt 添加到暫存區域 " 時
例子
在E盤創建文件夾MyProject,
在CMD 進入E盤中的MyProject文件夾內: E: 回車 cd MyProject ;
創建空的git倉庫: git init
在MyProject 文件夾內創建README.md 文件
將README.md文件添加到暫存區域: git add README.md
將README.md文件提交到git倉庫: git commit -m " add a readme file";
在MyProject文件夾內創建LICENSE.md文件,并寫上MIT協議
將LICENSE.md文件添加到暫存區域: git add LICENSE.md
修改LICENSE.md文件內的year 改為2017
執行 : git status 彈出: 1. use " git add <file>.." 2. use " git checkout -- <file>.."
執行 : git add LICENSE.md 和 git commit -m " add a license file";
-
執行 : git log 查看歷史記錄:
img11
結構模型:

-
執行 git reset HEAD~ 回車 git status

結構模型

此時,git會檢測到工作區域內的LICENSE版本比暫存區域內的版本新,所以會有提示,是否要更新
第二章 版本對比
1. git diff
a、查看尚未暫存的文件更新了哪些部分,不加參數直接輸入
? git diff
此命令比較的是工作目錄(Working tree)和暫存區域快照(index)之間的差異
也就是修改之后還沒有暫存起來的變化內容。
b、查看已經暫存起來的文件(staged)(即git倉庫中的快照)的差異
? git diff --cached 快照ID 沒加ID名就是和上次提交時的快照之間(HEAD)最新的git倉庫中的快照的差異
? git diff --staged 快照ID
顯示的是下一次commit時會提交到HEAD的內容(不帶-a情況下)
c 比較倆個歷史版本之間的快照
git diff STAID1 STAID2
d.比較 工作目錄(Working tree) 和git倉庫中的快照
git diff STAID(要比較的那個快照的ID名)
第三章 實用小技巧
1.修改最后一次提交
? 情景一: 版本剛一提交(commit)到倉庫,突然想起漏掉倆個文件還沒有添加(add);
? 情景二: 版本剛一提交到倉庫,突然想起版本說明寫得不夠全面,
執行帶 --amend 選項的commit操作 Git就會"更正"最近的一次提交: git commit --amend
? 進入更正界面 大寫I 將要修改的地方修改 esc shift + s 保存并退出 此時查看歷史,發現快照并沒有增加一個,而是在原本的快照基礎上進行了修改
? 若不想修改 大寫Q 輸入q! 回車 退出當前更正界面
2.恢復刪除的文件
? 若在文件夾中不小心將文件刪除,
? git checkout -- <file> 即可看到文件又恢復到了文件夾中
3.從git中刪除文件
? 情形一:
? 若一個文件你已經提交到了git倉庫,想讓它刪除掉并且沒有任何記錄
? 先執行:
? git rm <file>
? 該命令刪除的只是工作目錄和暫存區域的文件,也就是取消跟蹤,在下次提交時不納入版本管理.(但在git倉庫還是會有快照的歷史記錄)
? 再執行:
? git reset --soft HEAD~
? 此時再查看git log 就發現歷史記錄中并沒有剛剛刪除的那個快照;
? 情形二:
? 若一個文件你添加到了暫存區域,之后又對工作區域的文件進行的修改,
? 執行: git rm <file> 時,git 會提示你 此時 暫存區域和工作區域有倆個版本的文件,問要刪除哪一個;
? 若執行: git rm -f <file> git 會將倆個版本都刪除(一個-)
? git rm --cached <file> git會刪除暫存區域, 保留工作區域(倆個-)
#### 4.git重命名文件
? git mv <原來的文件名> <改之后的文件名>
? 例: git mv game.html workgame.html
第四章 Git分支
#### 1:創建分支
? git brance 分支名
? 
#### 2:切換分支
? git checkout 分支名
? git checkout -b feature2 創建并切換到feature2的分支
3.合并分支
? git merge 分支名
? 如此時再master分支中,想將feature 的分支合并過來: git merge feature
? 若不同分支中有相同名稱的文件,文件內容卻不同,此時合并時git會提示有沖突CONFLICT,需要我們人為去合并
? 打開文件將HEAD 內的內容和feature的內容合并起來保存并退出
? 此時再執行 git status 操作, 可發現git提示你git add <file> 執行git add <file>后,執行 git commit -m " add fixed file";
? 執行git log --decorate --oneline --graph --all
? 會發現倆分支合并到了一起
4.刪除分支
? git brand -d 分支名
第五章: 將本地項目上傳到GitHub
? 1.在GitHub上創建一個git 倉庫 : 點Great a new repository;
? 2.在Github上設置好SSH密鑰并創建好git遠程倉庫后,就可以和本地關聯了 在本地git倉庫的命令欄中輸入:
? $ git remote add origin <GitHub上創建好的倉庫的地址>
? 3.將本地庫里的所有內容推送到遠處倉庫(也就是GitHub上了)通過:
? $ git push -u origin master
? 4.由于新建的遠程倉庫是空的 所以第一次推送要加上 -u 等遠程倉庫有了內容之后就可以直接通過:
? $ git push origin master
? 注: 這里有個坑需要注意一下,就是在上面第七步創建遠程倉庫的時候,如果你勾選了Initialize this repository with a README(就是創建倉庫的時候自動給你創建一個README文件),那么到了第九步你將本地倉庫內容推送到遠程倉庫的時候就會報一個failed to push some refs to https://github.com/guyibang/TEST2.git的錯。
? 這是由于你新創建的那個倉庫里面的README文件不在本地倉庫目錄中,這時我們可以通過以下命令先將內容合并以下:
$ git pull --rebase origin master
? 然后你在執行 push 就可以了.