原來你是這樣的Git

LongTean發表於2017-12-29

前言

雖說用了git 一段時間了,但是卻沒有深入瞭解過,今天隨著廖雪峰大大的git教程來學習一波,順便總結一下,方便以後複習。歡迎大家訪問我的部落格啊

集中式版本管理和分散式版本管理

  • 集中式版本控制系統,版本庫是集中存放在中央伺服器的,而幹活的時候,用的都是自己的電腦,所以要先從中央伺服器取得最新的版本,然後開始幹活,幹完活了,再把自己的活推送給中央伺服器。中央伺服器就好比是一個圖書館,你要改一本書,必須先從圖書館借出來,然後回到家自己改,改完了,再放回圖書館。集中式版本控制系統最大的毛病就是必須聯網才能工作。
  • 分散式版本控制系統根本沒有“中央伺服器”,每個人的電腦上都是一個完整的版本庫,這樣,你工作的時候,就不需要聯網了,因為版本庫就在你自己的電腦上。但是這裡說的不依賴網路,並不是完全不依賴網路就能完成所以的事情,比如讓其他開發人員拿到你的改動,所以說這裡所說的不依賴網路只是相對的,在沒有網路的情況下,可以提交變動到本地的版本庫,但最終還是要依賴網路提交變動讓其他開發人員看到。

安裝

  • linux下:安裝比較簡單,像我使用的deepin(linux的一種發行版)只需要一條 sudo apt-get install git 就可以完成。
  • Mac OS X 上:直接從AppStore安裝Xcode,Xcode整合了Git,不過預設沒有安裝,你需要執行Xcode,選擇選單“Xcode”->“Preferences”,在彈出視窗中找到“Downloads”,選擇“Command Line Tools”,點“Install”就可以完成安裝了。
  • Windows下:從https://git-for-windows.github.io下載,或者國內映象

建立版本庫

  • 版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
    • 在磁碟合適的地方,新建一個目錄
    • 在win下,為了避免不必要的麻煩,建立目錄的路徑不要有中文。
    • 通過git init命令把這個目錄變成Git可以管理的倉庫:
    • 瞬間Git就把倉庫建好了,而且告訴你是一個空的倉庫(empty Git repository),細心的讀者可以發現當前目錄下多了一個.git的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄裡面的檔案,不然改亂了,就把Git倉庫給破壞了。
    • 如果你沒有看到.git目錄,那是因為這個目錄預設是隱藏的,用ls -ah命令就可以看見。

Git基本操作

  • Git提交資料
    • 我們可以簡單的把工作目錄理解成是一個被Git服務程式管理的目錄,Git會時刻的追蹤目錄內檔案的改動,另外在安裝好了Git服務程式後,預設就會建立好了一個叫做master的分支,我們直接可以提交資料到了
    • git add <filename> 或者 git add . 新增到快取區
    • git commit - m 'msg' 提交快取區檔案到本地倉庫
  • Git移除資料
    • 有些時候會向把已經新增到暫存區的檔案移除,但仍然希望檔案在工作目錄中不丟失,換句話說,就是把檔案從追蹤清單中刪除
    • git rm -cache <filename> 將檔案從追蹤區域的快取區域中移除,commit就不會提交了
  • Git移動資料
    • git mv <filename> <newname> 修改檔名稱
  • Git 歷史記錄
    • git log 檢視提交歷史記錄
    • git log -2 檢視最近提交歷史記錄
    • git log -p -1 -p顯示每次提交的內容差異,-1表示最近一次
    • git log stat -2 -stat簡要顯示增改行數,這樣可以看到修改過的內容,對檔案新增或移動的行數,並列出增減的概要資訊
  • Git 版本回退
    • git log 可以檢視提交歷史,以便確定要回退到哪個版本,用 commit id 來回退
    • git reset --hard HEAD^ ^表示退回上一版本,^^ 上兩版本 HEAD~100上100版本
    • git reset --hard commit_id 任意之前版本
  • Git 版本前進
    • git reflog 同上
  • Git 撤銷修改
    • git checkout -- file
    • git checkout -- readme.txt意思就是,把readme.txt檔案在工作區的修改全部撤銷,這裡有兩種情況:
      • 一種是readme.txt自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
      • 一種是readme.txt已經新增到暫存區後,又作了修改,現在,撤銷修改就回到新增到暫存區後的狀態。
    • 總之,就是讓這個檔案回到最近一次git commit或git add時的狀態。
  • Git 刪除檔案
    • git rm <filename>
    • 如果誤刪 git checkout -- <filename>恢復道這個檔案最後commit 那個版本
  • Git 建立與合併分支
    • 我們知道,每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,只有一條時間線,在Git裡,這個分支叫主分支,即master分支。HEAD嚴格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當前分支。
    • 一開始的時候,master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能確定當前分支,以及當前分支的提交點:
      1.png
    • 每次提交,master分支都會向前移動一步,這樣,隨著你不斷提交,master分支的線也越來越長:
    • 當我們建立新的分支,例如dev時,Git新建了一個指標叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上:
      2.png
    • 你看,Git建立一個分支很快,因為除了增加一個dev指標,改改HEAD的指向,工作區的檔案都沒有任何變化!不過,從現在開始,對工作區的修改和提交就是針對dev分支了,比如新提交一次後,dev指標往前移動一步,而master指標不變:
      3.png
    • 假如我們在dev上的工作完成了,就可以把dev合併到master上。Git怎麼合併呢?最簡單的方法,就是直接把master指向dev的當前提交,就完成了合併
      4.png
    • 合併完分支後,甚至可以刪除dev分支。刪除dev分支就是把dev指標給刪掉,刪掉後,我們就剩下了一條master分支:
      5.png
    • git checkout -b dev 建立一個新分支並切換到Dev分支
    • git branch 檢視當前分支及所有分支
    • git branch <name> 建立分支
    • git checkout 切換分支
    • git merge <name>合併某分支到當前分支
    • git branch -d <name> 刪除分支
  • Git解決衝突
    • git的強大之處就在於,他可以將衝突部分用 <<<<<<<=======>>>>>>>標記出來,當手動解決衝突後,提交合並。
    • 可以使用git log --graph檢視分支合併圖

常用git命令及註釋

  • add #新增檔案內容到檔案快取區
  • branch #列出、建立或刪除分支
  • checkout #檢出一個分支或路徑到工作區
  • clone #克隆一個版本庫到一個新目錄
  • commit #記錄變更到版本庫
  • diff #顯示提交之間、提交和工作區之間等的差異
  • fetch #從另外一個版本庫下載物件和引用
  • grep #輸出和模式匹配的行
  • init #建立一個空的 Git 版本庫或重新初始化一個已存在的版本庫
  • log #顯示提交日誌
  • merge #合併兩個或更多開發歷史
  • pull #獲取併合並另外的版本庫或一個本地分支
  • push #更新遠端引用和相關的物件
  • rebase #本地提交轉移至更新後的上游分支中
  • reset #重置當前HEAD到指定狀態
  • rm #從工作區和索引中刪除檔案
  • show #顯示各種型別的物件
  • status #顯示工作區狀態
  • tag #建立、列出、刪除或校驗一個GPG簽名的 tag 物件

相關文章