由于公司一直用的SVN對(duì)項(xiàng)目進(jìn)行版本管理贮折,所以一直也沒(méi)怎么接觸過(guò)git。雖然我之前有使用碼云私有倉(cāng)庫(kù)管理代碼导街,但是我對(duì)git的操作還停留在git add . git commit -m上耻蛇。直到最近聽(tīng)說(shuō)github的私有倉(cāng)庫(kù)免費(fèi)了,所以我又抽時(shí)間看了下git的基本操作(免費(fèi)使我進(jìn)步朝蜘,哈哈哈~~)恶迈,下面是我整理的筆記,希望對(duì)你有幫助芹务。
基礎(chǔ)部分
初始化git
git init 初始化
檢查狀態(tài)
git status 檢測(cè)文件狀態(tài)(有沒(méi)有被追蹤Untracked)
提交到版本庫(kù)的文件不會(huì)顯示在git status里
GIT四種狀態(tài)
untracked 未被追蹤
modified 表示工作區(qū)修改了某個(gè)文件但是沒(méi)有添加到暫存區(qū)
staged 表示把工作區(qū)修改的文件添加到了暫存區(qū)但是沒(méi)有比較到版本庫(kù)
Commited 表示數(shù)據(jù)被安全的存儲(chǔ)在本地庫(kù)中
GIT三層結(jié)構(gòu)
working directory 工作區(qū)
staging index 暫存區(qū)
git directory(Repository) 版本庫(kù)
提交代碼
git add fileName 追蹤 (從工作區(qū)添加到暫存區(qū))
git add . 追蹤全部本地文件到暫存區(qū)
git commit -m '描述' 提交到版本庫(kù)
告訴git使用者的身份
git config --global user.name yourName
git config --global user.email yourEmail
其他
git config --list 查看git配置情況
git log 查看提交信息(提交人/郵箱)
git help 命令名 (例git help add):將彈出想要查找的命令的文檔
撤銷(xiāo)部分
git add . + git commit -m 'msg == git commit -am 'msg'
例如: git commit -m 'versions 1.0' 提交到版本庫(kù)
這時(shí)候不能使用 'versions 1.0' 再次提交了 如果還想用這個(gè)名字的話 使用↓↓
git commit--amend 撤銷(xiāo)上一次的提交,并將暫存區(qū)的文件重新提交 也可以通過(guò)這個(gè)命令改變版本描述(不改變暫存區(qū)內(nèi)容的情況下)
git checkout -- fileName 編輯器的文件恢復(fù)成了修改前的樣子(最后一次提交)
git checkout -- . 撤銷(xiāo)恢復(fù)全部文件
git reset HEAD fileName 撤銷(xiāo)提交到暫存區(qū) (這的HEAD為頭指針)
此處HEAD也可以換為版本號(hào)(將相應(yīng)版本里的文件拉回到暫存區(qū))
這一步不會(huì)影響工作區(qū)↑↑,想工作區(qū)恢復(fù) 需要使用git checkout -- fileName
Unstaged changes after reset(將改變撤銷(xiāo)暫存);
可以通過(guò)git log 查看各種版本的版本號(hào) 然后通過(guò)版本號(hào)恢復(fù)到某個(gè)版本(這也會(huì)改變HEAD的指向)
git reset 版本號(hào)(commit后面的) 文件名;
再用git checkout -- fileName 拉回來(lái)
刪除部分
git rm fileName:此步操作會(huì)把工作區(qū)的文件連同暫存區(qū)的文件一起被刪除
當(dāng)工作區(qū)的文件或者暫存區(qū)的文件被修改后,想進(jìn)行g(shù)it rm 操作,git會(huì)禁止我們刪除,起到了一個(gè)防止誤刪除的作用蝉绷。
如果想要保留工作區(qū)的文件 那么就要用git rm --cached 文件名 來(lái)僅僅刪除暫存區(qū)的文件
git rm -- cached fileName 在不小心將不需要追蹤的文件添加到暫存區(qū)后,想刪除暫存區(qū)的文件但是不想刪除工作區(qū)的文件很有用
git rm -f fileName 同時(shí)刪除工作區(qū)和暫存區(qū)的文件
mv fileName newFileName 本地(工作區(qū))重命名
mv fileName newFileName 工作區(qū)和暫存區(qū)都重命名
git指針概念
Git指針
當(dāng)提交一個(gè)版本的時(shí)候,就會(huì)有一個(gè)版本號(hào)(V1),這時(shí)候有兩個(gè)指針指向這個(gè)版本,一個(gè)是master(當(dāng)前分支指針),一個(gè)是HEAD(指向當(dāng)前分支的最后一個(gè)版本)
當(dāng)提交了一個(gè)新的版本(V2),master指針和HEAD指針都指向了最新一次的提交(V2),V2有一個(gè)指針指向V1。這的指針是指(文件中有一塊地方保存著其他文件的地址)枣抱,調(diào)用V2的時(shí)候可以直接通過(guò)V2找到V1的地址熔吗,從而調(diào)用V1,以達(dá)到方便的訪問(wèn)V1的目的佳晶,以此類(lèi)推桅狠。
如果在V2版本上創(chuàng)建了一個(gè)分支(D1)的時(shí)候,master分支指針依舊會(huì)指向V2轿秧,新的D1分支指針會(huì)指向新的D1分支,當(dāng)切換到D1分支的時(shí)候,head指針會(huì)切換到D1上,此時(shí)的D1還有一個(gè)指針指向V2中跌。
修改D1分支的時(shí)候,D1和head指針也會(huì)以此類(lèi)推到D2。當(dāng)從D2合并分支到V2的時(shí)候菇篡,會(huì)形成V3分支漩符,V3分支既指向V2分支,又指向D2分支驱还。此時(shí)HEAD和master指針指向V3分支嗜暴。
分支部分
git branch 查看本地分支
git branch -a 查看遠(yuǎn)程分支
git branch branchName 創(chuàng)建新分支
git checkout branchName 切換分支
git branch -d branchName 刪除分支 (此操作必須保證當(dāng)前的分支非想要?jiǎng)h除的那個(gè)分支)
git branch -m branchName newBranchName 修改分支名
git checkout -b branchName 創(chuàng)建分支并切換分支
合并分支
首先切換到主分支(master)
git merge branchName 合并分支
這時(shí)候如果branch和master在相同位置有不同的修改,也就是發(fā)現(xiàn)了沖突的時(shí)候,git會(huì)拋出一個(gè)讓我們來(lái)手動(dòng)解決沖突的錯(cuò)誤↓↓。
automatic merge failed:fix conflicts and then commit result.(自動(dòng)合并失敗:修復(fù)沖突议蟆,然后提交結(jié)果闷沥。)
<<<HEAD到===之間是master分支的內(nèi)容
===到>>>branchName 是branchName分支的內(nèi)容
然后重新git commit -am 'msg' 提交到暫存區(qū)及版本庫(kù);
git diff 比較差異(默認(rèn)比較工作區(qū)和暫存區(qū)文件的差異) 如果沒(méi)有差異是不會(huì)有任何展示的
git diff --staged 比較暫存區(qū)與版本庫(kù)之間的差異
git diff 還可以比較同一個(gè)分支中兩個(gè)不同的版本之間的差異(在版本回退時(shí)非常有用)
版本hash值 最少選擇4個(gè) git默認(rèn)選擇7個(gè) 建議盡量選擇8-10個(gè) 這樣才能保證唯一性
git diff branchName 還可以比較兩個(gè)分支之間的差異
儲(chǔ)存變更部分
比如在branch分支上進(jìn)行修改后,切換到master分支,會(huì)報(bào)一個(gè)
please commit your changes or stash them before you switch branches;(請(qǐng)?jiān)谇袚Q分支之前提交更改或?qū)⑵潆[藏)的錯(cuò)誤,我們使用
git stash 暫存工作區(qū)的修改,然后git會(huì)幫我們自動(dòng)切換到修改前的狀態(tài)
這時(shí)切換分支就不會(huì)報(bào)錯(cuò)了,因?yàn)間it在進(jìn)行分支切換的時(shí)候,主要改變的是版本庫(kù),當(dāng)工作區(qū)有改變的時(shí)候,會(huì)直接將工作區(qū)的改變覆蓋到另外一個(gè)分支上,從而影響另外一個(gè)分支。如果我們使用git stash進(jìn)行封存,git就會(huì)自動(dòng)將工作區(qū)的改變撤銷(xiāo)掉,回到修改前的狀態(tài)(上一次提交后的狀態(tài))咐容。
git stash list 查看當(dāng)前保存了哪些本地文件
git stash apply stash@{0} 返回之前用git stash封存的改變
stash@{0} 里面的0根據(jù)提交git stash的次數(shù)以此類(lèi)推
git stash pop stash@{0} 拉回到暫存區(qū)和本地
此時(shí)再執(zhí)行 git stash list 查看封存的文件時(shí) stash@{0}不見(jiàn)了
也就是說(shuō) git stash pop stash@{0} 是在git stash apply stash@{0}的基礎(chǔ)上,增加了一個(gè)刪除命令舆逃。
也就是說(shuō),返回的同時(shí)戳粒,刪除git stash中的這個(gè)文件的命令路狮。
git stash drop stash@{0} 刪除封存的修改。
綜上 git stash pop stash@{0} = git stash apply stash@{0} + git stash drop stash@{0}
使用遠(yuǎn)程倉(cāng)庫(kù)管理代碼(github/碼云)
git push 遠(yuǎn)程倉(cāng)庫(kù)地址 (分支:可不填) :推送到遠(yuǎn)程倉(cāng)庫(kù)
git pull
如果使用ssh地址
在管理員賬戶使用 ssh-keygen 生成密鑰 文檔后綴為File的為私鑰 后綴為PUB(public的縮寫(xiě)) File為公鑰
然后點(diǎn)擊github→setting→SSH→New SSH key→輸入標(biāo)題/添加公鑰;
此時(shí)就可以用SSH地址拉取了
推代碼到遠(yuǎn)程倉(cāng)庫(kù):
// 方法1:
git push git@github.com:倉(cāng)庫(kù)名稱(chēng)(name/xxx.com.git)
// 方法2:
git push 倉(cāng)庫(kù)地址(https://github.com/name/xxx.com.git)
// 方法3:
git remote add origin(倉(cāng)庫(kù)名 通常使用origin) git@github.com:倉(cāng)庫(kù)名稱(chēng)(name/xxx.com.git);
git remote -v 查看添加的遠(yuǎn)程倉(cāng)庫(kù)
然后使用 git push origin master 推送到遠(yuǎn)程倉(cāng)庫(kù)
git pull 倉(cāng)庫(kù)名 分支名(master) 拉取到本地
讓git不追蹤指定文件
如果有一些文件不想讓git對(duì)它追蹤
touch .gitignore : 在項(xiàng)目目錄下建立一個(gè) .gitignore文件
vim .gitignore 編輯這個(gè)文件
然后把想忽略的文件添加到cmd命令行
或者可以 index.* :忽略所有以index.為開(kāi)頭的文件(支持glob規(guī)則)
也可以在里面加上.gitignore 讓他忽略.gitignore文件
glob規(guī)則:
(*號(hào))匹配零或多個(gè)任意字符
[abc]匹配任何一個(gè)列在方括號(hào)中的字符
(?號(hào))只匹配一個(gè)任意字符
[0-9]/[a-z]匹配范圍
已經(jīng)長(zhǎng)傳到暫存區(qū)/版本庫(kù)的想忽略的文件,可以:
git rm index.html --cached 刪除暫存區(qū)的文件
任何再提交 git commit -m 'msg 提交↑的操作:這時(shí),提交的還是暫存區(qū)的文件,本地仍然是改變這個(gè)index.html,這個(gè)改變并沒(méi)有提交到暫存區(qū),更沒(méi)有到版本庫(kù)
只有將暫存區(qū)里相應(yīng)文件刪除后,忽略才生效 ~