前言
雖說用了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的強大之處就在于,他可以將沖突部分用
常用git命令及注釋
- add #添加文件內容到文件緩存區
- branch #列出、創建或刪除分支
- checkout #檢出一個分支或路徑到工作區
- clone #克隆一個版本庫到一個新目錄
- commit #記錄變更到版本庫
- diff #顯示提交之間、提交和工作區之間等的差異
- fetch #從另外一個版本庫下載對象和引用
- grep #輸出和模式匹配的行
- init #創建一個空的 Git 版本庫或重新初始化一個已存在的版本庫
- log #顯示提交日志
- merge #合并兩個或更多開發歷史
- pull #獲取并合并另外的版本庫或一個本地分支
- push #更新遠程引用和相關的對象
- rebase #本地提交轉移至更新后的上游分支中
- reset #重置當前HEAD到指定狀態
- rm #從工作區和索引中刪除文件
- show #顯示各種類型的對象
- status #顯示工作區狀態
- tag #創建、列出、刪除或校驗一個GPG簽名的 tag 對象