介紹
????Git是一個(gè)開源的分布式版本控制系統(tǒng)板祝,用以有效麻裳、高速的處理從很小到非常大的項(xiàng)目版本管理。git是個(gè)工具祷杈,在linux里面也就類似gcc這樣的工具一樣,是一個(gè)shell命令渗饮。
Git與GitHub區(qū)別
- Git是版本控制工具
- Github是一個(gè)平臺(tái)但汞,提供給用戶創(chuàng)建git倉儲(chǔ)空間,保存(托管)用戶的一些數(shù)據(jù)文檔或者代碼等互站。
Git與CVS私蕾、SVN的區(qū)別
- Git是分布式版本控制系統(tǒng),代碼提交是在本地的(如此速度就快)胡桃,當(dāng)然生成補(bǔ)恫劝取(patch)然后push到遠(yuǎn)程服務(wù)器上是需要聯(lián)網(wǎng)的
- CVS、SVN是集中式版本控制系統(tǒng)翠胰,代碼提交都是提交到遠(yuǎn)程服務(wù)器上
- CVS容贝、SVN這樣的集中式版本控制系統(tǒng),它的完整代碼倉庫(代碼倉庫不僅僅只包含了代碼之景,還包含各個(gè)歷史版本的信息等)在中心服務(wù)器上斤富,一旦這個(gè)中心服務(wù)器掛了,也就是完整的代碼倉庫掛了</li>
- Git沒有中心服務(wù)器的概念闺兢,每一個(gè)git客戶端(git節(jié)點(diǎn))都含有一個(gè)完整的代碼倉庫(前提是你之前從遠(yuǎn)程git倉庫fetch過代碼)
遠(yuǎn)程倉庫茂缚、工作區(qū)、版本庫和暫存區(qū)
遠(yuǎn)程倉庫
????就是在github或者在gitlab上的代碼屋谭〗拍遥可以用git pull和git push來進(jìn)行本地倉庫和遠(yuǎn)程倉庫的同步操作
工作區(qū)(Working Directory)
????從項(xiàng)目中取出某個(gè)版本的所有文件和目錄,用以開始后續(xù)工作的叫做工作目錄桐磁,也就是工作區(qū)
版本庫(Repository)
????工作區(qū)有一個(gè)隱藏目錄.git悔耘,這個(gè)不算工作區(qū),而是Git的版本庫我擂。
????Git的版本庫里存了很多東西衬以,其中最重要的就是稱為stage(或者叫index)的暫存區(qū)缓艳,還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master,以及指向master的一個(gè)指針叫HEAD看峻。
暫存區(qū)(Stage)
????暫存區(qū)就是版本庫中的一個(gè)區(qū)域阶淘,具體參見上面的結(jié)構(gòu)圖
工作區(qū)、版本庫互妓、暫存區(qū)之間的關(guān)系
- 使用git add把文件從工作區(qū)添加到版本庫中的暫存區(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命令了灼狰,但是沒有push到遠(yuǎn)程倉庫宛瞄,用以下命令可以回退
????其實(shí)這個(gè)回退就是將本地的HEAD指針移動(dòng)到某個(gè)版本上而已,所以這個(gè)操作是非辰慌撸快的份汗。
回退到上一個(gè)版本
- 在Git中,用HEAD表示當(dāng)前版本承绸,也就是最新的提交3628164...882e1e0裸影,上一個(gè)版本就是HEAD^,上上一個(gè)版本就是HEAD^^军熏,當(dāng)然往上100個(gè)版本寫100個(gè)^比較容易數(shù)不過來轩猩,所以寫成HEAD~100
- 版本號(hào)沒必要寫全,前幾位就可以了荡澎,Git會(huì)自動(dòng)去找均践。當(dāng)然也不能只寫前一兩位,因?yàn)镚it可能會(huì)找到多個(gè)版本號(hào)摩幔,就無法確定是哪一個(gè)了
$ git reset --hard HEAD^
HEAD is now at ea34578 add distributed
回退到未來的某個(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è)版本
- 要重返未來坡疼,用git reflog查看命令歷史彬呻,以便確定要回到未來的哪個(gè)版本
git reset –-soft:回退到某個(gè)版本,只回退了commit的信息,不會(huì)恢復(fù)到index file一級(jí)闸氮。如果還要提交剪况,直接commit即可
git reset -–hard:徹底回退到某個(gè)版本,本地的源碼也會(huì)變?yōu)樯弦粋€(gè)版本的內(nèi)容蒲跨,撤銷的commit中所包含的更改被沖掉
撤銷修改
含義
????命令git checkout -- file意思就是译断,把file文件在工作區(qū)的修改全部撤銷,這里有兩種情況:
- 一種是file自修改后還沒有被放到暫存區(qū)或悲,現(xiàn)在镐作,撤銷修改就回到和版本庫一模一樣的狀態(tài);
- 一種是file已經(jīng)添加到暫存區(qū)后隆箩,又作了修改,現(xiàn)在羔杨,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)捌臊。
總之,就是讓這個(gè)文件回到最近一次git commit或git add時(shí)的狀態(tài)兜材。
場景
- 場景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容理澎,想直接丟棄工作區(qū)的修改時(shí),用命令git checkout -- file
- 場景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容曙寡,還添加到了暫存區(qū)時(shí)糠爬,想丟棄修改,分兩步举庶,第一步用命令git reset HEAD file执隧,就回到了場景1,第二步按場景1操作</li>
- 場景3:已經(jīng)提交了不合適的修改到版本庫時(shí)户侥,想要撤銷本次提交镀琉,版本回退一節(jié),不過前提是沒有推送到遠(yuǎn)程庫
git stash
????場景:當(dāng)你接到一個(gè)修復(fù)一個(gè)代號(hào)101的bug的任務(wù)時(shí)蕊唐,你想創(chuàng)建一個(gè)分支issue-101來修復(fù)它屋摔,但是,當(dāng)前正在dev上進(jìn)行的工作還沒有提交替梨,Git還提供了一個(gè)stash功能钓试,可以把當(dāng)前工作現(xiàn)場“儲(chǔ)藏”起來,等以后恢復(fù)現(xiàn)場后繼續(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都可以通過一個(gè)新的臨時(shí)分支來修復(fù)俗扇,修復(fù)后硝烂,合并分支,然后將臨時(shí)分支刪除。
Feature分支
????添加一個(gè)新功能時(shí)滞谢,你肯定不希望因?yàn)橐恍?shí)驗(yàn)性質(zhì)的代碼串稀,把主分支搞亂了,所以狮杨,每添加一個(gè)新功能母截,最好新建一個(gè)feature分支,在上面開發(fā)橄教,完成后清寇,合并,最后护蝶,刪除該feature分支华烟。