-
1. 安裝git
-
git:http://git-scm.com/
-
OS版本:ubuntu12.10
-
安裝git: $:sudo
apt-get install git-core
-
-
2.介紹
-
維基百科:http://zh.wikipedia.org/wiki/Git
-
git是一個版本控制系統;官方解釋:版本控制是一種軟件工程技巧,在開發過程中,確保不同人所編輯的統一文檔都得到更新。
-
-
3.配置git系統,比如自己的姓名、email。
-
git config --global
user.name "Your name"
-
git config --global
user.email "[email protected]"
-
-
我照例執行:
-
[root@wangxigang ~]# git
config –global user.name “Linuxer”
-
[root@wangxigang ~]# git
config –global user.email “wangxigang2014@gmail.com”
-
4.下面學習導入一個新的git項目
-
(假設只有一個main.c文件)該項目在gitfile目錄下,則導入項目的步驟:
-
wangxigang@wangxigang-ThinkPad-Edge:~$ cd
gitfile/
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
git init
-
Initialized empty Git repository in /home/wangxigang/gitfile/.git/
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
ls -a
-
. .. .git
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
git add .
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
git commit
-
# On branch master #
-
# Initial commit
-
#
-
nothing to commit (create/copy
files and use "git add" to
track)
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
git commit
-
# On branch master
-
#
-
# Initial commit
-
#
-
# Untracked files:
-
# (use "git
add <file>..." to include in what
will be committed)
-
#
-
# main.c
-
nothing added to commit but untracked files present (use "git
add" to track)
-
-
解釋:
-
git init command 用於初始化當前所在目錄的這個項目;
-
git add . command
要求git給當前的項目製作一個快照snapshot(快照只登記留名,快照不等於記錄在案)。暫時存儲一個臨時存儲區;
-
git commit 用於將快照登記的內容永久寫入git倉庫中。在輸入git commit時迴轉到一個vi窗口,要求開發者輸入這次提交的版本和開發信息。意思是這個項目的版本是多少,已完成了那些功能,還有那些功能沒有完成等等信息。
-
-
5.我們main.c文件的內容是一個
hello world!
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
cat -n main.c
-
1 #include <stdio.h>
-
2
-
3 int main(){
-
4 printf("hello world!\n");
-
5 return 0;
-
6 }
-
-
這時候修改加一行:printf("version:0.0.1");
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
cat -n main.c
-
1 #include <stdio.h>
-
2
-
3 int main(){
-
4 printf ("version:0.0.1\n");
-
5 printf("hello world!\n");
-
6 return 0;
-
7 }
-
-
最後兩道工序由開發者最後確認一下(自己的修改):
-
[root@wangxigang]# git
diff
-
diff –git a/main.c b/main.c
-
index 3a88d8c..e0fe92e
100644
-
— a/main.c
-
+++ b/main.c
-
@@ -1,6 +1,7
@@
-
#include<stdio.h>
-
int main()
-
{
-
+printf(“Version: 0.01\n”);
-
printf(“hello world!\n”);
-
return 0;
-
}
-
-
使用git diff瞭解不同之後,還可以使用git status命令獲得整體的改動信息;
-
[root@wangxigang]# git
status
-
# On branch master
-
# Changed but not updated:
-
# (use “git add <file>…”
to update what will be committed)
-
#
-
# modified: main.c
-
#
-
no changes added to commit (use
“git add” and/or “git
commit -a”)
-
-
下面進入提交階段:
-
[wangxigang@wangxigang]# git add main.c
-
這句話告訴git, 我已經修改了main.c;
-
-
提交我的工作:
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
git commit
-
[master (root-commit) dceb92b] this is
senond project
-
1 file changed, 7 insertions(+)
-
create mode 100644 main.c
-
-
查看開發日誌:
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
git log
-
commit dceb92b3ebf10e3c6437c1edc27d8af75ae0f89d
-
Author: = <wangxigang2014@gmail.com>
-
Date: Tue Apr 29 19:27:26
2014 +0800
-
-
this is senond project
-
如果查看更詳細的開發日誌:
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
git log -p
-
commit dceb92b3ebf10e3c6437c1edc27d8af75ae0f89d
-
Author: = <wangxigang2014@gmail.com>
-
Date: Tue Apr 29 19:27:26
2014 +0800
-
-
this is senond project
-
-
diff --git
a/main.c b/main.c
-
new file mode 100644
-
index 0000000..7e96f29
-
--- /dev/null
-
+++ b/main.c
-
@@ -0,0 +1,7
@@
-
+#include <stdio.h>
-
+
-
+int main(){
-
+ printf("version:0.0.1\n");
-
+ printf("hello
world!\n");
-
+ return 0;
-
+}
-
-
-
5.如何管理分支:
-
還是接着我們之前的main.c的項目走。我想試着開發一個報時功能加入到main.c中,但我不保證這個功能一定能夠實現。這個時候可以運行git
branch命令來開啓一個實驗分支:
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
git branch experimental
-
-
好了,分支分支建立完畢;
-
我們查看一下:
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
git branch
-
experimental
-
* master
-
直接輸入git branch,不加任何後續參數,就表示讓git列出所有已存在的分支。前面帶“星號”的分支表示當前所在的分支。
-
切換到experimental分支:
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
git checkout experimental
-
Switched to branch 'experimental'
-
修改之後的main.c如下:
-
-
[wangxigang@wangxigang]# cat -n
main.c
-
1 #include<stdio.h>
-
2 #include<time.h>
-
3 int main()
-
4 {
-
5 time_t mytime;
-
6 struct tm *mylocaltime;
-
7 mytime=time(NULL);
-
8 mylocaltime=localtime(&mytime);
-
9 printf(“Year:%d\n”,mylocaltime->tm_year+1900);
-
10 printf(“Month:%d\n”,mylocaltime->tm_mon+1);
-
11 printf(“Day:%d\n”,mylocaltime->tm_mday);
-
12 printf(“Hour:%d\n”,mylocaltime->tm_hour);
-
13 printf(“Min:%d\n”,mylocaltime->tm_min);
-
14 printf(“Second:%d\n”,mylocaltime->tm_sec);
-
15 printf(“Version: 0.02\n”);
-
16 printf(“Hello world!\n”);
-
17 return 0;
-
18 }
-
黑體爲新加的內容。好了,我的報時功能已經完成了。看來這個分支是可行的:)
-
-
運行此程序,運行結果如下:
-
-
[wangxigang@wangxigang]# ./a.out
-
Year:2008
-
Month:9
-
Day:21
-
Hour:11
-
Min:17
-
Second:4
-
Version: 0.02
-
Hello
-
-
下面的任務就是提交程序到分支項目:
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
git commit -a
-
[experimental f37403e] this is
a third project
-
1 file changed, 19 insertions(+), 7
deletions(-)
-
rewrite main.c (66%)
-
-
然後就可以切換到“主幹道”了:
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
git checkout master
-
Switched to branch 'master'
-
-
爲了讓git處理分支的本領展現的淋漓盡致,我們現在在主幹道上再做一些改進:
-
[wangxigang@wangxigang]# cat -n
main.c
-
1 #include<stdio.h>
-
2 int main()
-
3 {
-
4 printf(“Welcome\n”);
-
5 printf(“Version: 0.02\n”);
-
6 printf(“Hello world!\n”);
-
7 return 0;
-
8 }
-
然後在主幹道上使用git commit -a提交!
-
-
合併“分支”和“主幹道”:
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
git merge experimental
-
Auto-merging main.c
-
CONFLICT (content): Merge
conflict in main.c
-
Automatic merge failed; fix conflicts and then
commit the result.
-
-
報錯了!因爲我看到了conflict和failed這樣的字眼。看來主幹道上加入的welcome和分支幹道產生了衝突。我們決定來修改主幹道的welcome語句到文章的最後部位。主幹道的main.c此時爲:
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
cat -n main.c
-
1 #include <stdio.h>
-
2 #include <time.h>
-
3
-
4 int main(){
-
5 <<<<<<< HEAD
-
6 printf("welcome");
-
7 printf("version:0.0.1\n");
-
8 printf("hello world!\n");
-
9 return 0;
-
10 =======
-
11 time_t mytime;
-
12 struct tm *mylocaltime;
-
13 mytime = time(NULL);
-
14 mylocaltime = localtime(&mytime);
-
15 printf(“Year:%d\n”,mylocaltime->tm_year+1900);
-
16 printf(“Year:%d\n”,mylocaltime->tm_year+1900);
-
17 printf(“Month:%d\n”,mylocaltime->tm_mon+1);
-
18 printf(“Day:%d\n”,mylocaltime->tm_mday);
-
19 printf(“Hour:%d\n”,mylocaltime->tm_hour);
-
20 printf(“Min:%d\n”,mylocaltime->tm_min);
-
21 printf(“Second:%d\n”,mylocaltime->tm_sec);
-
22 printf ("version:0.0.2\n");
-
23 printf("hello world!\n");
-
24 return 0;
-
25 >>>>>>> experimental
-
26 }
-
現在人工的修改main.c文件:
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
vi main.c
-
#include <stdio.h>
-
#include <time.h>
-
-
int main(){
-
printf("welcome");
-
time_t mytime;
-
struct tm *mylocaltime;
-
mytime = time(NULL);
-
mylocaltime = localtime(&mytime);
-
printf(“Year:%d\n”,mylocaltime->tm_year+1900);
-
printf(“Year:%d\n”,mylocaltime->tm_year+1900);
-
printf(“Month:%d\n”,mylocaltime->tm_mon+1);
-
printf(“Day:%d\n”,mylocaltime->tm_mday);
-
printf(“Hour:%d\n”,mylocaltime->tm_hour);
-
printf(“Min:%d\n”,mylocaltime->tm_min);
-
printf(“Second:%d\n”,mylocaltime->tm_sec);
-
printf ("version:0.0.2\n");
-
printf("hello world!\n");
-
return 0;
-
}
-
好,解決衝突後再次提交!
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
git commit -a
-
-
分支的任務也就完成了,可以刪除分支了:
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
git branch -d experimental
- Deleted branch experimental (was f37403e).
-
-
6.如何在git裏進行多人合作:
-
目前我的項目放在/home/wangxigang/gitfile裏面,其他人也希望貢獻他的代碼,可以這樣做:
-
$ git clone /home/wangxigang/gitfile myproject
-
這樣其他就可以將我的成果克隆到他的家目錄 myproject中。此時其他人可以git commit -a提交他的改進成果。
-
我將他人的改進合併我的項目中:
-
cd /home/wangxigang/gitfile
-
git pull /home/somepeople/myproject master
-
將其他人的工作master合併到我的當前分支上。
-
pull 命令完成兩個動作,首先從遠端分支獲取diff信息,第二個動作就是改變合併到本地分支中。
-
7.對像數據庫
-
建立一個倉庫:
-
wangxigang@wangxigang-ThinkPad-Edge:~$ mkdir test-project
-
wangxigang@wangxigang-ThinkPad-Edge:~$ cd test-project/
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$
git init
-
Initialized empty Git repository in /home/wangxigang/test-project/.git/
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ echo 'Hi,wangxigang'>file.txt
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$
git add .
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$
git commit -a -m 'initial
commit' //此處的-m選項表示“後面的參數是本次提交的歷史記錄”
-
[master (root-commit) 7c135fc] initial
commit
-
1 file changed, 1 insertion(+)
-
create mode 100644 file.txt
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ echo 'Hi,wangxigang!'>file.txt
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$
git commit -a -m 'add
emphasis' //此處的-m選項表示“後面的參數是本次提交的歷史記錄”
-
[master d44d5c0] add emphasis
-
1 file changed, 1 insertion(+), 1
deletion(-)
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$
git log
-
commit d44d5c0441ec0fbd12b5eaed21fbc5510993189b
-
Author: = <wangxigang2014@gmail.com>
-
Date: Mon May 5 18:48:15
2014 +0800
-
-
add emphasis
-
-
commit 7c135fc46f3ee072b5cae1165fd55ff2c9d3fb94
-
Author: = <wangxigang2014@gmail.com>
-
Date: Mon May 5 18:47:12
2014 +0800
-
-
initial commit
-
-
這40位十六進制數是一個SHA1哈希數(Secure Hash Algorithm),它可以保證每次commit生成的名稱都是唯一的且可以永遠有效的。
-
執行下面命令:
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$
git cat-file -t
7c135
-
commit
-
//cat-file命令中-t選項表示列出相應ID的對象類型;241e是剛纔commit後得出的SHA1碼
-
commit //可以看到此ID對應的對象類型爲一次commit
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$
git cat-file commit 7c135
-
tree 845633fd6c3063a134e11665aa05db923f21b91e
-
author = <wangxigang2014@gmail.com> 1399286832 +0800
-
committer = <wangxigang2014@gmail.com> 1399286832 +0800
-
-
initial commit
-
-
你應該可以注意到命令輸出結果中包含了tree,tree的ID表示了一個BLOB對象(二進制對象),此對象對應着一個文件或另一個tree。你可以使用ls-tree命令來查詢關於這個tree的更詳細信息:
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$
git ls -tree 845633
-
git: 'ls' is not a
git command. See 'git
--help'.
-
-
Did you mean this?
-
log
-
在.git目錄下的HEAD文件比較特殊,查看.git/HEAD文件:
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile/.git/objects$
cd ..
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile/.git$
cat HEAD
-
ref: refs/heads/master
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile/.git$
cd ..
-
wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$
git branch
-
* master
-
可以看到HEAD文件指示出當前所在的分支名稱是master。
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$
cat .git/refs/heads/master
-
d44d5c0441ec0fbd12b5eaed21fbc5510993189b
-
這個文件的內容給出了一個對象ID,繼續尋根溯源:
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$
git cat-file -t
d44d
-
commit
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$
git cat-file commit d44d
-
tree d9adad2c9efaf055b1c084b01c25a4a26d2fa3c1
-
parent 7c135fc46f3ee072b5cae1165fd55ff2c9d3fb94
-
author = <wangxigang2014@gmail.com> 1399286895 +0800
-
committer = <wangxigang2014@gmail.com> 1399286895 +0800
-
-
add emphasis
-
HEAD所指向的原來是最後一次commit的信息,而且經測試可知parent指的是上一次commit的信息。
-
-
-
8. 索引文件的作用
-
我們在提交工作時,使用最多的命令就是git commit -a了,但是這個將提交你所做的所有工作。其實,如果你瞭解commit的工作機制,你會知道我們可以自定義提交哪些部分到哪些工作樹中,其實自由度很大的。
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ echo "hello
world,again">file.txt
-
這次,我們不急着執行commit命令,而是先用git diff看看差別情況:
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$
git diff
-
diff --git
a/file.txt b/file.txt
-
index 7fa347e..99a8556
100644
-
--- a/file.txt
-
+++ b/file.txt
-
@@ -1 +1
@@
-
-Hi,
-
+hello world,again
-
好了,我們可以看到git報告了我們剛纔所做的修改。下面我們來add一下,然後再git diff,看看diff有什麼變化呢:
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$
git add .
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$
git diff
-
大家可以看到在add之後的git diff的輸出竟然爲空了,但是此時我們尚未執行commit阿。如果這個時候你執行git diff HEAD,你仍然會看到修改報告:
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project$
git diff HEAD
-
diff --git
a/file.txt b/file.txt
-
index 7fa347e..99a8556
100644
-
--- a/file.txt
-
+++ b/file.txt
-
@@ -1 +1
@@
-
-Hi,
-
+hello world,again
-
這就說明了一個問題:git diff不是在和HEAD比,而是和另外一個“神祕”內容在比,而這個“神祕”內容就是“索引文件”!
-
索引文件(index file)就是.git/index文件,它是二進制形式的文件。我們可以用ls-files來檢查它的內容。
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project/.git$
git ls-files --stage
-
100644 99a8556676a8dd311153a871f1c5b464bfa5f3a2 0 file.txt
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project/.git$
git cat-file -t
99a85
-
blob
-
wangxigang@wangxigang-ThinkPad-Edge:~/test-project/.git$
git cat-file blob 99a85
-
hello world,again
-
很明顯,我們可以看到其內容已經是改進後的代碼了,怪不得git-diff會輸出空呢!
-
-
我們的結論就是git add的作用就是創建一個blob文件來記錄最新的修改代碼,並且在index file裏添加一個到此blob的鏈接。
-
- 更清楚且通俗的解釋就是:git維護的代碼分成三部分,“當前工作目錄”<->“index file”<->git倉庫。git commit會將index file中的改變寫到git倉庫;git add會將“當前工作目錄”的改變寫到“index file”;“commit -a”則會直接將“當前工作目錄”的改動同時寫到“index file”和“git倉庫”。
-
9.git日常工作命令(適合獨立開發者):
-
git -log:顯示提交日誌
-
git -checkout 或者 git -branch:用於切換和創建分支
-
git -add: 用於將修改內容加到index文件中
-
git -diff 和git -status:用於顯示開發者所做的修改
-
git -commit:用於提交當前修改到git倉庫
-
git -reset 和git checkout:用於撤銷某些修改
-
git -merge:用於合併兩個分支
-
git -rebase:用於維護topic分支
-
git -tag:用於標記標籤
-
-
我們來舉一個例子,模擬一下獨立開發者使用git的情形。
-
-
首先使用一個tarball作爲整個項目的初始點。
-
-
$ tar -xzvf mypro.tat.gz
-
-
$ cd mypro
-
-
$ git-init
-
-
$ git add .
-
-
$ git commit -m “important of mypro source tree.”
-
-
$ git tag v2.43 //給這個commit起了一個簡單的名字v2.43
-
-
下面我們建立分支並繼續開發:
-
-
$ git checkout -b alsa-audio //-b用於建立一個新的分支,分支名稱爲alsa-audio,並且轉移到此分支
-
-
…(開發/編譯/測試)
-
-
$ git checkout — curses/ux_audio_oss.c //用於取消對curses/ux_audio_oss.c文件的修改
-
-
$ git add curses/ux_audio_alsa.c //如果你在這一階段的開發過程中增加了新文件,那麼你應該用git-add告知git倉庫,當然,如果你只是修改或刪除,那麼使用git-commit -a就可以讓git查覺到了。
-
-
…(開發/編譯/測試)
-
-
$ git diff HEAD //查看一下我們即將commit的內容
-
-
$ git commit -a -s //提交
-
-
…(開發/編譯/測試)
-
-
$ git reset –soft HEAD^ //回覆到上一次commit的代碼。–soft選項表示不改動index file和working tree中的內容
-
-
…(開發/編譯/測試)
-
-
$ git diff ORIG_HEAD //look at the changes since the premature commit we took back(此句不太懂)
-
-
$ git commit -a -c ORIG_HEAD //重新提交,-c ORIG_HEAD表示使用原有的提交信息
-
-
$ git checkout master
-
-
$ git merge alsa-audio
-
-
$ git log –since=’3 days ago’
-
-
$ git log v2.43.. curses/ //查看自從v2.43以來的curses目錄下的代碼變化信息
-
-
-
10.git 命令(適合多人合作):
-
作爲項目開發者的一員,學會和隊友交流是一件很重要的事情。因此,我們不僅要掌握獨立開發者所掌握的命令,還要掌握用於溝通的git命令。
-
git-clone:複製別人的git倉庫到本地
-
-
git-pull和git-fetch:保持和別人的git倉庫的同步更新
-
-
git-push:共享方式。等同於CVS方式下的共享。
-
-
git-format-patch:利用郵件形式提交補丁。等同於內核開發方式。
-
-
-
情景模擬:
-
-
$git clone git://git.kernel.org/pub/scm/…/torvalds/linux-2.6
my2.6
-
-
$cd my2.6
-
-
(開發…編譯…測試…)
-
-
$git commit -a -s //-s選項用於在commit信息後加上結束標誌
-
-
$git format-patch origin //從本地分支生成patch,用於email提交
-
-
$git pull //從origin取出更新併合併到當前分支
-
-
$git log -p ORIG_HEAD.. arch/i386 include/asm-i386
-
-
$git pull git://git.kernel.org/pub/…/jgarzik/libata-dev.git
ALL //從特定git倉庫取出變更併合並。
-
-
$git reset –hard ORIG_HEAD //恢復到上一次的內容
-
-
$git gc //用垃圾回收機制清除由於reset而造成的垃圾代碼
-
-
$git fetch –tags //從origin取出tags並存儲到.git/refs/tags
-
-
1
-
commit和commit -a的區別
-
-
commit -a相當於:
-
-
第一步:自動地add所有改動的代碼,使得所有的開發代碼都列於index file中
-
-
第二步:自動地刪除那些在index file中但不在工作樹中的文件
-
-
第三步:執行commit命令來提交
-
-
2
-
-
log -p的中-p的作用
-
-
git log:顯示commit日誌
-
-
git log -p:不僅顯示commit日誌,而且同時顯示每次commit的代碼改變。
-
-
3
-
-
merge的用法及參數用法
-
-
git-merge主要用於將兩個或兩個以上的開發分支進行合併。
-
-
git merge branchname 用於將branchname分支合併到當前分支中。(如果合併發生衝突,需要自己解決衝突)
-
-
當merge命令自身無法解決衝突的時候,它會將工作樹置於一種特殊的狀態,並且給用戶提供衝突信息,以期用戶可以自己解決這些問題。當然在這個時候,未發生衝突的代碼已經被git merge登記在了index file裏了。如果你這個時候使用git diff,顯示出來的只是發生衝突的代碼信息。
-
-
在你解決了衝突之前,發生衝突的文件會一直在index file中被標記出來。這個時候,如果你使用git commit提交的話,git會提示:filename.txt needs merge
-
-
在發生衝突的時候,如果你使用git status命令,那麼會顯示出發生衝突的具體信息。
-
-
在你解決了衝突之後,你可以使用如下步驟來提交:
-
-
第一步:git add filename.txt
-
-
第二步:git commit
-
-
如果你希望撤銷一個分支到merge前的狀態,那麼使用如下命令:
-
-
$ git reset –hard HEAD //–hard表示將working tree和index file都撤銷到以前狀態
-
-
在這先偷偷的告訴你,–soft表示只撤銷commit,而保留working tree和index file的信息,–mixed會撤銷commit和index file,只保留working tree的信息。OK,如果你能記住–hard、–mixed和–soft的區別,那最好,如果記不住,也不用自責啦,以後還會講到。
-
-
4
-
-
fetch的用法
-
-
git-fetch用於從另一個reposoitory下載objects和refs。
-
-
命令格式爲:git fetch <options> <repository> <refspec>…
-
-
其中<repository>表示遠端的倉庫路徑。
-
-
其中<refspec>的標準格式應該爲<src>:<dst>,<src>表示源的分支,如果<dst>不爲空,則表示本地的分支;如果爲空,則使用當前分支。
-
-
git fetch /home/bob/myrepo master:bobworks :用於從bob的工作目錄的master分支下載objects和refs到本地的bobworks分支中。
-
-
5
-
-
pull的用法
-
-
git-pull的作用就是從一個repository取出內容併合併到另一個repository中。
-
-
git pull是git fetch和git merge命令的一個組合。
-
-
git pull /home/bob/myrepo 這個命令的意思是從此目錄中取出內容併合併到當前分支中。
-
-
git pull .就相當於git merge。
-
-
6
-
-
commit信息詳解
-
-
你使用git log可以看到每一次commit的信息,大約如下格式:
-
-
$ git log
-
commit 5b888402aadd3cd41b3fe8c84a8658da07893b20
-
Author: rocrocket <wupengchong@gmail.com>
-
Date: Wed Sep 24 13:16:46 2008 +0800
-
-
after pull from rocrocket
-
-
-
-
可以看到黑體部分爲本次commit的ID號,你可以根據這個號碼,使用git show來顯示這次commit的更詳細的信息,包括了提交時間、修改內容、git diff信息等等。
-
-
7
-
-
常量的使用方法
-
-
HEAD:表示最近一次的commit。
-
-
MERGE_HEAD:如果是merge產生的commit,那麼它表示除HEAD之外的另一個父母分支。
-
-
FETCH_HEAD:使用git-fetch獲得的object和ref的信息都存儲在這裏,這些信息是爲日後git-merge準備的。
-
-
HEAD^:表示HEAD父母的信息
-
-
HEAD^^:表示HEAD父母的父母的信息
-
-
HEAD~4:表示HEAD上溯四代的信息
-
-
HEAD^1:表示HEAD的第一個父母的信息
-
-
HEAD^2:表示HEAD的第二個父母的信息
-
-
COMMIT_EDITMSG:最後一次commit時的提交信息。
-
-
8
-
-
tag的用法
-
-
主要作用是給某次commit起一個好記的名字:
-
-
$ git tag V3 5b888 //以後可以用V3來代替複雜的名稱(5b888…)
- $ git show V3
-
6.如何在git裏進行多人合作:
git學習
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.