Git 基礎(chǔ)
第一章 下載以及使用
下載地址:
1.1配置git
? 在命令行模式里輸入以下命令
? git config --gobal user.name "用戶名"
? git config --gobal user.email "郵箱名"
注:全英文,不能用中文
? 輸入完后檢查是否輸入成功
? git config --list
若:
? 顯示除了user.name 以及 user.email 即輸入成功;
1.2Git理論基礎(chǔ)
##### 1.三顆樹
? 工作區(qū)域 暫存區(qū)域 Git倉庫
##### 2.Git的工作流程
? 1.在工作目錄中添加,修改文件
? 2.將需要進(jìn)行版本管理的文件放入暫存區(qū)域
? 3.將暫存區(qū)域的文件提交到Git倉庫
? Git管理的三種狀態(tài):
? 1.以修改 modified
? 2.以暫存 staged
? 3.已提交 committed
#### 1.3 創(chuàng)建Git項(xiàng)目
? 1.在磁盤中創(chuàng)建一個(gè)文件夾MyProject 用來存放你的Git項(xiàng)目
? 2.然后打開命令CMD 進(jìn)入存放MyProject 的磁盤 , 并用輸入 cd MyProject 進(jìn)入文件夾
? 3.輸入命令 git init 會(huì)顯示初始化了一個(gè)空的git倉庫(如圖):
? 并且在文件夾中創(chuàng)建了一個(gè)git文件(如圖):
? ? 4.在當(dāng)前MyProject文件夾內(nèi)創(chuàng)建一個(gè)md類型的文本(文本名為README) 并以notepad++打開(為防止亂碼,可把notepad++內(nèi)的編碼格式改為 UTF-8無BOM編碼格式; (即工作流程中的第一步)
? 5.輸入命令: git add README.md (即工作流程中的第二步,將README文件添加至?xí)捍鎱^(qū)域)
? 回車之后再輸入: git commit -m "add a readme file" (commit 提交,即工作流程中的第三步,將暫存區(qū)域內(nèi)的README文件提交到git倉庫)
? 引號(hào)內(nèi)是寫入對(duì)這次提交做的一個(gè)說明(做了什么),
? 顯示如下圖:
?
1.4 git status
作用: 查看此時(shí) git 的狀態(tài)
? 輸入 git status 即可查看此時(shí)git的狀態(tài) (如圖):
?? 在一個(gè)默認(rèn)的分區(qū) master 中
? 沒有需要提交的文件,當(dāng)前的工作目錄是干凈的
1.5添加協(xié)議 開源
? 1.在當(dāng)前文件夾創(chuàng)建一個(gè)md (文件名為 LICENSE) ,里面寫MIT的開源協(xié)議
? 將README內(nèi)的內(nèi)容進(jìn)行編輯;
? 此時(shí) 在 git status 下查看 ,可發(fā)現(xiàn):
?? 此時(shí)發(fā)現(xiàn) , README.md 是已經(jīng)添加到了暫存區(qū)域并提交的
? 而 LICENSE.md 是未被跟蹤的狀態(tài) ( 即在工作區(qū)域內(nèi)的,圓括號(hào)內(nèi)代表git給我們的建議 );
?
? 2.將LECENSE添加至?xí)捍鎱^(qū)域并查看狀態(tài)
??
1.6 git reset HEAD
將LECENSE添加至?xí)捍鎱^(qū)域后,會(huì)提示出 是否使用 git reset HEAD 的操作(若不 操作則不用理他)
作用: 撤銷上一次的操作 ,返回上一個(gè)版本 HEAD表示當(dāng)前版本 上一個(gè)表示HEAD~
是將git倉庫中的內(nèi)容恢復(fù)到暫存區(qū)域中
一般 會(huì) HEAD(1100) 這樣寫
? git reset <版本快照 文件名/路徑> 也可以指定文件名
1.git reset --mixed HEAD~ (默認(rèn))
? -移動(dòng)HEAD的指向,將其指向上一個(gè)快照
-將HEAD移動(dòng)后指向的快照回滾到暫存區(qū)域
-
git reset --soft HEAD~ (僅僅只是修改了HEAD指針,相當(dāng)于撤銷git commit 這一步而已
-移動(dòng)HEAD的指向,將其指向上一個(gè)快照
- git reset --hard HEAD~ (同時(shí)影響了三顆樹)
? -移動(dòng)HEAD的指向,將其指向上一個(gè)快照
? -將HEAD移動(dòng)后指向的快照回滾到暫存區(qū)域
? -將暫存區(qū)域的文件還原到工作目錄
區(qū)別詳情請(qǐng)參考1.9的例1
1.7 git checkout
作用1: git checkout --<file> 將暫存區(qū)內(nèi)的文件內(nèi)容覆蓋工作目錄的文件內(nèi)容
作用2: git checkout 分支名 切換到指定分區(qū)
如在1.5的操作中,我們將LICENSE的這個(gè)文件提交到了暫存區(qū)域中,在使用git commit -m " add a license file" 命令將其提交到git倉庫;
之后,如果我們對(duì)LICENSE內(nèi)的內(nèi)容進(jìn)行編輯或者修改,如將LICENSE協(xié)議內(nèi)首行的<year>換為2017;
( 此時(shí)可以理解為LICENSE有倆個(gè)版本,一個(gè)是最開始在暫存區(qū)中的版本(即year),一個(gè)是工作目錄下的版本(即2017)
此時(shí),在輸入 git status 來查看git的工作狀態(tài),會(huì)提示出
是否將已改動(dòng)的文本添加至?xí)捍鎱^(qū)域中 ;
-
是否將暫存區(qū)域中對(duì)應(yīng)的這個(gè)文件內(nèi)容覆蓋工作目錄的文件內(nèi)容
如下圖( README 和 LICENSE 倆個(gè)文件都是改動(dòng)過的 ):
此時(shí) 若輸入git add LICENSE.md 回車
? git commit -m " add a license file"
? 則將暫存庫里和工作目錄中的LICENSE 的內(nèi)容都修改了
? 若輸入 git checkout -- LICENSE.md
? 則暫存庫里的內(nèi)容沒被修改,并且工作目錄中的內(nèi)容也會(huì)變?yōu)闀捍鎺熘械膬?nèi)容
1.8 git log
作用: 查看歷史提交
歷史提交 最新的提交在最頭上;
? git log --decorate --oneline 只顯示快照的說明 ID 不顯示作者,日期等其他信息(能精簡快照歷史信息)
? --graph 以圖形的方式顯示
? --all 顯示所有的分支
? 如下圖:有倆個(gè)分支master feature
?? d1d14c6表示的是倆個(gè)分支共同擁有的
1.9 git reset 和 git checkout 的區(qū)別
? 不難看出
? checkout 是將工作區(qū)域內(nèi)的內(nèi)容恢復(fù)成暫存區(qū)域
? reset 是將git倉庫內(nèi)的內(nèi)容恢復(fù)成上一個(gè)版本
? 恢復(fù)文件:
? checkout 命令和 reset 命令都可以用于恢復(fù)指定快照的指定文件,并且他們都不會(huì)改變HEAD指針的指向.
? 區(qū)別是: reset 命令只將指定文件恢復(fù)到暫存區(qū)域(--mixed) , 而checkout 命令是同時(shí)覆蓋暫存區(qū)域和工作目錄.
? ( 如果你想使用 git reset --hard HEAD~ README.md 命令讓reset 同時(shí)覆蓋工作目錄,但git會(huì)告訴你不行,因?yàn)榇藭r(shí),reset不允許使用--soft或者--hard 選項(xiàng).SO 恢復(fù)文件上,reset要安全一些)
? 區(qū)別:
? 1.對(duì)于reset --hard 命令,checkedout 命令更安全,因?yàn)?checkedout 命令在切換分支前會(huì)先檢查一下當(dāng)前的工作狀態(tài),如果不是 "clean"的話,git不會(huì)允許你這樣做,而 resert --hard 命令則是直接覆蓋所有數(shù)據(jù);
? 2.如何更新HEAD指向, reset 命令會(huì)移動(dòng) HEAD所在分支的指向,而 checkout 命令只會(huì)移動(dòng)HEAD自身來指向另一個(gè)分支.
例1:
? 1.在master 中創(chuàng)建3個(gè)txt , 1.txt 2.txt 3.txt 并添加到git 倉庫,
? 2.git checkout -b feature 創(chuàng)建一個(gè)分支feature并將指針指向它,
? 3.在分支feature中創(chuàng)建1個(gè)名為 feature1.txt 的文件并添加到git倉庫,
? 4.使用 git checkout master 跳回到 master中,再在master中創(chuàng)建1個(gè)名為 master1.txt 的文件并添加到git倉庫中,
? 5.再執(zhí)行 git reset --hard feature 此時(shí)查看git log 對(duì)比第4步和第5步
?? 說明: git reset --hard feature命令將HEAD 指向的分支(即master)以及HEAD本身都切到了feature分支里,換句話說,原來的快照已經(jīng)消失了(master1.txt那個(gè)快照不見了).
? 6.此時(shí)執(zhí)行 git reset --soft HEAD~ 和 git reset HEAD~
?? 說明 : --soft 僅僅將指針HEAD指向了上一個(gè)快照, --mixed 也會(huì)將指針HEAD指向上一個(gè)快照, mixed還會(huì)將HEAD指針移動(dòng)后的快照回滾到暫存區(qū)域 此時(shí)查看git status:
?? 說明: 回到了" 還沒有將3.txt 添加到暫存區(qū)域 " 時(shí)
例子
在E盤創(chuàng)建文件夾MyProject,
在CMD 進(jìn)入E盤中的MyProject文件夾內(nèi): E: 回車 cd MyProject ;
創(chuàng)建空的git倉庫: git init
在MyProject 文件夾內(nèi)創(chuàng)建README.md 文件
將README.md文件添加到暫存區(qū)域: git add README.md
將README.md文件提交到git倉庫: git commit -m " add a readme file";
在MyProject文件夾內(nèi)創(chuàng)建LICENSE.md文件,并寫上MIT協(xié)議
將LICENSE.md文件添加到暫存區(qū)域: git add LICENSE.md
修改LICENSE.md文件內(nèi)的year 改為2017
執(zhí)行 : git status 彈出: 1. use " git add <file>.." 2. use " git checkout -- <file>.."
執(zhí)行 : git add LICENSE.md 和 git commit -m " add a license file";
-
執(zhí)行 : git log 查看歷史記錄:
結(jié)構(gòu)模型:
-
執(zhí)行 git reset HEAD~ 回車 git status
![img13](https://github.com/LinDaiDai/guidebooks-to-git/blob/master/basisGitImg/img13.png?raw=truef git\img13.png)
結(jié)構(gòu)模型
此時(shí),git會(huì)檢測(cè)到工作區(qū)域內(nèi)的LICENSE版本比暫存區(qū)域內(nèi)的版本新,所以會(huì)有提示,是否要更新
第二章 版本對(duì)比
1. git diff
a、查看尚未暫存的文件更新了哪些部分,不加參數(shù)直接輸入
? git diff
此命令比較的是工作目錄(Working tree)和暫存區(qū)域快照(index)之間的差異
也就是修改之后還沒有暫存起來的變化內(nèi)容。
b腋妙、查看已經(jīng)暫存起來的文件(staged)(即git倉庫中的快照)的差異
? git diff --cached 快照ID 沒加ID名就是和上次提交時(shí)的快照之間(HEAD)最新的git倉庫中的快照的差異
? git diff --staged 快照ID
顯示的是下一次commit時(shí)會(huì)提交到HEAD的內(nèi)容(不帶-a情況下)
c 比較倆個(gè)歷史版本之間的快照
git diff STAID1 STAID2
d.比較 工作目錄(Working tree) 和git倉庫中的快照
git diff STAID(要比較的那個(gè)快照的ID名)
第三章 實(shí)用小技巧
1.修改最后一次提交
? 情景一: 版本剛一提交(commit)到倉庫,突然想起漏掉倆個(gè)文件還沒有添加(add);
? 情景二: 版本剛一提交到倉庫,突然想起版本說明寫得不夠全面,
執(zhí)行帶 --amend 選項(xiàng)的commit操作 Git就會(huì)"更正"最近的一次提交: git commit --amend
? 進(jìn)入更正界面 大寫I 將要修改的地方修改 esc shift + s 保存并退出 此時(shí)查看歷史,發(fā)現(xiàn)快照并沒有增加一個(gè),而是在原本的快照基礎(chǔ)上進(jìn)行了修改
? 若不想修改 大寫Q 輸入q! 回車 退出當(dāng)前更正界面
2.恢復(fù)刪除的文件
? 若在文件夾中不小心將文件刪除,
? git checkout -- <file> 即可看到文件又恢復(fù)到了文件夾中
3.從git中刪除文件
? 情形一:
? 若一個(gè)文件你已經(jīng)提交到了git倉庫,想讓它刪除掉并且沒有任何記錄
? 先執(zhí)行:
? git rm <file>
? 該命令刪除的只是工作目錄和暫存區(qū)域的文件,也就是取消跟蹤,在下次提交時(shí)不納入版本管理.(但在git倉庫還是會(huì)有快照的歷史記錄)
? 再執(zhí)行:
? git reset --soft HEAD~
? 此時(shí)再查看git log 就發(fā)現(xiàn)歷史記錄中并沒有剛剛刪除的那個(gè)快照;
? 情形二:
? 若一個(gè)文件你添加到了暫存區(qū)域,之后又對(duì)工作區(qū)域的文件進(jìn)行的修改,
? 執(zhí)行: git rm <file> 時(shí),git 會(huì)提示你 此時(shí) 暫存區(qū)域和工作區(qū)域有倆個(gè)版本的文件,問要?jiǎng)h除哪一個(gè);
? 若執(zhí)行: git rm -f <file> git 會(huì)將倆個(gè)版本都刪除(一個(gè)-)
? git rm --cached <file> git會(huì)刪除暫存區(qū)域, 保留工作區(qū)域(倆個(gè)-)
#### 4.git重命名文件
? git mv <原來的文件名> <改之后的文件名>
? 例: git mv game.html workgame.html
第四章 Git分支
#### 1:創(chuàng)建分支
? git brance 分支名
? ![](E:\每日筆記\course of git\img16.png)
#### 2:切換分支
? git checkout 分支名
? git checkout -b feature2 創(chuàng)建并切換到feature2的分支
3.合并分支
? git merge 分支名
? 如此時(shí)再master分支中,想將feature 的分支合并過來: git merge feature
? 若不同分支中有相同名稱的文件,文件內(nèi)容卻不同,此時(shí)合并時(shí)git會(huì)提示有沖突CONFLICT,需要我們?nèi)藶槿ズ喜?/p>
? 打開文件將HEAD 內(nèi)的內(nèi)容和feature的內(nèi)容合并起來保存并退出
? 此時(shí)再執(zhí)行 git status 操作, 可發(fā)現(xiàn)git提示你git add <file> 執(zhí)行g(shù)it add <file>后,執(zhí)行 git commit -m " add fixed file";
? 執(zhí)行g(shù)it log --decorate --oneline --graph --all
? 會(huì)發(fā)現(xiàn)倆分支合并到了一起
4.刪除分支
? git brand -d 分支名
第五章: 將本地項(xiàng)目上傳到GitHub
? 1.在GitHub上創(chuàng)建一個(gè)git 倉庫 : 點(diǎn)Great a new repository;
? 2.在Github上設(shè)置好SSH密鑰并創(chuàng)建好git遠(yuǎn)程倉庫后,就可以和本地關(guān)聯(lián)了 在本地git倉庫的命令欄中輸入:
? $ git remote add origin <GitHub上創(chuàng)建好的倉庫的地址>
? 3.將本地庫里的所有內(nèi)容推送到遠(yuǎn)處倉庫(也就是GitHub上了)通過:
? $ git push -u origin master
? 4.由于新建的遠(yuǎn)程倉庫是空的 所以第一次推送要加上 -u 等遠(yuǎn)程倉庫有了內(nèi)容之后就可以直接通過:
? $ git push origin master
? 注: 這里有個(gè)坑需要注意一下,就是在上面第七步創(chuàng)建遠(yuǎn)程倉庫的時(shí)候讯榕,如果你勾選了Initialize this repository with a README(就是創(chuàng)建倉庫的時(shí)候自動(dòng)給你創(chuàng)建一個(gè)README文件)骤素,那么到了第九步你將本地倉庫內(nèi)容推送到遠(yuǎn)程倉庫的時(shí)候就會(huì)報(bào)一個(gè)failed to push some refs to https://github.com/guyibang/TEST2.git的錯(cuò)。
? 這是由于你新創(chuàng)建的那個(gè)倉庫里面的README文件不在本地倉庫目錄中愚屁,這時(shí)我們可以通過以下命令先將內(nèi)容合并以下:
$ git pull --rebase origin master
? 然后你在執(zhí)行 push 就可以了.