一、Git簡介
1、什麼是git
- git是一個開源的分佈式版本控制系統,用於高效敏捷的管理大小項目代碼。
2、集中式與分佈式
二、安裝 Git
1、Linux 上安裝Git
sudo apt-get install git
或者
sudo apt-get install git-core
2、Windows 上安裝Git
官網 下載 (不過比較慢)
CSDN 下載(Windows 64位系統,Git 版本爲:2.18)
然後按默認選項安裝即可.
查看是否安裝成功:Win + R
-> cmd
-> git
安裝完成後,還需要最後一步設置(你的名字和Email地址),在命令行輸入下面兩條命令:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
三、創建版本庫,並把文件添加到倉庫
版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裏面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
1、創建 Git 版本庫(目錄路徑中最好不要包含中文)
2、把目錄變成Git可以管理的倉庫
然後同級目錄下多了一個.git
的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄裏面的文件,不然改亂了,就把Git倉庫給破壞了。
3、把文件添加到版本庫 git add 文件名
4、用命令git commit
告訴Git,把文件提交到倉庫
簡單解釋一下git commit
命令,-m
後面輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的,這樣你就能從歷史記錄裏方便地找到改動記錄。
git commit
命令執行成功後會告訴你,1 file changed
:1個文件被改動(我們新添加的readme.txt文件);2 insertions
:插入了兩行內容(readme.txt有兩行內容)。
5、總結
初始化一個Git倉庫,使用git init
命令。
添加文件到Git倉庫,分兩步:
- 使用命令
git add <file>
,注意,可反覆多次使用,添加多個文件; - 使用命令
git commit -m <message>
,完成。 commit
可以一次提交很多文件,所以你可以多次add
不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
四、查看狀態、查看不同
修改文件內容,在文件中添加add:2019_1009_11:05
,運行git status
命令看看結果:
git status
命令可以讓我們時刻掌握倉庫當前的狀態,上面的命令輸出告訴我們,readme.txt
被修改過了,但還沒有準備提交的修改。
git diff
這個可以讓我們看到具體修改了什麼內容
總結
- 要隨時掌握工作區的狀態,使用
git status
命令。 - 如果
git status
告訴你有文件被修改過,用git diff
可以查看修改內容。
五、版本回退
如果誤刪了文件,還可以從最近的一個commit
恢復,然後繼續工作,而不是把幾個月的工作成果全部丟失
1、git log
命令顯示從最近到最遠的提交日誌,如果嫌輸出信息太多,看得眼花繚亂的,可以試試加上--pretty=oneline
參數:
2、在Git中,用HEAD
表示當前版本,上一個版本就是HEAD^
,上上一個版本就是HEAD^^
,當然往上100個版本寫100個^
比較容易數不過來,所以寫成HEAD~100
。退回到上一個版本可以使用git reset
命令:
3、返回上次的版本
當要返回到上一次的版本並且沒有版本號(版本 ID)時,Git提供了一個命令git reflog
用來記錄你的每一次命令:
總結:
HEAD
指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id
。- 穿梭前,用
git log
可以查看提交歷史,以便確定要回退到哪個版本。 - 要重返未來,用
git reflog
查看命令歷史,以便確定要回到未來的哪個版本。
六、工作區、暫存區、版本庫
我們把文件往Git版本庫裏添加的時候,是分兩步執行的:
- 第一步是用
git add
把文件添加進去,實際上就是把文件修改添加到暫存區; - 第二步是用
git commit
提交更改,實際上就是把暫存區的所有內容提交到當前分支。
七、撤銷修改
1、git checkout -- <filename>
撤銷![在這裏插入圖片描述]()
命令git checkout -- lemon.txt
意思就是,把lemon.txt
文件在工作區的修改全部撤銷,這裏有兩種情況:
- 一種是
lemon.txt
自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態; - 一種是
lemon.txt
已經添加到暫存區後,又作了修改,現在,撤銷修改就回到添加到暫存區後的狀態。
總之,就是讓這個文件回到最近一次git commit
或git add
時的狀態。
2、git reset HEAD <filename>
撤銷
用命令git reset HEAD <file>
可以把暫存區的修改撤銷掉(unstage),重新放回工作區,當我們用HEAD
時,表示最新的版本。
總結:
- 場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令
git checkout -- file
。 - 場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令
git reset HEAD <file>
,就回到了場景1,第二步按場景1操作。 - 場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考五、版本回退一節,不過前提是沒有推送到遠程庫
八、刪除文件
1、rm <filename>
刪除
查看文件狀態發現:版本庫中的文件並沒有刪除
2、git rm <filename>
刪除
查看文件狀態發現:版本庫中的文件已經刪除
總結
命令git rm
用於刪除一個文件。如果一個文件已經被提交到版本庫,那麼你永遠不用擔心誤刪,但是要小心,你只能恢復文件到最新版本,你會丟失最近一次提交後你修改的內容
九、遠程倉庫(以 CODING 爲例)
遠程倉庫就是可以把自己本地版本庫裏的文件上傳到的服務器倉庫,然後其他人可以通過這臺服務器倉庫提取和提交。
遠程倉庫比較主流的有三個:GitHub、碼雲、CODING
第一步:創建SSH Key
在用戶主目錄下(C:/Users/Administrator),看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa
和id_rsa.pub
這兩個文件,如果已經有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),創建SSH Key:$ ssh-keygen -t rsa -C "[email protected]"
如果一切順利的話,可以在用戶主目錄裏找到.ssh
目錄,裏面有id_rsa
和id_rsa.pub
兩個文件,這兩個就是SSH Key的祕鑰對,id_rsa
是私鑰,不能泄露出去,id_rsa.pub
是公鑰,可以放心地告訴任何人。
第二步:拷貝公鑰
登陸CODING,打開“個人設置”,“SSH 公鑰”頁面, 點擊”新增公鑰“。然後,填上任意Title,在Key文本框裏粘貼id_rsa.pub
文件的內容
第三步:添加遠程庫
新建項目,代碼瀏覽
第四步:從遠程庫克隆
把複製的地址 粘貼到命令行即可
SSH原理:
十、Git 分支
一、創建與合併分支
總結:
Git鼓勵大量使用分支:
- 查看分支:
git branch
- 創建分支:
git branch <name>
- 切換分支:
git checkout <name>
或者git switch <name>
- 創建+切換分支:
git checkout -b <name>
或者git switch -c <name>
- 合併某分支到當前分支:
git merge <name>
- 刪除分支:
git branch -d <name>
二、解決衝突
總結:
- 當Git無法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。
- 解決衝突就是把Git合併失敗的文件手動編輯爲我們希望的內容,再提交。
- 用
git log --graph
命令可以看到分支合併圖。
三、分支管理策略
通常,合併分支時,如果可能,Git會用Fast forward
模式,但這種模式下,刪除分支後,會丟掉分支信息。如果要強制禁用Fast forward
模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息。
$ git merge --no-ff -m "merge with no-ff" dev //準備合併dev分支,請注意--no-ff參數,表示禁用Fast forward
注意:
在實際開發中,我們應該按照幾個基本原則進行分支管理:
- 首先,
master
分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面幹活,那在哪幹活呢?幹活都在dev
分支上,也就是說,dev
分支是不穩定的,到某個時候,比如1.0版本發佈時,再把dev
分支合併到master
上,在master
分支發佈1.0版本;你和你的小夥伴們每個人都在dev
分支上幹活,每個人都有自己的分支,時不時地往dev
分支上合併就可以了。所以,團隊合作的分支看起來就像這樣:
注意:
- Git分支十分強大,在團隊開發中應該充分應用。
- 合併分支時,加上
--no-ff
參數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而fast forward
合併就看不出來曾經做過合併。
四、 Bug 分支
在Git中,由於分支是如此的強大,所以,每個bug都可以通過一個新的臨時分支來修復,修復後,合併分支,然後將臨時分支刪除。
當你接到一個修復一個代號101的bug的任務時,很自然地,你想創建一個分支issue-101
來修復它,但是,等等,當前正在dev
上進行的工作還沒有提交,這時該怎麼辦呢??
Git還提供了一個stash
功能,可以把當前工作現場“儲藏”起來,等以後恢復現場後繼續工作
總結:
- 修復bug時,我們會通過創建新的bug分支進行修復,然後合併,最後刪除;
- 當手頭工作沒有完成時,先把工作現場
git stash
一下,然後去修復bug,修復後,再git stash pop
,回到工作現場; - 在master分支上修復的bug,想要合併到當前dev分支,可以用
git cherry-pick <commit>
命令,把bug提交的修改“複製”到當前分支,避免重複勞動。
五、 Feature 分支
如果做好了的工作需要銷燬的話:$ git branch -d <filename>
如果銷燬失敗。Git友情提醒,filename
分支還沒有被合併,如果刪除,將丟失掉修改,如果要強行刪除,需要使用大寫的-D
參數。。
總結:
- 開發一個新feature,最好新建一個分支;
- 如果要丟棄一個沒有被合併過的分支,可以通過
git branch -D <name>
強行刪除。
六、 多人協作
當你從遠程倉庫克隆時,實際上Git自動把本地的master
分支和遠程的master
分支對應起來了,並且,遠程倉庫的默認名稱是origin
。
要查看遠程庫的信息,用git remote
;或者,用git remote -v
顯示更詳細的信息
推送分支
推送分支,就是把該分支上的所有本地提交推送到遠程庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應的遠程分支上:
$ git push origin master
如果要推送其他分支,比如dev
,就改成:
$ git push origin dev
但是,並不是一定要把本地分支往遠程推送,那麼,哪些分支需要推送,哪些不需要呢?
master
分支是主分支,因此要時刻與遠程同步;dev
分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步;bug
分支只用於在本地修復bug,就沒必要推到遠程了,除非老闆要看看你每週到底修復了幾個bug;- feature分支是否推到遠程,取決於你是否和你的小夥伴合作在上面開發。
總之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,視你的心情而定!
抓取分支
多人協作時,大家都會往master
和dev
分支上推送各自的修改。git clone
當你的小夥伴從遠程庫clone時,默認情況下,你的小夥伴只能看到本地的master
分支。
推送分支:git pull
;如果推送失敗,先用git pull
把最新的提交從origin/dev
抓下來,然後,在本地合併,解決衝突,再推送:
因此,多人協作的工作模式通常是這樣:
- 首先,可以試圖用
git push origin <branch-name>
推送自己的修改; - 如果推送失敗,則因爲遠程分支比你的本地更新,需要先用
git pull
試圖合併; - 如果合併有衝突,則解決衝突,並在本地提交;
- 沒有衝突或者解決掉衝突後,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,則說明本地分支和遠程分支的鏈接關係沒有創建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
這就是多人協作的工作模式,一旦熟悉了,就非常簡單。
總結
- 查看遠程庫信息,使用
git remote -v
; - 本地新建的分支如果不推送到遠程,對其他人就是不可見的;
- 從本地推送分支,使用
git push origin branch-name
,如果推送失敗,先用git pull
抓取遠程的新提交; - 在本地創建和遠程分支對應的分支,使用
git checkout -b branch-name origin/branch-name
,本地和遠程分支的名稱最好一致; - 建立本地分支和遠程分支的關聯,使用
git branch --set-upstream branch-name origin/branch-name
; - 從遠程抓取分支,使用
git pull
,如果有衝突,要先處理衝突。
十一、標籤管理
發佈一個版本時,我們通常先在版本庫中打一個標籤(tag),這樣,就唯一確定了打標籤時刻的版本。
一、創建標籤
在Git中打標籤非常簡單,首先,切換到需要打標籤的分支上;然後,敲命令git tag <name>
就可以打一個新標籤:$ git tag v1.0
;可以用命令git tag
查看所有標籤。
比方說要對add merge
這次提交打標籤,它對應的commit id是f52c633
,敲入命令:$ git tag v0.9 f52c633
注意,標籤不是按時間順序列出,而是按字母排序的。可以用git show <tagname>
查看標籤信息
還可以創建帶有說明的標籤,用-a
指定標籤名,-m
指定說明文字:$ git tag -a v0.1 -m "version 0.1 released" 1094adb
總結:
- 命令
git tag <tagname>
用於新建一個標籤,默認爲HEAD
,也可以指定一個commit id; - 命令
git tag -a <tagname> -m "blablabla..."
可以指定標籤信息; - 命令
git tag
可以查看所有標籤。
二、操作標籤
如果標籤打錯了,也可以刪除:$ git tag -d v0.1
因爲創建的標籤都只存儲在本地,不會自動推送到遠程。所以,打錯的標籤可以在本地安全刪除。
如果要推送某個標籤到遠程,使用命令git push origin <tagname>
;或者,一次性推送全部尚未推送到遠程的本地標籤:$ git push origin --tags
如果標籤已經推送到遠程,要刪除遠程標籤就麻煩一點,先從本地刪除:$ git tag -d v0.9
,然後,從遠程刪除。刪除命令也是push,但是格式如下:$ git push origin :refs/tags/v0.9
總結
- 命令
git push origin <tagname>
可以推送一個本地標籤; - 命令
git push origin --tags
可以推送全部未推送過的本地標籤; - 命令
git tag -d <tagname>
可以刪除一個本地標籤; - 命令
git push origin :refs/tags/<tagname>
可以刪除一個遠程標籤。