本文大致描述了Git的操作過程(Windows實現的,少部分與Linux不同)......
安裝
- 在 windows 上安裝
Git
:- 訪問官網,直接從官網上下載:Git
- 安裝完成之後,滑鼠右鍵,如果出現了
Git Bash Here
,則說明安裝成功 - 輸入以下內容查閱版本號也可以驗證安裝是否成功
git --version
- 因為
Git
是分散式版本控制系統,所以在安裝之後必須關聯到自己的使用者名稱和郵箱上$ git config --global user.name "xxx" $ git config --global user.email "xxx@xxx.com"
- 注意:
git config
命令的--global
參數列示的是,你這臺電腦上,所有的Git倉庫都會使用這個配置,
當然,你也可以對某個倉庫指定特定的使用者名稱和郵箱,即:$ git config user.name "xxx" $ git config user.email "xxx"
- 注意:
- 檢視與修改:
- 檢視使用者名稱與郵箱
$ git config user.name $ git config user.email
- 修改使用者名稱與郵箱其實與建立時的操作一樣的,可以想象成你建立的新使用者名稱以及郵箱覆蓋掉了之前的
- 檢視使用者名稱與郵箱
建立版本庫
- 版本庫 即 倉庫,倉庫裡面的所有檔案都由Git管理,Git能跟蹤每個檔案的更、刪、改,以便隨時還原到某個時刻
- 建立版本庫方法:
- 建立一個新資料夾,比如我在桌面新建一個
project
(在Windows系統中請保持英文名稱,以免出現莫名其妙的錯誤) - 然後:右鍵 -> 選擇
Git Bush here
- 輸入
git init
,即可把這個資料夾變為Git可以管理的倉庫 - 當然,現在還只是一個“看起來為空的倉庫”,其實,建立成功之後,會在該倉庫中生成一個隱藏的資料夾:
.git
資料夾 - 現在我們來用
cmd
看一下這個.git
資料夾裡面有什麼:- 在對應的資料夾路徑下面,輸入
dir/a:h
,檢視隱藏檔案 - 輸入
cd .git
,進入對應的.git
檔案目錄下面 - 輸入
dir
,看裡面的檔案
- 在對應的資料夾路徑下面,輸入
- 需要注意的是,這個
.git
目錄是Git用來跟蹤管理版本庫的,emm,不要碰為好
- 建立一個新資料夾,比如我在桌面新建一個
把檔案新增到版本庫
假設現在我們在上述的版本庫
project
下新增一個名為first.txt
,內容為My first text
的檔案。
- 第一步:用
git add
新增檔案
- 新建檔案
first.txt
,內容為My first text
- 在
project
路徑下輸入命令:$ git add first.txt
- 如果沒有任何提示,這個過程就默默地結束了,那麼恭喜你,成功了,Unix的哲學是“沒有訊息就是好訊息”
- 注:
git add
後面可以跟多個檔案,甚至是不同型別的檔案,如:$ git add a.txt b.doc
- 而下面提到的
git commit -m "xxx"
一次性可提交多個檔案- 第二步:用
git commit -m "xxx"
把檔案提交到倉庫$ git commit -m "xxx"
- 注:未報錯即為提交成功,這裡引號內的內容是對這次提交的註釋,即對本次提交的說明
- 只用
git commit -m
會報錯:error: switch 'm' requires a value
,因此,強烈建議寫上有意義的內容,這對閱讀者更友好
穿梭過去,回到未來
- 我們已經學會了新增和提交,其實
commit
就像一個快照一樣,一旦你把檔案改亂了,或者誤刪了檔案,還可以從最近的一個commit
恢復,然後繼續工作,而不是把幾個月的工作成果全部丟失 - 實際生活中,我們也不可能把每次的修改都記住,當然,這一點在Git上面完美解決了,我們可以用
git log
檢視我們的歷史記錄:$ git log
git log
命令顯示從最近到最遠的提交日誌- 如果嫌輸出資訊太多,看得眼花繚亂的,可以試試加上
--pretty=oneline
引數:$ git log --pretty=oneline
- 注:那一大串的字元,其實是
commit id
(版本號),每提交一個新版本,實際上Git就會把它們自動串成一條時間線
- 現在呢,我們啟動時光穿梭機,準備把
first.txt
回退到上一個版本,怎麼做呢?- 首先,Git必須知道當前版本是哪個版本,在Git中,用
HEAD
表示當前版本,用HEAD^
就表示上一個版本,HEAD^^
表示上上個版本,以此類推 - 其實,
git reset
命令可以做到:$ git reset --hard HEAD^
- 注:當然,還可以繼續回退哈
- 首先,Git必須知道當前版本是哪個版本,在Git中,用
- 現在應該被還原了,我們用
git log
檢視現在版本庫的狀態,細心點會發現,怎麼沒有了最後的版本呢?那豈不是我只能回去不能回來?- 其實辦法是有的,如果你的命令視窗沒有關閉的話,你可以在回退之前找到那個最後的版本,比如我這裡是
dca7d8f1f6d06405f7395712f17d1c83a410cf82
- 然後,我只需要
git reset
到那個版本去即可:$ git reset --hard dca7
- 注:
hard
後面跟的是版本號,這裡的版本號不需要寫全,Git會自動尋找(當然也不能只寫前面一兩個字母,以免多個版本號無法確定是哪一個)
- 其實辦法是有的,如果你的命令視窗沒有關閉的話,你可以在回退之前找到那個最後的版本,比如我這裡是
- Git的版本回退速度非常快,因為Git在內部有個指向當前版本的
HEAD
指標,當你回退版本的時候,Git僅僅是把HEAD從指向你指定的版本號 - 現在,你回退到了某個版本,但是關閉了電腦,開啟電腦之後想恢復到新版本怎麼辦?找不到新版本的commit id怎麼辦?
- Git提供了一個命令
git reflog
用來記錄你的每一次命令:$ git reflog
- 現在找到了版本號,就可以穿梭到過去未來啦
- Git提供了一個命令
檢視狀態與追蹤修改
- 之前我們已經成功地新增並提交了一個
first.txt
檔案,現在,我們對該檔案做一些修改,但是我們並不著急提交到Git上去 - 我們嘗試著在命令列裡面輸入
$ git status
- 情況如下:
git status
告訴我們:first.txt
被修改了,但是這個修改之後的檔案並未提交- 那麼如何檢視修改的具體情況呢?答案是
git diff
:$ git diff first.txt
- 那麼,現在我們重新刷一遍流程:
git add first.txt
新增修改後的檔案(先新增才能提交,否則會報錯)git commit -m "..."
提交修改後的檔案git status
檢視狀態
工作區和暫存區
- 什麼是工作區?
- 工作區就是你能看到的目錄
- 前面提到過,
.git
是Git的版本庫,Git版本庫中存放了很多東西,其中最重要的就是:- 暫存區:
stage
(有時也把暫存區叫做索引,所以暫存區也叫index
) - Git自動建立的一個分支:
master
- 指向 master 的一個指標:
HEAD
- 暫存區:
- 下面這幅圖表示了工作區、暫存區之間的關係:
- 左側為工作區,右側為版本庫,在版本庫中標記為
index
的區域是暫存區,標記為master
的是master分支所代表的目錄樹 - 此時
HEAD
實際是指向 master 分支的一個"遊標"。所以圖示的命令中出現HEAD的地方可以用master來替換 - 圖中的
objects
標識的區域為 Git的物件庫,實際位於 ".git/objects" 目錄下,裡面包含了建立的各種物件及內容
- 左側為工作區,右側為版本庫,在版本庫中標記為
stage
與git add
,git commit
的聯絡:- 前面的
git add
用來新增檔案,實際上就是把檔案新增到暫存區,同時,工作區修改(或新增)的檔案內容被寫入到物件庫中的一個新的物件中,而該物件的ID被記錄在暫存區的檔案索引中 - 之後的
git commit
用來提交檔案,實際上就是把暫存區中的內容提交到當前分支,暫存區的目錄樹寫到版本庫(物件庫)中,master 分支會做相應的更新 - 由於Git自動建立了一個分支:
master
,所以現在git commit
就是往master
分支上提交更改 - 可以簡單理解為,需要提交的檔案修改全部放到暫存區,然後,一次性提交暫存區的所有修改
- 前面的
管理修改
- 為什麼Git比其他版本控制系統設計得優秀?因為Git跟蹤並管理的是修改,而非檔案,跟著下面體會一下吧:
- 現在我們修改一下
first.txt
,隨便為其新增一行this is new
- 然後,我們用
git add first.txt
新增,再用git status
檢視: - 現在我們再次修改檔案,我們再新增一行
this is new new
- 我們用
cat first.txt
來檢視一下這個檔案的內容: - 現在我們用
git commit -m
提交一下:- 為什麼會顯示沒有修改呢?
- 我們回顧一下流程:第一次修改 -> git add -> 第二次修改 -> git commit
- 因為Git管理的是修改而非檔案
- 當你用
git add
命令後,在工作區的第一次修改被放入暫存區,準備提交,但是工作區的第二次修改並未放到暫存區 - 而
git commit
只負責提交暫存區的修改,所以只提交了第一次的修改
撤銷修改
- 現在,我們新增一行:
This line is about to be revoked
- 我們當然可以在退出前手動刪除,但是退出之後呢?
- 我們先用
git status
檢視一下:- 現在的情況是,我在工作區修改了檔案,但是我還沒有提交到git上面去,我想通過git來撤銷這個修改
- 好的,那麼,試試這個命令:
$ git checkout -- first.txt
- 再用
cat first.txt
檢視一下檔案內容,是不是驚奇地發現,我才新增的一行內容被撤銷了... - 注意:
git checkout -- file
中的--
非常重要,如果沒有--
,就變成了切換到另一個分支的命令
- 再用
- 現在,我們嘗試著“過分一點”:我們不僅給檔案新增了一個內容,而且我們還
git add
操作了- 冷靜一下,
git status
讓我們明白:現在我們只是新增到了暫存區,但是還沒有提交 - 那我們怎麼撤銷呢?
- 冷靜一下,
- Git同樣告訴我們,用命令
git reset HEAD xxx
可以把暫存區的修改撤銷掉(unstage),重新放回工作區:$ git reset HEAD first.txt
git reset
命令既可以回退版本,也可以把暫存區的修改撤銷到工作區- 用
git status
檢視,可以明白,現在暫存區是乾淨的,工作區有修改 - 我們再用
git checkout -- first.txt
丟掉工作區的修改吧,讓這個世界徹底清淨.
刪除檔案
- 通常刪除檔案時,直接在檔案管理器中把沒用的檔案刪了,或者用rm命令刪了:
$ rm first.txt
- 我們現在刪除檔案,然後通過
git status
命令會立刻明白哪些檔案被刪除了: - 現在你有兩個選擇;
- 一是確實要從版本庫中刪除該檔案,那就用命令
git rm
刪掉,並且git commit
$ git rm first.txt $ git commit -m "remove first.txt"
- 二是你刪錯檔案了,但是因為版本庫裡面還有,所以可以很輕鬆地把誤刪的檔案恢復到最新版本:
$ git checkout -- first.txt
git checkout
其實是用版本庫裡的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”
- 一是確實要從版本庫中刪除該檔案,那就用命令
- 命令
git rm
用於刪除一個檔案,如果一個檔案已經被提交到版本庫,那麼你永遠不用擔心誤刪,但是要小心,你只能恢復檔案到最新版本,你會丟失最近一次提交後你修改的內容
原生程式碼上傳到遠端倉庫(GitHub)
這裡我舉例把本地的
example
資料夾中的所有內容(這裡只有一個index.html
)上傳到GitHub倉庫中去
- 建立版本庫
$ git init
- 將程式碼上傳到本地的Git倉庫中
- 首先,我們得清楚的是,我們要做的是將本地的倉庫與遠端的GitHub倉庫關聯起來
- 那麼,我們必須先把程式碼先上傳到本地的Git倉庫中
- 前面,我們只是新建了一個Git倉庫,這個倉庫顯然還是空的,那麼,我們現在上傳原生程式碼:
$ git add index.html $ git commit -m "first"
- 至此,本地工作完畢,接下來操作GitHub的Git倉庫
- 在GitHub中建立一個Git倉庫
- 注:這裡的倉庫名隨意,除了取名外其他項均可不管
- 成功建立如下:
- 其實在建立成功的那一頁,GitHub下面有相關的提示,OK,那麼我們現在根據提示來關聯到GitHub上:
$ git remote add origin git@github.com:xxx/xxx.git
- 注:這裡的
git@github.com:xxx/xxx.git
其實就是你的倉庫的地址- 新增後,遠端庫的名字就是
origin
,這是Git預設的名稱,也可以改成別的,但是origin已是約定俗成吧- 關聯成功之後,就該傳程式碼啦!
$ git push -u origin master
- 注:其實
git push
命令實際上就是把當前的分支master
推送到遠端- 可在你的GitHub倉庫中檢視是否上傳成功:(樣例如下)
- 我們還差最後一步:將本地內容推送到GitHub上(總不能改一次程式碼就建一個倉庫吧)
- 很簡單,假設我現在在目錄下做了改動(我對
index.html
做了改動)- 那麼,一條命令即可更新遠方的
index.html
:$ git push origin master
- 細節
- 細心的朋友可能會發現,似乎剛才的
$ git push origin master
只能重新整理index.html
,而假如說我在資料夾新建了new.txt
,這條命令並不會因此就幫我上傳到GitHub- 還記得之前說過的麼?GitHub是被本地Git倉庫關聯的,也就是說,只是新建了
new.txt
,都沒有傳到本地Git上去,怎麼可能傳到GitHub上去呢?- 好吧,不多費口舌了,直接扔答案吧:
$ git add new.txt $ git commit -m "second" $ git push origin master
- 最終,我們成功在GitHub更新了!也就擁有了真正的分散式版本庫!
從遠端庫克隆(略過)
本次部落格先更新到這裡,之後若有需要會再次探討Git世界