Git入門

聲明:本文章是作者學習廖雪峯老師的Git教程後所做的簡單總結,詳細的教程請參見廖雪峯的官方網站


一、集中式和分佈式版本控制系統的區別

1、項目代表:

CVS和SVN是集中式的版本控制系統;

Git是分佈式版本控制系統。

2、區別:

集中式版本控制系統中,版本庫是放在中央服務器的,每次工作的時候從中央服務器請求獲取最新的版本,做完工作後再把新的內容推送給中央服務器,最大毛病是必須聯網才能工作,服務器如果出了問題,會直接影響所有人的工作。

相反,分佈式版本控制系統沒有“中央服務器”,每個人的電腦上都是一個完整的版本庫,也就是說工作的時候不需要聯網。分因爲沒有“中央服務器”,布式版本控制系統的安全性要高很多,某一個人的電腦壞掉了不要緊,隨便從其他人那裏複製一個就可以了。

在實際使用分佈式版本控制系統的時候,其實很少在兩人之間的電腦上推送版本庫的修改,因爲可能你們倆不在一個局域網內,兩臺電腦互相訪問不了,也可能今天你的同事病了,他的電腦壓根沒有開機。因此,分佈式版本控制系統通常也有一臺充當“中央服務器”的電腦,但這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣幹活,只是交換修改不方便而已。


二、安裝Git

Linux和Mac OS上安裝我還沒有試過,Windows上安裝Git過程也不復雜,直接從Git官網下載安裝程序,然後默認選項安裝即可

安裝成功後,可以在開始菜單裏找到“Git”->"Git Bash",運行彈出一個命令行窗口,就說明Git安裝成功。可以將“Git Bash”添加到鼠標右鍵,使用起來比較方便。

安裝完成後,需要進行最後一步設置,在命令行輸入:

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

因爲Git是分佈式版本控制系統,所以,每個機器都必須自報家門:你的名字和Email地址。


三、創建版本庫

什麼是版本庫呢?版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裏面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。

創建版本庫分兩步:

1、找個合適的地方,創建一個空目錄;

2、通過git init 命令把這個目錄變成Git可以管理的倉庫。

把文件添加到版本庫步驟:

1、用命令 git add <file> 把文件添加到倉庫,注意,可反覆多次使用,添加多個文件;

2、用命令 git commit 把文件提交到倉庫;

爲了保險起見,可以在GitHub創建一個Git倉庫,讓本地倉庫與GitHub倉庫進行遠程同步,這樣一來,GitHub上的倉庫既可以作爲備份,又可以讓其他人通過該倉庫來協作。

1、登陸GitHub,創建一個新的倉庫;

2、使用命令 git remote add origin git@server-name:path/repo-name.git 來關聯一個遠程庫,注意server-name和repo-name分別是你的GitHub賬戶名和新建的倉庫名,添加後,遠程庫的名字就是origin;

3、關聯後,使用命令 git pushi -u origin master 第一次推送master分支所有的內容;此後,可以使用命令 git push origin master 推送最新的修改。

也可以先創建遠程倉庫,再從遠程倉庫克隆;或者當需要最新一份版本時從遠程倉庫克隆:

1、首先獲取倉庫的地址,然後使用 git clone 命令克隆;

2、克隆完成後再本地工作,然後 通過 add、commit 、push 更新版本;

3、Git支持多種協議,包括https,但通過ssh支持的原生 git 協議速度最快。


四、概念解讀

Git和其他版本控制系統如SVN的一個不同之處就是有暫存區的概念。

工作區:就是你電腦裏能看到的目錄,比如一個項目文件夾就是一個工作區。

版本庫:工作區有一個隱藏目錄 .git ,這個不算在工作區內,而是Git的版本庫。Git的版本庫裏存了很多東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD

Git跟蹤並管理的是修改操作,而非文件,每次修改,如果不用 git add 到暫存區,那就不會加入到 commit 中。


五、本地工作時的常用命令

1、版本回退相關:

  • 使用命令 git reset --hard commit_id 在提交版本之間來回穿梭,注意 HEAD指向的是當前版本,HEAD^指向的是上一個版本,HEAD^^指向上上個版本,HEAD~100表示往上100個版本;
  • 跳轉版本前,用 git log 可以查看提交歷史,確定要回退到哪個版本;
  • git reflog 查看命令歷史,確定要回到未來的哪個版本。

2、撤銷修改:

  • 場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file
  • 場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD <file>,就回到了場景1,第二步按場景1操作。
  • 場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,就只有進行版本回退了,不過前提是沒有推送到遠程庫。
  • git status 命令可以查看倉庫當前的狀態。

3、刪除文件:

  • 使用 git rm file 命令刪除版本庫中的文件,並且進行 git commit 操作;
  • 注意:先手動刪除文件,然後使用git rm <file>和git add<file>效果是一樣的。
  • git checkout其實是用版本庫裏的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
  • 命令git rm用於刪除一個文件。如果一個文件已經被提交到版本庫,那麼你永遠不用擔心誤刪,但是要小心,你只能恢復文件到最新版本,你會丟失最近一次提交後你修改的內容

六、多人協作時常用命令:

  • 查看分支:git branch

  • 創建分支:git branch <name>

  • 切換分支:git checkout <name>

  • 創建+切換分支:git checkout -b <name>

  • 合併某分支到當前分支:git merge <name> 注意:合併分支時,加上--no-ff參數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而fast forward合併就看不出來曾經做過合併。

  • 刪除分支:git branch -d <name>

  • 查看分支合併圖:git log --graph
  • 保存工作現場:git stash
  • 返回工作現場:git stash pop
  • 丟棄一個沒有合併過的分支,可以通過 git branch -D <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,如果有衝突,要先處理衝突。

  • rebase操作可以把本地未push的分叉提交歷史整理成直線;

  • rebase的目的是使得我們在查看歷史提交的變化時更容易,因爲分叉的提交需要三方對比。

  • 命令git tag <tagname>用於新建一個標籤,默認爲HEAD,也可以指定一個commit id;

  • 命令git tag -a <tagname> -m "blablabla..."可以指定標籤信息;

  • 命令git tag可以查看所有標籤。

  • 命令git push origin <tagname>可以推送一個本地標籤;

  • 命令git push origin --tags可以推送全部未推送過的本地標籤;

  • 命令git tag -d <tagname>可以刪除一個本地標籤;

  • 命令git push origin :refs/tags/<tagname>可以刪除一個遠程標籤。


七、總結

學習廖老師,附上一份外國網友製作的Git Cheat Sheet ,建議打印出來備用:

Git Cheat Sheet

再次感謝廖老師如此細緻的教程。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章