Git —— 目前世界上最先進的分布式版本控制系統,高端大氣上檔次!
一、起步
1、查看是否安裝了Git
$ git --version
如果安裝了Git就會輸出正確的版本號
2、安裝Git
如果已安裝可跳過
方法一、通過HomeBrew來安裝
先安裝HomeBrew(如果已安裝可跳過)
終端執行命令 $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然后安裝git $ brew install git
方法二、你也可以通過下載安裝程序來安裝
3、配置信息
安裝完成之后,需要配置用戶信息
$ git config --global user.name "YoungerLi"
$ git config --global user.email "email@example.com"
注意--global
參數,用了這個參數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當你想針對特定項目使用不同的用戶名稱與郵件地址時,可以在那個項目目錄下運行沒有 --global
選項的命令來配置。
如果想要檢查你的配置,可以使用 git config --list
命令來列出所有 Git 當時能找到的配置。還可以通過輸入 $ git config <key>
來檢查 Git 的某一項配置
$ git config user.name
YoungerLi
二、基礎
1、創建Git倉庫
倉庫即repository,首先選擇一個合適的地方,創建一個空目錄GitTest
,$ cd GitTest
進入到該目錄中,執行
$ git init
瞬間Git就把倉庫建好了,目錄下多了一個.git
的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄里面的文件,不然改亂了,就把Git倉庫給破壞了。
如果你沒有看到.git
目錄,那是因為這個目錄默認是隱藏的,用$ ls -a
命令就可以看見。
還可以克隆現有的倉庫,稍后會在《三、遠程倉庫》里講解
2、倉庫狀態
你的倉庫目錄下的所有文件只有兩種狀態 未跟蹤 或 已跟蹤
未跟蹤 (untracked)的文件不在版本控制范圍內,也就是相當于是外人,不管對該文件做什么都不會被影響,可以說有沒有你都一樣。
已跟蹤 的文件是指那些被納入了版本控制的文件,已跟蹤 的文件又包含3種狀態:未修改(unmodified)、已修改(modified)、已暫存(staged)。
其中未修改和已修改都屬于未暫存,提交的話只提交已暫存狀態。
現在我們在倉庫目錄下創建一個文件
$ touch README.md
檢查當前文件狀態
$ git status
可以看到新建的 README.md 文件出現在
Untracked files
下面,說明這是未跟蹤文件,這時不管你對README.md做什么修改,它的狀態都是Untracked files
,沒有任何影響。
git status
命令的輸出十分詳細,但其用語有些繁瑣。 如果你使用git status -s
命令或git status --short
命令,你將得到一種更為緊湊的格式輸出。
跟蹤文件
$ git add README.md
此時再運行 git status
命令,會看到 README 文件已被跟蹤,并處于暫存狀態
只要是出現在
Changes to be committed
下面,就是已暫存狀態。好了,既然我們已經跟蹤了README.md文件,接下來要做的就是修改該文件了,打開README.md隨便寫上一句話這是一個新建的文件
,然后再執行git status
Changes to be committed
和Changes not staged for commit
下面,說明README.md被暫存之后又被修改了,而Changes not staged for commit
下的README.md就是已修改的狀態,但是還未暫存。Changes to be committed
下的README.md是已暫存狀態,此時提交的話只會提交已暫存狀態的README.md,也就是剛剛修改的README.md文件這是一個新建的文件
并不會被提交上去,所以我們需要暫存剛剛修改的README.md文件。
暫存已修改文件
$ git add README.md
此時再運行 git status
命令,會看到 README 文件只處于暫存狀態
這個時候提交就會把后來修改的都提交上去了。
你發現了沒,跟蹤文件 和 暫存已修改文件的命令一樣都是
git add
,其實這是個多功能命令,可以用它開始跟蹤新文件,或者把已跟蹤的文件放到暫存區,還能用于合并時把有沖突的文件標記為已解決狀態等。
查看已暫存和未暫存的不同
如果你想查看具體修改了什么地方,可以用 $ git diff
命令。
現在我們再次對README.md進行修改,添加一行我又修改了一次
,先不暫存,此時的狀態應該是README.md同時出現在已暫存和已修改下面,然后執行$ git diff
若要查看已暫存的將要添加到下次提交里的內容,可以用
$ git diff --cached
或$ git diff --staged
命令,效果一樣請注意,
$ git diff
本身只顯示尚未暫存的改動,而不是自上次提交以來所做的所有改動。 所以有時候你一下子暫存了所有更新過的文件后,運行 git diff 后卻什么也沒有,就是這個原因。
提交更新
現在我們修改完內容之后就可以提交了,在此之前,務必要執行一次$ git status
確認好要提交的內容是否已添加到暫存區域,然后再執行提交命令
$ git commit
這種方式會啟動文本編輯器以便輸入本次提交的說明,輸入完提交說明保存退出即可完成提交
另外,你也可以在 $ git commit
命令后添加 -m
選項,將提交信息與命令放在同一行
$ git commit -m "first commit"
請記住,提交時記錄的是放在暫存區域的快照。 任何還未暫存的仍然保持已修改狀態,可以在下次提交時納入版本管理。 每一次運行提交操作,都是對你項目作一次快照,以后可以回到這個狀態,或者進行比較。
跳過使用暫存區域
盡管使用暫存區域的方式可以精心準備要提交的細節,但有時候這么做略顯繁瑣。Git 提供了一個跳過使用暫存區域的方式, 只要在提交的時候,給 $ git commit
加上 -a
選項,Git 就會自動把所有已經跟蹤過的文件暫存起來一并提交,從而跳過 $ git add
步驟:
$ git commit -a -m "first commit"
3、查看提交歷史
在提交了若干更新,你也許想回顧下提交歷史。 完成這個任務最簡單而又有效的工具是 $ git log
命令。會按提交時間列出所有的更新,最近的更新排在最上面,現在執行
$ git log
如果想看每次提交的內容差異,可以用
-p
選項
$ git log -p
如果你覺得輸出信息太多,看得眼花繚亂的,可以用
--pretty=oneline
選項,只輸出版本號(類似4534a9...0f6ab
)和提交說明
$ git log --pretty=oneline
經過長時間的開發你的提交次數肯定會越來越多,而你只想看最近幾次提交的歷史,可以用
-n
選項,n為1 2 3...
$ git log -1 //只會顯示你最近一次提交的版本
還可以與-p
一起用
$ git log -p -1 //只會顯示你最近一次提交的版本的內容差異
更多的查看歷史的選項可參考Git查看提交歷史
4、撤銷操作
重新提交
有時候我們提交完了才發現漏掉了幾個文件沒有添加,或者提交信息寫錯了。 此時,可以運行帶有 --amend
選項的提交命令嘗試重新提交
$ git commit --amend
如果你只是提交說明寫錯了,立刻執行這個命令,然后進入編輯模式你會看到之前寫的提交說明,編輯后保存會覆蓋原來的提交信息。
如果你忘記了將要提交的文件放入暫存區,你可以立刻$ git add 你忘記的文件
放入暫存區,然后執行$ git commit --amend
,最終你只會有一個提交,第二次提交將代替第一次提交的結果。
取消暫存文件
如果你想把暫存區的文件取消暫存,也就是提交的時候不想提交某個文件,你可以執行取消暫存的命令,當我們執行$ git status
的時候我們在暫存區下面可以看到提示
git reset HEAD <file>
來取消暫存,所以接下來執行
$ git reset HEAD README.md
即可對該文件取消暫存
撤銷對文件的修改
如果你并不想保留對 README.md 文件的修改怎么辦? 你該如何方便地撤消修改 - 將它還原成上次提交時的樣子或者剛克隆完的樣子或者剛把它放入工作目錄時的樣子? 幸運的是,git status 也告訴了你應該如何做比如撤銷對 README.md 文件的修改
$ git checkout -- README.md
你需要知道
git checkout -- <file>
是一個危險的命令,這很重要。 你對那個文件做的任何修改都會消失 - 你只是拷貝了另一個文件來覆蓋它。 除非你確實清楚不想要那個文件了,否則不要使用這個命令。
退回以前的版本
如果你想回退到上一個版本或者以前的版本也不是不可以的,相當于時光倒退,也就是你想回到的那個版本之后所有更改的東西全部消失(此操作要謹慎)
回退版本所用的命令是$ git reset --hard 版本號
,想回到哪個版本就找到哪個版本的版本號,然后執行此命令。
還有一個方法$ git reset --hard HEAD^
,是回退到上一個版本的快捷方法,此方法不需要知道版本號,用HEAD^^
代表回退到上上個版本,依次類推,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100
(一般用不到),你不會一個個數上100個版本是哪個版本。
一般我們只會回退到上一兩個個版本,不會回退太多,所以$ git reset --hard HEAD^
用的最多。
好的,現在先看一下我提交的歷史,已經提交過3次了
second commit
這一版,執行
$ git reset --hard HEAD^
終端輸出HEAD is now at 98aee01 second commit
可以看到已經回到second commit
了,98aee01
就是此版本的版本號的前幾位(上圖中綠色長串),現在你再看看從上個版本提交之后你所更改的東西全都消失了,我們再來看看提交歷史$ git log
別著急,給你一個后悔藥,我就知道你會后悔的,讓你這么不小心,都說了要謹慎的嘛,讓你后來改的東西再回來,也就是再回到最后一次提交的版本,前提是你要知道最后一版的版本號,看上上圖
third commit
的版本號f4ab157...
,有了這個你就能再穿越回來了,執行
$ git reset --hard f4ab157
版本號沒必要寫全,寫前六七位就可以了,Git會自動去找。當然也不能只寫前一兩位,因為Git可能會找到多個版本號,就無法確定是哪一個了。
現在再看看你的東西是不是又回來了,$ git log
看一下提交歷史是不是也回來了,哈哈!
如果你把終端關閉了,這時你后悔了,想再穿越回來你就看不到最后一版的版本號了,怎么辦的,用$ git reflog
查看命令歷史,根據提交說明找到最后一版的版本號就可以了。
后期會用到遠程服務器,以上執行的版本回退只是針對本地倉庫,而服務器倉庫不變,如果想同步到服務器,執行
$ git push -f -u origin master