Git應用詳解全套視頻教程35課

  • 名稱:Git應用詳解全套視頻教程
  • 分類:電腦基礎(chǔ)  
  • 觀看人數(shù):加載中
  • 時間:2019/7/29 22:22:48

Git應用詳解全套視頻教程35課

一:Git是什么?

  Git是目前世界上最先進的分布式版本控制系統(tǒng)。

二:SVN與Git的最主要的區(qū)別?

  SVN是集中式版本控制系統(tǒng),版本庫是集中放在中央服務器的,而干活的時候,用的都是自己的電腦,所以首先要從中央服務器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服務器。集中式版本控制系統(tǒng)是必須聯(lián)網(wǎng)才能工作,如果在局域網(wǎng)還可以,帶寬夠大,速度夠快,如果在互聯(lián)網(wǎng)下,如果網(wǎng)速慢的話,就納悶了。

  Git是分布式版本控制系統(tǒng),那么它就沒有中央服務器的,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯(lián)網(wǎng)了,因為版本都是在自己的電腦上。既然每個人的電腦都有一個完整的版本庫,那多個人如何協(xié)作呢?比如說自己在電腦上改了文件A,其他人也在電腦上改了文件A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。

 1. Git概念 

1.1. Git庫中由三部分組成 

       Git 倉庫就是那個.git 目錄,其中存放的是我們所提交的文檔索引內(nèi)容,Git 可基于文檔索引內(nèi)容對其所管理的文檔進行內(nèi)容追蹤,從而實現(xiàn)文檔的版本控制。.git目錄位于工作目錄內(nèi)。 

1) 工作目錄:用戶本地的目錄; 

2) Index(索引):將工作目錄下所有文件(包含子目錄)生成快照,存放到一個臨時的存儲區(qū)域,Git 稱該區(qū)域為索引。 

3) 倉庫:將索引通過commit命令提交至倉庫中,每一次提交都意味著版本在進行一次更新。 

1.2. 使用Git時的初始化事項 

1.2.1. Git初始化配置 

1) 配置使用git倉庫的人員姓名 

       git config --global user.name "Your Name Comes Here" 

2) 配置使用git倉庫的人員email 

       git config --global user.email you@yourdomain.example.com 

1.2.2. Git文檔忽略機制 

工作目錄中有一些文件是不希望接受Git 管理的,譬如程序編譯時生成的中間文件等等。Git 提供了文檔忽略機制,可以將工作目錄中不希望接受Git 管理的文檔信息寫到同一目錄下的.gitignore 文件中。 

例如:工作目錄下有個zh目錄,如果不想把它加入到Git管理中,則執(zhí)行: 

       echo “zh” > .gitignore 

       git add . 

有關(guān)gitignore 文件的諸多細節(jié)知識可閱讀其使用手冊:man gitignore 

1.3. Git與Repo的比較 

       Git操作一般對應一個倉庫,而Repo操作一般對應一個項目,即一個項目會由若干倉庫組成。 

例如,在操作整個Recket項目時使用Repo,而操作其中的某個倉庫時使用Git。在包含隱藏目錄.git的目錄下執(zhí)行g(shù)it操作。

2. Git help 

       Git help 獲取git基本命令 

(如果要知道某個特定命令的使用方法,例如:使用Git help clone,來獲取git clone的使用方法)

3. Git本地操作基本命令 

3.1. Git init 

或者使用git init-db。 

創(chuàng)建一個空的Git庫。在當前目錄中產(chǎn)生一個.git 的子目錄。以后,所有的文件變化信息都會保存到這個目錄下,而不像CVS那樣,會在每個目錄和子目錄下都創(chuàng)建一個CVS目錄。 

在.git目錄下有一個config文件,可以修改其中的配置信息。 

3.2. Git add 

將當前工作目錄中更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示記入了版本歷史中,這也是提交之前所需要執(zhí)行的一步。 

可以遞歸添加,即如果后面跟的是一個目錄作為參數(shù),則會遞歸添加整個目錄中的所有子目錄和文件。例如: 

       git add dir1 ( 添加dir1這個目錄,目錄下的所有文件都被加入 ) 

       Git add f1 f2 ( 添加f1,f2文件) 

       git add .      ( 添加當前目錄下的所有文件和子目錄 ) 

3.3. Git rm 

從當前的工作目錄中和索引中刪除文件。 

可以遞歸刪除,即如果后面跟的是一個目錄做為參數(shù),則會遞歸刪除整個目錄中的所有子目錄和文件。例如: 

       git rm –r * (進入某個目錄中,執(zhí)行此語句,會刪除該目錄下的所有文件和子目錄) 

       git rm f1    (刪除文件f1,包含本地目錄和index中的此文件記錄) 

       git rm --ached f1 (刪除文件f1,不會刪除本地目錄文件,只刪除index中的文件記錄;將已經(jīng)git add的文件remove到cache中,這樣commit的時候不會提交這個文件, 適用于一下子添加了很多文件, 卻又想排除其中個別幾個文件的情況.) 

3.4. Git commit 

提交當前工作目錄的修改內(nèi)容。 

直接調(diào)用git commit命令,會提示填寫注釋。通過如下方式在命令行就填寫提交注釋:git commit -m "Initial commit of gittutor reposistory"。 注意,和CVS不同,git的提交注釋必須不能為空,否則就會提交失敗。 

       git commit還有一個 -a的參數(shù),可以將那些沒有通過git add標識的變化一并強行提交,但是不建議使用這種方式。 

每一次提交,git就會為全局代碼建立一個唯一的commit標識代碼,用戶可以通過git reset命令恢復到任意一次提交時的代碼。 

       git commit –-amend –m “message” (在一個commit id上不斷修改提交的內(nèi)容) 

3.5. Git status 

查看版本庫的狀態(tài)。可以得知哪些文件發(fā)生了變化,哪些文件還沒有添加到git庫中等等。 建議每次commit前都要通過該命令確認庫狀態(tài)。 

最常見的誤操作是, 修改了一個文件, 沒有調(diào)用git add通知git庫該文件已經(jīng)發(fā)生了變化就直接調(diào)用commit操作, 從而導致該文件并沒有真正的提交。這時如果開發(fā)者以為已經(jīng)提交了該文件,就繼續(xù)修改甚至刪除這個文件,那么修改的內(nèi)容就沒有通過版本管理起來。如果每次在 提交前,使用git status查看一下,就可以發(fā)現(xiàn)這種錯誤。因此,如果調(diào)用了git status命令,一定要格外注意那些提示為 “Changed but not updated:”的文件。 這些文件都是與上次commit相比發(fā)生了變化,但是卻沒有通過git add標識的文件。 

3.6. Git log 

查看歷史日志,包含每次的版本變化。每次版本變化對應一個commit id。 

       Git log -1 

       -1的意思是只顯示一個commit,如果想顯示5個,就-5。不指定的話,git log會從該commit一直往后顯示。 

       Git log --stat –summary (顯示每次版本的詳細變化) 

在項目日志信息中,每條日志的首行(就是那一串字符)為版本更新提交所進行的命名,我們可以將該命名理解為項目版本號。項目版本號應該是唯一的,默認由 Git 自動生成,用以標示項目的某一次更新。如果我們將項目版本號用作git-show 命令的參數(shù),即可查看該次項目版本的更新細節(jié)。例如: 

1) Git log 

clip_image004 

2)Git show 

clip_image006 

實際上,上述命令并非是真正的進行版本號自定義,只是制造了一個tag對象而已,這在進行項目版本對外發(fā)布時比較有用。 

3.7. Git merge 

把服務器上下載下來的代碼和本地代碼合并。或者進行分支合并。 

例如:當前在master分支上,若想將分支dev上的合并到master上,則git merge dev 

注意:git merge nov/eclair_eocket (是將服務器git庫的eclair_eocket分支合并到本地分支上) 

       git rebase nov/eclair_eocket (是將服務器git庫的eclair_eocket分支映射到本地的一個臨時分支上,然后將本地分支上的變化合并到這個臨時分支,然后再用這個臨時分支初始化本地分支) 

3.8. Git diff 

把本地的代碼和index中的代碼進行比較,或者是把index中的代碼和本地倉庫中的代碼進行比較。 

1) Git diff 

比較工作目錄和Index中的代碼。 

2) Git diff - - cached 

比較index和本地倉庫中的代碼。 

3.9. Git checkout 

3.9.1. 切換到分支 

1) 創(chuàng)建一個新分支,并切換到該分支上 

       Git checkout –b 新分支名 

2)切換到某個已經(jīng)建立的本地分支local_branch 

       Git checkout local_branch 

(使用cat .git/HEAD后,顯示refs:refs/heads/ local_branch) 

3) 切換到服務器上的某個分支remote_branch 

       Git checkout remote_branch 

(遠程分支remote_branch可以通過 git branch –r 列出) 

4) 切換到某個commit id 

       Git checkout commit_id 

(使用cat .git/HEAD后,顯示commit_id) 

5) 切換到某個tag 

       Git checkout tag 

(使用cat .git/HEAD后,顯示tag) 

注意: 除了1)和2)外,其余三種都只是切換到了一個臨時的( no branch )狀態(tài) (this head is detached),這時用 git branch 可以看到處于(no branch)上, cat .git/HEAD 看到指向相應的commit id。 這個(no branch)只是臨時存在的,并不是一個真正建立的branch。 如果此時執(zhí)行2),則這個(no branch)就自動消失了;如果執(zhí)行1), 則創(chuàng)建新分支 new branch,并把這個(no branch)掛到這個新分支上,此時cat .git/refs/heads/new_branch 可以看到已經(jīng)指向了剛才那個commit id。 

3.9.2. 用已有分支初始化新分支 

執(zhí)行下面的命令,在切換到某個已經(jīng)建立的local branch或者某個remote branch或者某個commit id 或者某個tag的同時,創(chuàng)建新分支new_branch,并且掛到這個新分支上。 

1) 切換到某個已經(jīng)建立的本地分支local_branch,并且使用此分支初始化一個新分支new_branch。 

       git checkout –b new_branch local_branch 

2) 切換到某個遠程分支remote_branch,并且用此分支初始化一個新分支new_branch。 

       Git checkout –b new_branch remote_branch 

3) 切換到某個commit id,并建立新分支new_branch 

       Git checkout –b new_branch commit_id 

4) 切換到某個tag,并建立新分支new_branch 

       Git checkout –b new_branch tag 

3.9.3. 還原代碼 

例如 “git checkout app/model/user.rb” 就會將user.rb文件從上一個已提交的版本中更新回來,未提交的工作目錄中的內(nèi)容全部會被覆蓋。

3.10. Git-ls-files 

查看當前的git庫中有那些文件。 

3.11. Git mv 

重命名一個文件、目錄或者鏈接。 

例如:Git mv helloworld.c helloworld1.c (把文件helloworld.c 重命名為 helloworld1.c) 

3.12. Git branch 

3.12.1. 總述 

在 git 版本庫中創(chuàng)建分支的成本幾乎為零,所以,不必吝嗇多創(chuàng)建幾個分支。當?shù)谝淮螆?zhí)行g(shù)it init時,系統(tǒng)就會創(chuàng)建一個名為“master”的分支。 而其它分支則通過手工創(chuàng)建。 

下面列舉一些常見的分支策略: 

創(chuàng)建一個屬于自己的個人工作分支,以避免對主分支 master 造成太多的干擾,也方便與他人交流協(xié)作; 

當進行高風險的工作時,創(chuàng)建一個試驗性的分支; 

合并別人的工作的時候,最好是創(chuàng)建一個臨時的分支用來合并,合并完成后再“fetch”到自己的分支。 

對分支進行增、刪、查等操作。 

注意:分支信息一般在.git/refs/目錄下,其中heads目錄下為本地分支,remotes為對應服務器上的分支,tags為標簽。 

3.12.2. 查看分支 

       git branch 列出本地git庫中的所有分支。在列出的分支中,若分支名前有*,則表示此分支為當前分支。 

       git branch –r 列出服務器git庫的所有分支。 

(可以繼續(xù)使用命令 “ git checkout -b 本地分支名 服務器分支名”來獲取服務器上某個分支的代碼文件)。 

3.12.3. 查看當前在哪個分支上 

       cat .git/HEAD 

3.12.4. 創(chuàng)建一個分支 

1) git branch 分支名 

雖然創(chuàng)建了分支,但是不會將當前工作分支切換到新創(chuàng)建的分支上,因此,還需要命令“git checkout 分支名” 來切換, 

2) git checout –b 分支名 

不但創(chuàng)建了分支,還將當前工作分支切換到了該分支上。 

3.12.5. 切換到某個分支:git checkout 分支名 

切換到主分支:git checkout master 

3.12.6. 刪除分支 

       git branch –D 分支名 

注意: 刪除后,發(fā)生在該分支的所有變化都無法恢復。強制刪除此分支。 

3.12.7. 比較兩個分支上的文件的區(qū)別 

       git diff master 分支名 (比較主分支和另一個分支的區(qū)別) 

3.12.8. 查看分支歷史 

       git-show-branch (查看當前分支的提交注釋及信息) 

       git-show-branch -all(查看所有分支的提交注釋及信息)例如: 

* [dev] d2 

! [master] m2 

-- 

* [dev] d2 

* [dev^] d1 

* [dev~2] d0 

*+ [master] m2 

在上述例子中, “--”之上的兩行表示有兩個分支dev和master, 且dev分支上最后一次提交的日志是“d2”,master分支上最后一次提交的日志是 “m2”。 “--”之下的幾行表示了分支演化的歷史,其中 dev表示發(fā)生在dev分支上的最后一次提交,dev^表示發(fā)生在dev分支上的倒數(shù)第二次提交。dev~2表示發(fā)生在dev分支上的倒數(shù)第三次提交。 

3.12.9. 查看當前分支的操作記錄 

       git whatchanged 

3.12.10. 合并分支 

法一: 

       git merge “注釋” 合并的目標分支 合并的來源分支 

如果合并有沖突,git會有提示。 

例如:git checkout master   (切換到master分支) 

       git merge HEAD dev~2 (合并master分支和dev~2分支)或者:git merge master dev~2 

法二: 

       git pull 合并的目標分支 合并的來源分支 

例如: git checkout master (切換到master分支) 

       git pull . dev~2(合并當前分支和dev~2分支) 

3.13. Git rebase 

一般在將服務器最新內(nèi)容合并到本地時使用,例如:在版本C時從服務器上獲取內(nèi)容到本地,修改了本地內(nèi)容,此時想把本地修改的內(nèi)容提交到服務器上;但發(fā)現(xiàn)服務器上的版本已經(jīng)變?yōu)镚了,此時就需要先執(zhí)行Git rebase,將服務器上的最新版本合并到本地。例如: 

用下面兩幅圖解釋會比較清楚一些,rebase命令執(zhí)行后,實際上是將分支點從C移到了G,這樣分支也就具有了從C到G的功能。 

开远市| 西乡县| 白城市| 崇州市| 清水河县| 大庆市| 腾冲县| 滁州市| 十堰市| 石首市| 五峰| 且末县| 六盘水市| 平泉县| 乌拉特后旗| 革吉县| 朝阳区| 大安市| 北川| 秀山| 册亨县| 兴仁县| 莲花县| 莒南县| 望江县| 宁海县| 鞍山市| 太仆寺旗| 菏泽市| 抚远县| 台南市| 顺昌县| 张北县| 镇远县| 台中市| 友谊县| 银川市| 上林县| 伊金霍洛旗| 彭州市| 南开区|