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