前言
雖說用了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,就能確定當前分支,以及當前分支的提交點:
- 每次提交,master分支都會向前移動一步,這樣,隨著你不斷提交,master分支的線也越來越長:
- 當我們建立新的分支,例如dev時,Git新建了一個指標叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上:
- 你看,Git建立一個分支很快,因為除了增加一個dev指標,改改HEAD的指向,工作區的檔案都沒有任何變化!不過,從現在開始,對工作區的修改和提交就是針對dev分支了,比如新提交一次後,dev指標往前移動一步,而master指標不變:
- 假如我們在dev上的工作完成了,就可以把dev合併到master上。Git怎麼合併呢?最簡單的方法,就是直接把master指向dev的當前提交,就完成了合併
- 合併完分支後,甚至可以刪除dev分支。刪除dev分支就是把dev指標給刪掉,刪掉後,我們就剩下了一條master分支:
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的強大之處就在於,他可以將衝突部分用
常用git命令及註釋
- add #新增檔案內容到檔案快取區
- branch #列出、建立或刪除分支
- checkout #檢出一個分支或路徑到工作區
- clone #克隆一個版本庫到一個新目錄
- commit #記錄變更到版本庫
- diff #顯示提交之間、提交和工作區之間等的差異
- fetch #從另外一個版本庫下載物件和引用
- grep #輸出和模式匹配的行
- init #建立一個空的 Git 版本庫或重新初始化一個已存在的版本庫
- log #顯示提交日誌
- merge #合併兩個或更多開發歷史
- pull #獲取併合並另外的版本庫或一個本地分支
- push #更新遠端引用和相關的物件
- rebase #本地提交轉移至更新後的上游分支中
- reset #重置當前HEAD到指定狀態
- rm #從工作區和索引中刪除檔案
- show #顯示各種型別的物件
- status #顯示工作區狀態
- tag #建立、列出、刪除或校驗一個GPG簽名的 tag 物件