介紹
????Git是一個(gè)開(kāi)源的分布式版本控制系統(tǒng),用以有效、高速的處理從很小到非常大的項(xiàng)目版本管理。git是個(gè)工具,在linux里面也就類(lèi)似gcc這樣的工具一樣,是一個(gè)shell命令。
Git與GitHub區(qū)別
- Git是版本控制工具
- Github是一個(gè)平臺(tái),提供給用戶創(chuàng)建git倉(cāng)儲(chǔ)空間,保存(托管)用戶的一些數(shù)據(jù)文檔或者代碼等。
Git與CVS、SVN的區(qū)別
- Git是分布式版本控制系統(tǒng),代碼提交是在本地的(如此速度就快),當(dāng)然生成補(bǔ)?。╬atch)然后push到遠(yuǎn)程服務(wù)器上是需要聯(lián)網(wǎng)的
- CVS、SVN是集中式版本控制系統(tǒng),代碼提交都是提交到遠(yuǎn)程服務(wù)器上
- CVS、SVN這樣的集中式版本控制系統(tǒng),它的完整代碼倉(cāng)庫(kù)(代碼倉(cāng)庫(kù)不僅僅只包含了代碼,還包含各個(gè)歷史版本的信息等)在中心服務(wù)器上,一旦這個(gè)中心服務(wù)器掛了,也就是完整的代碼倉(cāng)庫(kù)掛了</li>
- Git沒(méi)有中心服務(wù)器的概念,每一個(gè)git客戶端(git節(jié)點(diǎn))都含有一個(gè)完整的代碼倉(cāng)庫(kù)(前提是你之前從遠(yuǎn)程git倉(cāng)庫(kù)fetch過(guò)代碼)
遠(yuǎn)程倉(cāng)庫(kù)、工作區(qū)、版本庫(kù)和暫存區(qū)

遠(yuǎn)程倉(cāng)庫(kù)
????就是在github或者在gitlab上的代碼??梢杂?strong>git pull和git push來(lái)進(jìn)行本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)的同步操作
工作區(qū)(Working Directory)
????從項(xiàng)目中取出某個(gè)版本的所有文件和目錄,用以開(kāi)始后續(xù)工作的叫做工作目錄,也就是工作區(qū)
版本庫(kù)(Repository)
????工作區(qū)有一個(gè)隱藏目錄.git,這個(gè)不算工作區(qū),而是Git的版本庫(kù)。
????Git的版本庫(kù)里存了很多東西,其中最重要的就是稱(chēng)為stage(或者叫index)的暫存區(qū),還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master,以及指向master的一個(gè)指針叫HEAD。
暫存區(qū)(Stage)
????暫存區(qū)就是版本庫(kù)中的一個(gè)區(qū)域,具體參見(jiàn)上面的結(jié)構(gòu)圖
工作區(qū)、版本庫(kù)、暫存區(qū)之間的關(guān)系
- 使用git add把文件從工作區(qū)添加到版本庫(kù)中的暫存區(qū),git add命令可以多次用,或者使用git add file1 file2 ...
- 使用git commit提交代碼,就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支
- 需要提交的文件修改通通放到暫存區(qū)(可能有多次的git add),然后,一次性提交暫存區(qū)的所有修改到當(dāng)前分支(git commit)
版本回退
????前提條件:已經(jīng)執(zhí)行g(shù)it commit命令了,但是沒(méi)有push到遠(yuǎn)程倉(cāng)庫(kù),用以下命令可以回退
????其實(shí)這個(gè)回退就是將本地的HEAD指針移動(dòng)到某個(gè)版本上而已,所以這個(gè)操作是非??斓摹?/p>
回退到上一個(gè)版本
- 在Git中,用HEAD表示當(dāng)前版本,也就是最新的提交3628164...882e1e0,上一個(gè)版本就是HEAD^,上上一個(gè)版本就是HEAD^^,當(dāng)然往上100個(gè)版本寫(xiě)100個(gè)^比較容易數(shù)不過(guò)來(lái),所以寫(xiě)成HEAD~100
- 版本號(hào)沒(méi)必要寫(xiě)全,前幾位就可以了,Git會(huì)自動(dòng)去找。當(dāng)然也不能只寫(xiě)前一兩位,因?yàn)镚it可能會(huì)找到多個(gè)版本號(hào),就無(wú)法確定是哪一個(gè)了
$ git reset --hard HEAD^
HEAD is now at ea34578 add distributed
回退到未來(lái)的某個(gè)版本
- 使用git log命令查看提交記錄,找到需要回退版本的commit id
- 如果在回退以后又想再次回到之前的版本,git reflog 可以查看所有分支的所有操作記錄(包括commit和reset的操作),包括已經(jīng)被刪除的commit記錄
$ git reset --hard 3628164
HEAD is now at 3628164 append GPL
git log則不能查看已經(jīng)刪除了的commit記錄
總結(jié)
- HEAD指向的版本就是當(dāng)前版本,因此,Git允許我們?cè)诎姹镜臍v史之間穿梭,使用命令git reset --hard commit_id
- 穿梭前,用git log可以查看提交歷史,以便確定要回退到哪個(gè)版本
- 要重返未來(lái),用git reflog查看命令歷史,以便確定要回到未來(lái)的哪個(gè)版本
git reset –-soft:回退到某個(gè)版本,只回退了commit的信息,不會(huì)恢復(fù)到index file一級(jí)。如果還要提交,直接commit即可
git reset -–hard:徹底回退到某個(gè)版本,本地的源碼也會(huì)變?yōu)樯弦粋€(gè)版本的內(nèi)容,撤銷(xiāo)的commit中所包含的更改被沖掉
撤銷(xiāo)修改
含義
????命令git checkout -- file意思就是,把file文件在工作區(qū)的修改全部撤銷(xiāo),這里有兩種情況:
- 一種是file自修改后還沒(méi)有被放到暫存區(qū),現(xiàn)在,撤銷(xiāo)修改就回到和版本庫(kù)一模一樣的狀態(tài);
- 一種是file已經(jīng)添加到暫存區(qū)后,又作了修改,現(xiàn)在,撤銷(xiāo)修改就回到添加到暫存區(qū)后的狀態(tài)。
總之,就是讓這個(gè)文件回到最近一次git commit或git add時(shí)的狀態(tài)。
場(chǎng)景
- 場(chǎng)景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容,想直接丟棄工作區(qū)的修改時(shí),用命令git checkout -- file
- 場(chǎng)景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容,還添加到了暫存區(qū)時(shí),想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場(chǎng)景1,第二步按場(chǎng)景1操作</li>
- 場(chǎng)景3:已經(jīng)提交了不合適的修改到版本庫(kù)時(shí),想要撤銷(xiāo)本次提交,版本回退一節(jié),不過(guò)前提是沒(méi)有推送到遠(yuǎn)程庫(kù)
git stash
????場(chǎng)景:當(dāng)你接到一個(gè)修復(fù)一個(gè)代號(hào)101的bug的任務(wù)時(shí),你想創(chuàng)建一個(gè)分支issue-101來(lái)修復(fù)它,但是,當(dāng)前正在dev上進(jìn)行的工作還沒(méi)有提交,Git還提供了一個(gè)stash功能,可以把當(dāng)前工作現(xiàn)場(chǎng)“儲(chǔ)藏”起來(lái),等以后恢復(fù)現(xiàn)場(chǎng)后繼續(xù)工作
git stash list
????查看暫存區(qū)的所有暫存修改記錄
$ git stash list
stash@{0}: WIP on dev: 6224937 add merge
git stash apply stash@{X}
????取出相應(yīng)的暫存
git stash drop stash@{X}
????將記錄列表中取出的對(duì)應(yīng)暫存記錄刪除
git stash pop(推薦)
????取出最近一次暫存并刪除記錄列表中對(duì)應(yīng)記錄
分支管理
| 命令 | 含義 |
|---|---|
| git branch | 查看分支 |
| git branch <name> | 創(chuàng)建分支 |
| git checkout <name> | 切換分支 |
| git checkout -b <name> | 創(chuàng)建+切換分支 |
| git merge <name> | 合并某分支到當(dāng)前分支 |
| git branch -d <name> | 刪除分支 |
Bug分支
????在Git中,由于分支是如此的強(qiáng)大,所以,每個(gè)bug都可以通過(guò)一個(gè)新的臨時(shí)分支來(lái)修復(fù),修復(fù)后,合并分支,然后將臨時(shí)分支刪除。
Feature分支
????添加一個(gè)新功能時(shí),你肯定不希望因?yàn)橐恍?shí)驗(yàn)性質(zhì)的代碼,把主分支搞亂了,所以,每添加一個(gè)新功能,最好新建一個(gè)feature分支,在上面開(kāi)發(fā),完成后,合并,最后,刪除該feature分支。