一.基本操作
1.創建本地倉庫
在對應文件目錄下進行:
git init
輸入完上面的代碼,所在文件目錄下就會多一個名為 .git 的隱藏文件,該文件是Git用來跟蹤和管理倉庫的。
我們可以使用 tree 命令(注意要先下載tree插件)來查看 .git 文件的細節:
創建完后我們一定要配置配置Git,設置用戶名和郵箱地址:
git config [--global] user.name "***"
git config [--global] user.email "***"
global是一個選擇選擇項,填上這個表示這臺機器上所有的Git倉庫都會使用這個用戶名和郵箱地址。
能設置自然也能刪除配置:
git config [--global] --unset user.namegit config [--global] --unset user.email
了解完配置與刪除,我們可以使用下面的命令來查看配置:
git config -l
2.工作區、暫存區、版本庫(重要)
工作區:我們在本地的目錄;
暫存區(stage、index):一般存放在 .git 目錄下的index文件;
版本庫:隱藏目錄 .git 。
我們在本地,也就是工作區創建的文件,可以通過add操作將文件上傳到暫存區;我們可以使用commit命令將暫存區的文件上傳到版本庫中。從這里也可以看出,我們新創建的文件沒有經過add和commit命令是沒有添加到倉庫中的。
//指定文件名,可寫多個,用空格隔開
git add 文件名
//所有文件
git add .
通過這里的學習也解開了我之前的疑惑,那就是我在提交文件名有空格的文件時一直報錯,原來用了空格表示不是一個文件了。如果真有空格,可以使用引號括起來;也可以使用 \ 來轉義空格。
git commit -m "信息"
//指定文件到版本庫中
git commit 文件名 -m "信息"
這里是信息指的是本次提交的細節。
通過上面兩個步驟我們就將代碼提交到版本庫里了。我們可以使用下面的命令來查看歷史提交記錄:
git log [--pretty=oneline]
--pretty=oneline 是一個可選項,加上這個會使歷史提交記錄顯示的更加簡潔。
通過上面的命令我們會得到下面的內容:
4e65c55222473e05e72338d3ba75a101a6a56d56 First commit
前面這一堆數字和字母是commit id,這個很重要,下面會說到。
在使用上面的 tree .git 命令查看,我們可以看到objects中存入了commit id。
?在最上面的那張圖上我們可以看到head指向master,我們查看以下master的內容,發現:
4e65c55222473e05e72338d3ba75a101a6a56d56
其中存著的正是上面的commit id。這個master存的正是最新的commit id。
下面著重說一下objects。
對一開始那張圖進行補充:
objects 為Git的對象庫,里面包含了創建的各種版本庫對象及內容。
我們使用:ls .git/objects/ 來查看objects中的文件:
4e 70 e6 info pack
為什么是這個,其實從樹上就能得到答案。
我們可以通過:git cat-file 命令來查看版本庫中的內容:
輸入下面的命令:
git cat-file -p 4e65c55222473e05e72338d3ba75a101a6a56d56
我們得到了:
tree 70ea63592ac4de5f9aec6b15273c4dd5cc0cd00f
3.修改文件
查看在上次提交之后是否有對文件進行再次修改:
git status
查看工作區文件與暫存區或版本庫文件的差異:
//工作區與暫存區差異
git diff [文件]
//工作區與版本庫差異
git diff HEAD -- [文件]
4.版本回退
git reset 命令用于回退版本,其后面還有幾個可選項:
git reset [--soft | --mixed | --hard] [HEAD]
工作區 | 暫存區 | 版本庫 | 選項 | |
原本 | file1、file2 | file1、file2 | file1、file2 | |
回退后 | file1、file2 | file1、file2 | file1 | --soft |
回退后 | file1、file2 | file1 | file1 | --mixed |
回退后 | file1 | file1 | file1 | --hard |
其中?--mixed?是默認選項。
上面表格不難理解,舉個例子如果我們使用了 --soft,那么只有版本庫回退了,工作區和暫存區都沒有回退。
HEAD選項:
commit id | 回退到指定版本 |
HEAD | 表示當前版本 |
HEAD^ | 表示上一個版本 |
HEAD~1 | 表示上一個版本 |
HEAD~2 | 表示上上一個版本 |
5.刪除文件
刪除工作區和暫存區的文件:
git rm 文件名
二.分支管理
1.分支是什么
每次commit,git會根據時間形成一條“時間線”,這條時間線就是分支。git里面有一條主分支,master分支。HEAD指向master。
2.基本操作
1)查看分支
git branch
2)創建分支
git branch 分支名
比如我們創建一個dev分支:
此時再查看分支:
3)切換分支
git checkout 分支名
切換完后,HEAD就會指向切換的分支,比如我們切換到了dev分支:
?如果這個時候我們修改了某個文件,并且add和commit了,那么就會變成這樣:
如果此時我們切回master,打開剛剛修改文件,我們就會發現文件沒有被修改。原因從圖上也能看出,master跟dev指向的根本就不是一個東西。修改的只是dev分支的文件,master分支沒有被修改。
4)合并分支
像剛剛上面的例子,只有dev分支文件被修改了,我們想要將這個修改合并到master分支。
第一步,我們要先切換到master分支。
第二步,合并:
git merge dev
5)刪除分支
git branch -d 分支名
這里要注意,我們要刪除某一個分支,HEAD一定不能指向這個分支,如果指向這個分支是刪不了的。
還有,如果這個分支的沒有被合并,這個時候使用上面的方法是刪不掉分支的,我們要這樣寫強制刪除分支:
git branch -D 分支名
3.合并沖突
我們在dev分支修個了file1文件,同時也在master分支修改了file1文件,如果將這兩個分支合并就會發生沖突,git根本就不知道該聽誰的,是要dev分支的修改還是master分支的修改。這就是合并沖突。
我們的解決辦法也很原始,手動刪。
當出現沖突報錯后,再打開file1文件就會發現文件內容變成這樣了:
?<<< ==== >>>這些符號是用來向我們區分不同分支的沖突的。我們只需要留下我們真正需要的內容即可。
修改完后我們要再次add和commit一次,這個一定不能漏。
我們使用下面的命令也可以參看到這個結構:
git log --graph --pretty=oneline --abbrev-commit
4.合并模式
在沒有合并沖突的情況下,git會優先使用Fast forward模式。這個模式有一個問題,在我們刪除合并完刪除分支后,會丟失分支信息,我們無法知道最新的commit是不是合并出來的。
為了解決這個問題,我們要使用普通模式:
git merge --no-ff -m "" 分支名
三.遠程操作
前面的操作其實都是在本地操作的,我們在實際開發時,不可能所有人都在一臺設備上操作,每個人一臺獨立的設備,都在自己的設備上進行開發。這個時候就需要一個遠程倉庫,每個將寫的代碼提交到遠程倉庫中,遠程倉庫可以自己搭建,也可以是使用GitHub或Gitee等。
下面使用Gitee做示范。
1.克隆遠程倉庫
打開右上角克隆/下載,里面會有:
為什么可以選擇使用上面的地址克隆。
這里只以HTTPS和SSH為例。
對于HTTPS,操作很簡單,只需要將上面的地址復制:
git clone 地址
2.推送到遠程倉庫
將遠程克隆到本地后,我們可以使用命令將本地倉庫的代碼推送到遠程倉庫中:
git push 遠程主機名 本地分?名:遠程分?名# 如果本地分?名與遠程分?名相同,則可以省略冒號
git push 遠程主機名 本地分?名
比較常見的就是下面這個:
git push origin master
3.拉取遠程倉庫
如果別人修改了代碼并提交到遠程倉庫,我們要與遠程倉庫的代碼同步,這個時候就要使用拉取操作了:
git pull 遠程主機名 本地分?名:遠程分?名# 如果本地分?名與遠程分?名相同,則可以省略冒號
git pull 遠程主機名 本地分?名
git pull 命令其實執行了兩個操作,一個是從遠程倉庫拉取代碼,一個是與本地分支合并。
4.配置git
1)忽略特殊文件
在我們初始化倉庫的時候,我們添加了一個 .gitignore文件:
寫入這個文件的文件在使用 git add . 時就不會一起提交了。
比如我們想忽略所有 .ini 結尾的文件,那么我們就可以寫:
*.ini
如果我們在忽略的文件中 a.ini 我們是想讓其提交的,這個時候我們可以寫:
*.ini
!a.ini
2)命令配置別名
比如我們想給 git status 起一個別名:
git config [--global] alias.st status
此時我們使用 git st 與使用 git status 的效果是一樣的。
我們配置完命令后,原來的命令還是可以用的,其與我們的配置是并存的。
四.標簽管理
標簽tag,可以簡單的理解是某次commit的一個標識,相當于起了一個別名。
1.創建標簽
先切換到要創建標簽的分支,然后創建標簽:
git tag 標簽名
創建完后我們可以使用 git tag 來查看我們創建的標簽,但是要注意標簽不是按時間順序列出,而是按字母排序的。
2.操作標簽
刪除本地標簽:
git tag -d 標簽名
刪除遠程倉庫標簽:
git push origin :refs/tags/標簽名
將本地標簽推送到遠程倉庫:
?
git push origin 標簽名
# 將全部標簽推送
git push origin --tags