Git幾乎是我們在學習期間都會用到的一個分散式版本控制軟體,這給我們提供了極大的便利,也十分符合現在的開源精神,所以,作為一個計算機的學習者,掌握Git的基本用法幾乎時百利而無一害。而這篇文章則主要記錄一些基本操作,但是這些基本操作在日常使用中幾乎時完全足夠了。
基於本地的Git管理
-
建立本地的版本庫
$ mkdir testGit # 建立工作資料夾 $ cd testGit # 進入該資料夾 $ pwd # 檢視當前路徑 /e/GitRepository/test/testGit $ git init # 通過該命令把當前目錄變成Git可以管理的倉庫
通過執行
git init
命令,就把所建立的testGit
目錄變成了一個git版本庫,此時目錄下會多出一個.git目錄,該目錄用來管理版本庫,不要輕易修改 -
新增檔案至暫存區
$ touch example.txt # 建立一個txt檔案 $ git add example # 將該檔案加入到暫存區
Tip:在git中,
工作目錄
,暫存區
和HEAD
是幾個很重要的概念,與之相對應的檔案狀態分別為未跟蹤
和已跟蹤
,其中,已跟蹤的檔案狀態又分為:未修改,已修改,已暫存,在本文最後會詳細說明。
-
提交檔案至HEAD
$ git commit example.txt -m "備註資訊xxx" # 將暫存區的檔案提交到HEAD,[-m]為提交備註 $ git commit --amend -m "新備註xxx" # 修改前一次的備註
-
檢視工作區狀態
$ git status
-
檢視日誌
$ git log $ git log --graph --pretty=oneline --abbrev-commit # 以圖形化顯示日誌
-
移除
$ rm example.txt # 只移除工作區檔案,需要重新add -- commit $ git rm example.txt # 同時移除工作區和已暫存檔案
-
撤銷
$ git checkout --example.txt # 在未提交至暫存區時,撤銷前一次工作區的修改 $ git reset HEAD example.txt # 撤銷前一次新增至暫存區的檔案,回到未跟蹤狀態
-
忽略檔案
未暫存的檔案或者未提交的檔案,使用狀態查詢的時候系統會頻繁提示,如果有一些檔案是你想要忽略的檔案,比如.tmp檔案,可以採用如下方式新增至忽略檔案中。$ vim .gitignore #在該版本庫下建立gitignore檔案 *.tmp #採用正規表示式,過濾掉你要忽略的內容,如前表示過濾掉所有.tmp檔案
-
版本回退
$ git reset --hard HEAD # HEAD表示當前,HEAD^表示前一個,HEAD^^表示前前一個,也可以用HEAD~2表示前前個,以此類推。 $ git log commit 6a593658be7db38e919931d19d3a96946b4281ba Author: zhengyajun <zhengyajun_email@163.com> Date: Sun Jan 22 10:57:33 2017 +0800 $ git reset --hard 6a593 # 這是另一種方法,6a593是上述log檔案中id前幾位
如果再你回退到哪個版本後,後悔了,可以採用如下方式追回:
$ git reflog # 檢視你最近對版本庫的操作,裡面有記錄版本號 $ git reset --hard xxx # 同上一樣回退至指定版本
-
分支的建立
$ git checkout -b testBranch # 建立並切換至分支testBranch $ git branch testBranch # 建立分支testBranch $ git checkout testBranch # 切換至分支testBranch $ git branch # 檢視當前分支,當前分支帶有星號
-
分支的合併
$ git merge testBranch # 預設採用快速合併的方式(只有指標移動,不記錄) $ git merge -no-ff -m "備註資訊xxx" # 不採用快速合併的方式
-
分支的刪除
$ git branch -d testBranch
TIP:在進行分支合併時,如果你分別對兩個需要被合併的分支都進行了修改,那麼在合併時就會提示
衝突
,而此時用git statu也可以看到衝突狀態,解決衝突的辦法是用任意編輯器開啟衝突檔案,檔案衝突部位會顯示<<<<<<<
;=======
;>>>>>>>
.這幾種符號,分別代表兩個分支的不同內容,根據需要手動修改,去掉符號,之後手動add => commit,提交合並即可成功。這樣的衝突合併可以用$ git log –graph –pretty=oneline –abbrev-commit檢視到。 -
掛起和恢復
git提供一個功能,在工作未完成又不想提交時(以免為自己或者協作者埋雷),可以採用如下命令,將目前的工作環境 “掛起”,等忙完以後再回到該分支繼續工作。
$ git stash # 掛起工作環境 $ git stash list # 檢視被掛起的工作 $ git stash apply # 恢復但是不刪除stash,還可以檢視 $ git stash pop # 恢復並刪除 $ git stash apply/pop stash@{0} #恢復list中的指定stash@{0}
-
建立和管理標籤
前面有提到的commit id是一串經過雜湊演算法算出的156位的十六進位制,儘管我們可以使用前幾位代替,但是,當你的版本庫裡面擁有眾多的檔案時,你還是希望有更簡單的表示方法,git提供了很方便的標籤操作,標籤預設打在你當前所在分支的最新commit上面:$ git tag v1.0 # 建立一個名字叫v1.0的標籤 $ git tag # 檢視
如果要為之前的commit版本打標籤,則可以在後面加上對應版本的commit id:
$ git tag v0.1 6a593 # 為commit id為6a593開頭的版本打上標籤v0.1 $ git tag -a v0.1 -m "備註資訊" 6a593 # 新增明文備註,同前 $ git tag -s v0.1 -m "備註資訊" 6a593 # 新增密文備註【PGP加密】
刪除標籤:
$ git tag -d tag_name # 刪除標籤
-
配置別名
雖然在git中我們可以使用tab鍵進行補全,但是,對於一些常用命令,我們還是會希望輸入簡略字母就可以,比如branch只輸入br:$ git config --global alias.br branch # global表示全域性有效,不加僅對當前倉庫有效
每個倉庫的Git配置檔案放在
.git/config
檔案中,使用者的配置檔案在使用者主目錄下的.gitconfig
檔案中,可以通過修改配置檔案來修改或者刪除。基於遠端的Git管理
-
新增和移除遠端庫:
$ git remote # 檢視當前庫的遠端倉庫,本地庫預設無,從遠端克隆的庫預設為origin $ git remote -v # 檢視遠端倉庫的詳細資訊 $ git remote add [Remote_name] https://github.com/zhengyajun/test.git # []內為名字,任取。 # git支援多種協議,推薦使用https,ssh需要額外配置,會在後文提到。
-
從遠端克隆版本庫:
$ git clone https://github.com/zhengyajun/test.git # 同上,github提供ssh和https,初學推薦https
-
從遠端抓取資料:
$ git fetch [Remote_name] [Branch_name] # []內為要抓取的遠端主機名,預設origin,只抓取不合並,此時以分支‘origin/master’呈現 $ git checkout -b newBranch origin/master # 利用抓取的資料構建一個新的分支 $ git merge origin/master # 在本地分支上合併遠端分支,以遠端庫為origin為示例,以下同 $ git rebase origin/master # 功能同merge,不同在於不記錄分支的改變 $ git pull [Remote_name] [Branch_name] # 抓取並自動合併檔案
-
向遠端推送資料:
$ git push -u [Remote_name] [Branch_name] # 選擇推送的遠端主機和分支,第一次推送時加上引數[-u]會自動關聯本地和遠端的分支,方便後續使用 # 推送的前提是你對遠端庫擁有寫許可權
-
遠端推送標籤:
$ git push origin v1.0 # 推送某一個標籤 $ git push origin -tags # 推送全部標籤
-
遠端刪除標籤
$ git push origin:refs/tags/v0.9 # 刪除標籤v0.9
文中提到的幾個基本概念和命令
-
Git中的幾個基本操作:
`基於linux:` $ cd xxx # 切換至xxx目錄,一般使用路徑指示,常用: .表示當前目錄;..表示上一級目錄;~家目錄;-前一工作目錄;/根目錄 $ ls -al # -al表示顯示當前目錄所有檔案,包括隱藏檔案 $ mkdir xxx # 建立xxx目錄 $ rmdir xxx # 刪除xxx目錄 $ rm xxx # 刪除xxx檔案 $ vim xxx # 文字編輯器 $ touch xxx # 建立一個xxx空檔案 $ grep “xx” fileName # 在fileName中尋找xx,並顯示該行 $ cat xxx # 文字編輯器和檢視器,主要用於檢視 $ head -n 3 fileName # 檢視fileName的前三行 == cat fileName | head -n 3 $ tail -n 3 fileName # 檢視fileName的後三行 == cat fileName | tail -n 3 # 更多命令請自行百度 `基於windows:` $ echo .>test.txt # 建立一個test.txt檔案 $ echo xxx > test.txt # 在test.txt覆蓋寫入xxx $ echo xxx >> test.txt # 在test.txt追加寫入xxx $ clip<abc/e/xxx.txt # 複製xxx.txt檔案 $ dir # 同linux ls $ notepad xxx # 用預設的文字編輯工具開啟xxx,通常是記事本,不建議使用,建議使用vim
-
ssh配置:
$ git config --global user.name "xxx" # 設定使用者名稱 $ git config --global user.email xxx@xx.com # 設定郵箱,同你github網站上的郵箱:https://github.com $ ssh -keygen -t rsa -C "xxx@xx.com" # 引數[-t]表示選擇加密方式,[-C]表示備註資訊 `生成的檔案會在~/.ssh中,我們需要複製其中的id_rsa_pub,可以用記事本開啟或者直接複製` $ clip<~/.ssh/id_rsa_pub 複製後,登陸Github網站,右上角設定中 => 新增ssh => 貼上id_rsa_pub,成功即可完成ssh配對。
-
工作區,暫存區,HEAD以及未跟蹤,已跟蹤(未修改,已修改,已暫存)
工作區就是我們在未進行git操作的環境,通過`add`操作,把工作目錄的檔案新增至暫存區(index/stage),而我們通過`commit`把暫存區的檔案提交至HEAD 而檔案的型別是:我們把未新增至暫存區的檔案狀態稱為`未跟蹤`狀態,新增以後則是`已跟蹤`。已跟蹤的狀態分為:未修改,已修改,已暫存,這個不做過多敘述。 關於這一部分的概念網上有很多圖解,如果有不明白,百度會一看就明,這是很重要的概念,一定要理解。
-
指標
Git的速度之所以很快,很大程度取決於它是記錄修改而不是記錄檔案,所謂的記錄修改,很多是用指標來完成的 HEAD其實是一個指向master的最新commit的指標,當有新提交時,便指向最新commit,同理,在分支切換中也是同理,都是指標的變動,所以,當兩個分支都變動時,合併會衝突,因為不能簡單的通過指標的變動來完成,需要手動解決。