git使用(上)

Git使用(上)

1、Git配置

使用Git的第一件事就是設置你的名字和email,這些就是你在提交commit時的簽名,每次提交記錄裏都會包含這些信息。

git config --global user.name "XXX"
git config --global user.email "[email protected]"

執行了上面的命令後,會在家目錄(/home/lxz)下建立一個叫.gitconfig的文件(該文件是隱藏文件,需要使用ls -al查看到),內容一般像下面這樣,可以使用vim或cat查看文件內容:

cat ~/.gitconfig
[user]
    name = XXX
    email = XXX@gmail.com

上面的配置文件就是Git全局配置的文件,一般配置方法是git config –global

如果你想使項目裏的某個值與前面的全局設置有區別(例如把私人郵箱地址改爲工作郵箱),你可以在項目中使用git config命令不帶–global選項來設置,這會在你項目目錄下的.git/config文件增加一節[user]內容(如上所示)。對於新建項目,這部分定製操作需要在git初始化之後纔可以執行。

2、獲得一個Git倉庫

既然我們現在把一切都設置好了,那麼我們需要一個Git倉庫。有兩種方法可以得到它:一種是從已有的Git倉庫中clono;還有一種是新建一個倉庫,把未進行版本控制的文件進行版本控制。

2.1、Clone一個倉庫

爲了得到一個項目的拷貝,我們需要知道這個項目倉庫的地址(Git URL)。Git能在許多協議下使用,所以Git URL可能以ssh://,http(s)://,git://,或者只是以一個用戶名(git會認爲這是一個ssh地址)爲前綴。有些倉庫可以通過不只一種協議來訪問,例如,Git本身的源代碼你即可以用git://協議來訪問:

git clone http://git.XXX.com/XXX/gitproject

也可以通過http協議來訪問:

git clone http://github.com/XXX/gitproject.git

當前git project僅是測試項目,裏面僅有一個README.md文件

2.2、初始化一個新的倉庫

可以對一個已存在的文件夾用下面的命令讓它配置於Git的版本控制管理之下,創建文件夾

mkdir project

添加文件及文件內容

echo "test content" > project/testfile.txt

Git倉庫初始化

cd project
git init

Git會輸出:

Initialized empty Git reposity in /home/lxz/project/.git/

通過ls -la命令會發現project目錄下會有一個名叫.git的目錄被創建,這意味着一個倉庫被初始化了。

3、正常的工作流程

3.1、正常的工作流程

進入我們剛纔建立的project目錄,創建文件file1, file2, file3

cd project
touch file1 file2 file3

修改文件,可以使用vim編輯內容,也可以直接echo添加測試內容,將它們更新的內容添加到索引中。

echo "testcontent1" >> file1
echo "testcontent2" >> file2
echo "testcontent3" >> file3
git add file1 file2 file3

你現在爲commit做好了準備,你可以使用git diff命令再加上–cached參數,看看哪些文件及內容將被提交(commit)。進入git diff –cached界面後需要輸入q纔可以退出。

git diff --cached

(如果沒有–cached參數,git diff會顯示當前你所有已做的但沒有加入到索引裏的修改)你也可以用git status命令來獲得當前項目的一個狀況:

git status

如果你要做進一步的修改,那就繼續做,做完之後就把新修改的文件加入到索引中,最後把它們提交:

git commit -m "put a message to commit"

需要使用-m添加本次修改的註釋,完成後就會記錄一個新的項目版本,除了用git add命令,我們還可以用

git commit -a -m "put a message to commit"

這會自動把所有內容被修改的文件(不包括新創建的文件)都添加到索引中,並且同時提交它們。

4、分支與合併

4.1、分支

一個Git倉庫可以維護很多開發分支。現在我們來創建一個新的叫experimental的分支

git branch experimental

如果你運行了下面這條命令

git branch

你會得到當前倉庫中存在的所有分支列表

experimental
*master

experimental分支是你剛纔創建的,master分支是Git系統默認創建的主分支。星號(“*”)標識了你當前工作在哪個分支下,輸入:

git checkout experimental

切換到“experimental”分支,先編輯裏面的一個文件,再提交(commit)改動,最後切換回“master”分支。

git commit -a -m "put a message to commit"
git checkout master

你現在可以看一下你原來在“experimental”分支下所作的修改還在不在;因爲你現在切換回了“master”分支,所以原來那些修改就不存在了。你現在可以在“master”分支下再做一些不同的修改:

git commit -a -m "put a message to commit"

這時,兩個分支就有了各自不同的修改(diverged);我們可以通過下面的命令來合併”experimental”和“master”兩個分支。

git checkout master
git merge experimental

如果這兩個分支間的修改沒有衝突(conflict),那麼合併就完成了。如果有衝突,輸入下面的命令就可以查看當前有哪些文件產生了衝突

git diff

當你編輯了有衝突的文件,解決了衝突後就可以提交了

git commit -a -m "put a message to commit"

這時你就可以刪除掉你的“experimental”分支了(如果願意)

git branch -d experimental

git branch -d只能刪除那些已經被當前分支的合併的分支。如果你要強制刪除某個分支的話就用git branch -D;下面假設你要強制刪除一個叫“crazy-idea”的分支

git branch -D crazy-idea

4.2、解決合併中的衝突

如果執行自動合並沒有成功的話,git會在索引和工作樹裏設置一個特殊的狀態,提示你如何解決合併中出現的衝突。有衝突的文件會保存在索引中,除非你解決了問題並且更新了索引,否則執行git commit都會失敗,如果執行git status會顯示這些文件沒有合併,這些有衝突的文件裏面會添加像下面的衝突標識符

<<<<<<< HEAD:file.txt
Hello world
======
Goodbye
>>>>>>77976da35a11db4580b80ae27e8d65caf5208086:file.txt

你所需要做的是編輯解決衝突(比如使用vim編輯有衝突的文件,接着把衝突標識符刪掉),再執行下面的命令

git add file.txt
git commit -m "put a message to commit"

4.3、撤銷一個合併

如果你覺得你合併後的狀態是一團亂麻,想把當前的修改都放棄,你可以用下面的命令回到合併之前的狀態

git reset --hard HEAD^

或者你已經把合併後的代碼提交,但還是想把它們撤銷

git reset --hard ORIG_HEAD

但是剛纔這條命令在某些情況會很危險,如果你把一個已經被另一個分支合併的分支給刪了,那麼以後在合併相關的分支時會出錯。

4.4、快速向前合併

還有一種需要特殊對待的情況,在前面沒有提到。通常,一個合併會產生一個合併提交,把兩個父分支裏的每一行內容都合並進來。
但是,如果當前的分支和另一個分支沒有內容上的差異,就是說當前分支的,每一個提交都已經存在另一個分支裏了,git就會執行一個“快速向前”操作;git不創建任何新的提交,只是將當前分支指向合並進來的分支。

5、Git日誌

5.1、查看日誌

git log命令可以顯示所有的提交。當然你也可以組合上面的命令選項;下面的命令就是找出所有從”v2.5”開始的fs目錄下的所有Makefile的修改

git log v2.5.. Makefile fs/

git會根據git log命令的參數,按時間順序顯示相關的提交

5.2、日誌統計

如果用–stat選項使用‘git log’,它會顯示在每個提交中哪些文件被修改了,這些文件分別添加或刪除了多少行內容。

git log --stat

5.3、格式化日誌

你可以按你的要求來格式化日誌輸出。–pretty參數可以使用若干表現格式,如onelne

git log --pretty-oneline

或者你也可以使用short格式

git log --pretty=short

你也可用medium,full,email,raw。如果這些格式不完全符合你的要求,你也可以用–pretty=format參數,另一個有趣的事是:你可以用–graph選項來可視化你的提交圖,它會用ASCII字符來畫出一個很漂亮的提交歷史線。

5.4、日誌排序

你也可以把日誌記錄按一些不同的順序來顯示。注意,git日誌從最近的提交開始,並且從這裏開始向它們父分支回溯。然而git歷史可能包括多個互不關聯的開發線路,這樣有時提交顯示出來就有點雜亂。如果你要制定一個特定的順序,可以爲git log命令添加順序參數。按默認情況,提交會按逆時間順序顯示。但是你也可以指定–topo-order參數,這就會讓提交按拓撲順序來顯示(就是子提交在它們的父提交前顯示)。如果你用git log命令按拓撲順序來顯示git倉庫的提交日誌,你會看到“開發線”都會集合在一起。

git log --pretty=format:'%h : %s' --topo-order --graph

你也可以用–data-order參數,這樣顯示提交日誌的順序主要按提交日期來排序。這個參數和–topo-order有一點像,沒有父分支會在它們的子分支前顯示,但是其它的東東還是按照時間來排序顯示。你會看到“開發線”沒有集合一起,它們會像並行開發一樣跳來跳去

git log --pretty=format: '%h : %s' --date-order --graph

最後,你也可以用–reverser參數來逆向顯示所有日誌。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章