第一部分:Git的基本操作
初始化操作
$ git config -global user.name #設置提交者名字
$ git config -global user.email #設置提交者郵箱
$ git config -global core.editor #設置默認文本編輯器
$ git config -global merge.tool #設置解決合并沖突時差異分析工具
$ git config -list #檢查已有的配置信息
創建新版本庫
$ git clone #克隆遠程版本庫
$ git init #初始化本地版本庫
修改和提交
$ git add . #添加所有改動過的文件
$ git add #添加指定的文件
$ git mv #文件重命名
$ git rm #刪除文件
$ git rm -cached #停止跟蹤文件但不刪除
$ git commit -m #提交指定文件
$ git commit -m “commit message” #提交所有更新過的文件
$ git commit -amend #修改最后一次提交
$ git commit -C HEAD -a -amend #增補提交(不會產生新的提交歷史紀錄)
查看提交歷史
$ git log #查看提交歷史
$ git log -p #查看指定文件的提交歷史
$ git blame #以列表方式查看指定文件的提交歷史
$ gitk #查看當前分支歷史紀錄
$ gitk #查看某分支歷史紀錄
$ gitk --all #查看所有分支歷史紀錄
$ git branch -v #每個分支最后的提交
$ git status #查看當前狀態
$ git diff #查看變更內容
撤消操作
$ git reset -hard HEAD #撤消工作目錄中所有未提交文件的修改內容
$ git checkout HEAD #撤消指定的未提交文件的修改內容
$ git checkout HEAD. #撤消所有文件
$ git revert #撤消指定的提交
分支與標簽
$ git branch #顯示所有本地分支
$ git checkout #切換到指定分支或標簽
$ git branch #創建新分支
$ git branch -d #刪除本地分支
$ git tag #列出所有本地標簽
$ git tag #基于最新提交創建標簽
$ git tag -d #刪除標簽
合并與衍合
$ git merge #合并指定分支到當前分支
$ git rebase #衍合指定分支到當前分支
遠程操作
$ git remote -v #查看遠程版本庫信息
$ git remote show #查看指定遠程版本庫信息
$ git remote add #添加遠程版本庫
$ git fetch #從遠程庫獲取代碼
$ git pull #下載代碼及快速合并
$ git push #上傳代碼及快速合并
$ git push : / #刪除遠程分支或標簽
$ git push -tags #上傳所有標簽
附:參考
第二部分:搭建C/S架構Git服務器
一、搭建步驟
Git支持本地(local)、ssh、git和http(s)這四種協議進行傳輸,本部分將基于ssh協議搭建(此協議不利于開源,適合公司團隊使用)。
本文操作大部分在Ubuntu服務器端完成。
1、我們在服務器端新增加一個用戶(本文為gitadmin)用于管理git倉庫:
Ubuntu下啟動終端,鍵入命令:
$ sudo useradd -m gitadmin?? --首次執行sudo命令需要按提示輸入管理員密碼
$ sudo passwd gitadmin?????? --設置用戶gitadmin密碼
將gitadmin設置為管理員用戶,方法很多,這里用通過修改sudoers文件實現:
$ sudo vim /etc/sudoers
接下來進到vim編輯器,鍵入i進入插入模式,找到下面這行并添加gitadmin:
# User privilege specification
root ALL=(ALL:ALL)? ALL
gitadmin? ALL=(ALL:ALL)? ALL
鍵盤esc退出插入模式,輸入冒號(:),光標出現在底端,輸入wq回車退出。
$ su gitadmin?????????????????? --輸入剛剛設置的密碼切換到gitadmin用戶
2、安裝配置ssh服務
$ sudo apt-get install openssh-server openssh-client
按提示輸入管理員密碼,同意[Y],安裝完畢。OpenSSH為自由軟件,是ssh的開源實現。
$ sudo vim /etc/ssh/sshd_config
找到下面幾行,去掉前面"#"注釋,并設置:
StrictModes? no --在用戶名和其公鑰文件名不匹配時將通過驗證
RSAAuthentication yes?? --使用純的RSA認證
PubkeyAuthentication yes??? --允許Public Key AuthorizedKeysFile???? %h/.ssh/authorized_keys
上面這個配置是設定免密碼登陸的賬號公鑰存儲路徑
ps:如果是小團隊,把每個人的公鑰收集起來放到/home/git/.ssh/authorized_keys文件里問題不大;如果團隊較大或是有權限要求,這種方式就很不靈活了,這時可以用Gitosis來管理公鑰,我將在后文介紹。
接著重啟ssh服務
$ sudo service ssh restart?? 或是?? $ sudo /etc/init.d/ssh restart
ssh服務器到這里安裝配置完畢。
出于安全考慮,可以在本教程配置完畢后設置gitadmin用戶不允許登錄shell,可通過 用vim打開編輯/etc/passwd文件并找到下面的一行(自行創建的用戶名):
gitadmin:x:1001:1001:,,,:/home/gitadmin:/bin/bash
改為:
gitadmin:x:1001:1001:,,,:/home/gitadmin:/usr/bin/git-shell
這樣,gitadmin用戶可以正常通過ssh使用git,但無法登錄shell,因為我們為gitadmin 用戶指定的git-shell每次一登錄就自動退出
3、安裝配置git服務器
$ sudo apt-get install git git-core?? --安裝git服務器
$ sudo mkdir /home/gitadmin/repositories??? --創建git倉庫存儲目錄
$ sudo chown gitadmin:gitadmin /home/gitadmin/repositories? --設定所有者
$ sudo chmod 755 /home/gitadmin/repositories?? --設置倉庫訪問權限
接下來初始化全局設置
$ git config --global user.name “gitadmin”
$ git config --global user.email “gitadmin@server”
@后的server為本機IP,可用ifconfig查看
4、基本的git服務器(without gitosis)
這里是git本地服務器最基本的實現,不使用下文講解的gitosis進行管理,適合人數較 少并且沒有權限管理要求的小團隊。
PC客戶端:
首先安裝git客戶端(參見后文方法)
配置無密碼登陸需拷貝pc端公鑰至/home/git/.ssh/authorized_keys,在git.bash下:
$ ssh-keygen -t rsa?????? --生成本機密鑰,公鑰默認在~/.ssh/id_rsa.pub
$ ssh-copy-id gitadmin@host?? --上傳公鑰,遠程主機host為服務器IP
若不用以上命令,用下面這條命令則清楚地解釋了公鑰的保存過程:
$ ssh gitadmin@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
Ubuntu服務器端:
你可以在服務器端自行創建倉庫,先選定一個目錄作為Git倉庫,假定是/srv/sample.git, 在/srv目錄下輸入命令:
$ sudo git init --bare sample.git
$ sudo chown -R gitadmin:gitadmin sample.git --把owner改為gitadmin
這樣Git就會創建一個裸倉庫,裸倉庫沒有工作區,因為服務器上的Git倉庫純粹是為 了共享,所以不讓用戶直接登錄到服務器上去改工作區,并且服務器上的Git倉庫通常 都以.git結尾。
至此,最基本的git本地服務器已經搭建完畢,可以通過git clone命令克隆遠程倉庫在各自電腦上運行了。
5、安裝配置gitosis
簡單地說,Gitosis 就是一套用來管理 authorized_keys文件和實現簡單連接限制的腳本。有趣的是,用來添加用戶和設定權限的并非通過網頁程序,而只是管理一個特殊的 Git 倉庫。你只需要在這個特殊倉庫內做好相應的設定,然后推送到服務器上,Gitosis 就會隨之改變運行策略。
創建管理員公鑰和私鑰:
在默認用戶的主目錄路徑下,運行以下命令,按照提示創建(可直接回車略過) $ ssh-keygen -t rsa
默認生成2048位,如果需要提高安全級別,也可以通過下面的命令
$ ssh-keygen -t rsa -b 4096
公鑰和私鑰默認會保存在~/.ssh目錄下,如下所示:
id_rsa id_rsa_pub(公鑰) known_hosts
安裝gitosis:
安裝python的setup tool
$sudo apt-get install python-setuptools
獲取并安裝gitosis
$ cd /tmp --切換到緩存目錄下載安裝包,在關機時會被系統自動清理
$ git clone?https://github.com/tv42/gitosis.git?--下載安裝包
$ cd gitosis
$ sudo python setup.py install --到此gitosis安裝完成
配置gitosis:
gitosis會默認將git倉庫放在gitadmin主目錄下,并自動管理authorized_keys文件 :
$ cp ~/.ssh/id_rsa.pub /tmp --拷貝出管理員公鑰
向gitosis添加公鑰并初始化:
$ sudo -H -u gitadmin gitosis-init < /tmp/id_rsa.pub
Initialized empty Git repository in /home/gitadmin/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /home/gitadmin/repositories/gitosis-admin.git/
這樣該公鑰的擁有者gitadmin就能修改用于配置Gitosis的那個特殊Git倉庫了。接 下來,需要手工對該倉庫中的post-update 腳本加上可執行權限:
$ sudo chmod 755 /home/gitadmin/repositories/gitosis-admin.git/hooks/post-update
到此為止git服務器端的搭建結束,管理員為gitadmin。
6、倉庫管理員信息:
現在在終端下進到用戶主目錄,克隆Gitosis的控制倉庫:
$ git clone gitadmin@server:gitosis-admin.git
當前目錄下將得到一個名為 gitosis-admin 的工作目錄,主要由兩部分組成:
$ cd gitosis-admin
$ find .
./gitosis.conf
./keydir
./keydir/gitadmin.pub
gitosis.conf 文件是用來設置用戶、倉庫和權限的控制文件。keydir 目錄則是保存所有 具有訪問權限用戶公鑰的地方(每人一個)。在 keydir 里的文件名(如我gitadmin.pub) 應該跟你的不一樣,Gitosis會自動從使用 gitosis-init 腳本導入的公鑰尾部描述中獲取 該名字。用編輯器 gitosis.conf 文件的內容,只包含與剛剛克隆的 gitosis-admin 相關 的信息:
$ cat gitosis.conf
[gitosis]
[group gitosis-admin]
members = gitadmin
writable = gitosis-admin
它顯示用戶 gitadmin是唯一能管理 gitosis-admin 項目的人。
二、測試用例
PC客戶端下:
1、安裝git客戶端
訪問git官網,下載安裝包(許多Windows上的git服務都以msysgit作為支撐支撐軟件,建議讀者安裝):
下載后按默認配置安裝完畢,會出現git.bash命令行工具:
1、接下來的pc端工作在git.bash命令行內完成:
測試能否ssh登錄遠程主機:
$ cd ~
$ ssh gitadmin@host --遠程登錄
由于無法確認遠程host主機的真實性,shell會告訴你它的公鑰指紋讓你確認,鍵入yes:
Are you sure you want to continue connecting (yes/no)?? yes
輸入遠程主機gitadmin的密碼,正常情況下這里就能夠登錄成功,顯示gitadmin用戶
$ exit --退出遠程登錄
配置免密碼登陸:
$ ssh-keygen -t rsa?????? --生成本機密鑰,公鑰默認在~/.ssh/id_rsa.pub
未使用gitosis情況下執行:
$ ssh-copy-id gitadmin@host?? --上傳公鑰,遠程主機host為服務器IP
使用gitosis管理公鑰則執行:
$ scp ~/.ssh/id_rsa.pub gitadmin@host:/tmp --遠程拷貝公鑰至服務器臨時目錄
2、可視化工具
在安裝官方git的同時,它也給我們提供了gitk 和 git-gui兩種可視化工具:
gitk 是一個歷史記錄的圖形化查看器。
cd 到一個Git倉庫,然后鍵入:
$ gitk [git log options]
git-gui 則主要是一個用來制作提交的工具:
$ git gui
注意:
本部分末參考鏈接里有官網推薦的Git圖形化客戶端(github上還有更多選擇),更親近不熟悉命令行的使用者。由于這一部分的選擇較多,但究其實現原理還是一樣的,所以這里就不做延伸。請使用者參考本文或搜索自行選擇的客戶端相應教程進行配置。
Ubuntu服務器端下:
1、管理gitosis:
$ cd ~
$ git clone gitadmin@host:/home/gitadmin/gitosis-admin.git
$ cd gitosis-admin/
接下來各個用戶按照前面安裝配置gitosis時提到的辦法生成各自的ssh公鑰文件后, scp上傳到服務器/tmp 目錄下,也可由服務器管理員手動取得,并最終重命名為各用戶 名后拷貝到keydir目錄下,就能實現使用git協同作業了。
2、gitosis.conf文件講解:
[gitosis]
[group gitosis-admin]
writable = gitosis-admin
members = a@server1
[group developers]
writable = helloworld
members = a@server1 b@server2
[group test]
readonly = helloworld
members = c@server3
這個配置文件表達了如下含義:gitosis-admin組成員有a,該組對gitosis-admin倉庫 有讀寫權限; developers組有a,b兩個成員,該組對helloworld倉庫有讀寫權限; test 組有c一個成員,對helloworld倉庫有只讀權限。當然目前這些配置文件的修改只是 在你的本地,你必須推送到gitserver上才能真正生效。
操作方法:
加入新文件、提交并推送到git服務器:
$ git add . --添加命令,這里的點’.’表示當前目錄
$ git commit -am "add helloworld project and users" --提交,并描述此次行為
$ git remote add origin ssh://gitadmin@host:helloworld.git
添加遠程主機
$ git push origin master --推送到服務器master分支
這里介紹遠程主機URL修改方法,需要進到待修改倉庫目錄下:
方法一:先刪除$ git remote rm origin 再添加$ git remote add origin URL
方法二:$ git remote set-url origin URL
方法三:進入.git目錄下修改config文件
3、演示操作
現在我們來添加一個新項目。為此我們要建立一個名為mobile的新段落,在其中羅列 手機開發團隊的開發者,以及他們擁有寫權限的項目。由于 'gitadmin' 是系統中的唯 一用戶,我們把他設為唯一用戶,并允許他讀寫名為 iphone_project 的新項目:
[group mobile]
members = gitadmin
writable = iphone_project
修改完之后,提交 gitosis-admin 里的改動,并推送到服務器使其生效:
選擇目錄創建裸倉(本步驟可省略,我們不用事先到服務器上手工創建該項目的裸倉庫, Gitosis會在第一次遇到推送時自動創建):
$ mkdir iphone_project.git
$ sudo git init --bare iphone_project.git
$ sudo chown -R gitadmin:gitadmin iphone_project.git
添加新工程并提交用戶組:
$ git commit -am 'add iphone_project and mobile group'
在新工程 iphone_project 首次推送數據到服務器前,得先設定該服務器地址為遠程 倉庫,注意使用gitosis可以不用指明完整路徑,只需要一個冒號加項目名字即可, Gitosis會自動幫你映射到實際位置:
$ git remote add origin gitadmin@host:iphone_project.git
推送到服務器:
$ git push origin master
要和朋友們在一個項目上協同工作,就得重新添加他們的公鑰。不過這次不用在服務器 上一個一個手工添加到 ~/.ssh/authorized_keys 文件末端,而只需管理 keydir 目錄中的 公鑰文件(文件的命名由 gitosis.conf 中用戶的標識名決定),并修改gitosis.conf , 最后用前面的方法推送到服務器配置生效。
現在我們為 John,Josie 和 Jessica 添加公鑰:
$ cp /tmp/id_rsa.john.pub keydir/john.pub
$ cp /tmp/id_rsa.josie.pub keydir/josie.pub
$ cp /tmp/id_rsa.jessica.pub keydir/jessica.pub
然后把他們都加進 'mobile' 團隊,讓他們對 iphone_project 具有讀寫權限:
[group mobile]
members = scott john josie jessica
writable = iphone_project
如果你提交并推送這個修改,四個用戶將同時具有該項目的讀寫權限。
Gitosis 也具有簡單的訪問控制功能。如果想讓John只有讀權限,可以這樣做:
[group mobile]
members = scott josie jessica
writable = iphone_project
[group mobile_readonly]
members = john
readonly = iphone_project
現在 John 可以克隆和獲取更新,但 Gitosis 不會允許他向項目推送任何內容。像這 樣的組可以隨意創建,多少不限,每個都可以包含若干不同的用戶和項目。甚至還可以 指定某個組為成員之一(在組名前加上 @前綴),自動繼承該組的成員:
[group mobile_committers]
members = scott josie jessica
[group mobile]
members?? = @mobile_committers
writable? = iphone_project
[group mobile_another]
members?? = @mobile_committers john
writable? = another_iphone_project
如果遇到意外問題,試試看把 loglevel=DEBUG 加到 [gitosis] 的段落,即把日志設置為調試級別,記錄更詳細的運行信息。如果一不小心搞錯了配置,失去了推送權限,也可以手工修改服務器上的 /home/git/.gitosis.conf 文件,因為Gitosis 實際是從該文件讀取信息的。它在得到推送數據時,會把新的 gitosis.conf 存到該路徑上。所以如果你手工編輯該文件的話,它會一直保持到下次向gitosis-admin 推送新版本的配置內容為止。
三、參考
第三部分:搭建B/S架構Git服務器
一、搭建步驟
本部分將講解如何基于瀏覽器訪問Git服務器,雖然 GitWeb 相當簡單,但眼下有一些更現代,功能更全的Git服務器,其中有幾個開源的解決方案可供人們選擇安裝。GitLab是其中最出名的一個,我將使用它作為示例并討論其安裝和使用。這比GitWeb要復雜的多并且需要更多的維護,但它是一個功能更為健全的方案。
1、安裝gitlab:
GitLab是一個數據庫支持的開源web應用,可通過Web界面進行訪問公開的或者私人項目。它是一個擁有Github類似的功能、實現了自托管的Git項目倉庫。所以相比于其他git服務器,它的安裝過程涉及到更多的東西。幸運的是,這個過程有非常詳細的文檔說明和支持,而且在Bitnami(一個產生的開源軟件的項目)可以獲取一鍵安裝包:
在Ubuntu服務器端打開Bitnami,由于我的是64位操作系統,選擇第一個進行下載。(本教程基于gitlab 8.7.4-0)完成之后在終端下用cd命令進入其所在目錄:
$ sudo chmod +x bitnami-gitlab-8.7.3-0-linux-installer.run --修改權限,文件名以自己為準
$ sudo ./bitnami-gitlab-7.4.3-0-linux-installer.run --以管理員權限執行安裝
接下來將出現如下安裝界面(此前服務器需要安裝SSH server),整個過程基本點擊Next就可以完成安裝:
注意這里的小叉代表勾選
設置你自己的郵箱、登錄名、密碼,這將在之后的網頁端作為管理員賬戶登錄信息
如果你的默認端口80, 3306有占用,則需要修改或者解除占用。我的80端口由于之前安裝過Apache而被占用,所以我將之卸載。(此一鍵安裝包已經內置了Apache2)
這里提供一條卸載命令:$ sudo apt-get autoremove [application or package-name]
用戶在網頁端注冊的時候需要對所填郵箱進行驗證,所以這里的mail support建議勾選上,郵箱驗證沒通過是無法登錄gitlab的。當然如果你在此并沒有勾選或者注冊后沒有收到驗證郵件也不要緊,在管理員登錄網頁端后,在全局設置界面可以方便的通過所有待驗證用戶。接下來一路Next直至Finish,Gitlab的安裝到此完成,之后會有幫助窗口出現,有興趣可以看看。
注意,在安裝的目錄下有個文件:ctlscript.sh,通過./ctlscript.sh可以關閉和啟動gitlab服務器:(具體見README文件)
$ sudo /opt/gitlab-8.7.3-0/ctlscript.sh [start/stop/restart]
gitlab在安裝目錄下有一個GUI管理控制臺,啟動命令:
$ sudo /opt/gitlab-8.7.3-0/manager-linux-x64.run
2、用戶管理:
管理員登錄:
接下來咱們打開Ubuntu的瀏覽器,在地址欄輸入localhost/將打開gitlab登錄頁面,輸入注冊時設置的郵箱(或者登錄名)以及密碼,進入gitlab。
注意:這里的地址也可以輸入安裝過程中提示的本地IP,我的是127.0.1.1;如果在局域網內其他電腦上,則在地址欄輸入服務器IP。(Ubuntu命令行下ifconfig可以得到本地IP)
新用戶注冊:
在客戶端電腦打開瀏覽器,在地址欄輸入局域網服務器IP進入登錄/注冊頁面:
郵箱驗證(如果沒收到郵件繼續參照下方操作)
回到剛剛登錄的服務器端的瀏覽器管理員頁面,點擊右上角的全局設置(下圖中的扳手)
點擊左側面板的Users
剛剛在PC端注冊的新用戶developer01出現在這里,點擊用戶名:
就能在接下來的頁面對其手動進行驗證,點擊Confirm user,此驗證欄將消失,代表新用戶developer01已經通過驗證,注冊成功。此時的PC端再次登錄就可以進入Gitlab啦!
二、測試用例
經過以上的操作,希望大家對Gitlab頁面布局有一定的熟悉,接下來我將講解在各種環境下如何部署項目代碼倉庫并進行基本操作。
Gitlab的管理員頁面中,在左側的面板下可以非常便捷地創建用戶、用戶組、新工程,并進行管理,還集成了各類事件消息。在為新工程添加用戶時可以設置其權限,添加后同樣可以在左側面板的Members選項面對其進行管理。
比如我在管理員端創建了mobiledevelopers用戶組,并在該組下創建了新工程mobile_dev,并添加了用戶developer01,而此時的developer01并沒有辦法對此項目倉庫進行Git操作,提示需要添加SSH秘鑰:
參考前文生成的我們需要的ssh公鑰,其儲存路徑為~/.ssh/id_rsa.pub(用戶主目錄下.ssh/文件夾的id_rsa.pub),找到并用任意文本編輯器(推薦Notepad++)打開,復制其全部內容(Ctrl+A、Ctrl+C),返回瀏覽器頁面點擊add an SSH key :
將公鑰粘貼(Ctrl+V)至key欄,下邊的Title在點擊時將自動填充,最后Add key添加成功,到此用戶developer01對此項目倉庫將具備管理員賦予的權限。
Web頁面:
進入項目,點擊左側面板Files選項,可進行文件的編輯、上傳,文件夾的上傳,創建新分支和標簽(管理員)等行為。
例:創建一個新文本文件filetest01:
提交后叫在左側的Merge Requests將出現此合并請求。
命令行:
新建Git項目:
Git global setup(Git全局設置):
$ git config --global user.name "name"
$ git config --global user.email "name@email.com"
Create Repository(創建倉庫)
$ mkdir common-util
$ cd common-util
$ git init
添加并提交文件:
$ touch README
$ git add README
$ git commit -m 'first commit'
$ git remote add origin git@server:devteam/common-util.git
$ git push -u origin master
添加已存在Git項目:
$ cd existing_git_repo?
$ git remote add origin?git@server:devteam/common-util.git
$ git push -u origin master
到此可正常進行git操作,具體請參看第一部分。
客戶端:
本教程介紹的客戶端均為Windows環境下。
SourceTree
使用SourceTree軟件進行代碼開發的管理,客戶端免費支持windows和蘋果系統,下載地址:http://www.sourcetreeapp.com/。
安裝過程中需要認證用戶,在FQ環境下訪問Atlassian注冊賬戶后繼續安裝,之后會下載一些依賴,完成后可選擇跳過初始設置。
這里對SSH key登錄進行講解:
1、生成SSH keys:點擊工具--創建SSH秘鑰--點擊Generate--點擊Save public key和save private key,保存好公鑰和私鑰
2、Gitlab 配置SSH keys:瀏覽器打開Gitlab登錄自己的賬戶,按前面提到的方法添加公鑰SSH keys。
3、客戶端導入私鑰:回到source tree的工具,點擊“選項”,選擇上次生成的SSH秘鑰,點擊“確定”即可添加成功。
4、SSH助手配置:點擊“啟動SSH助手”,點擊“Add Key”,選擇之前導出的私鑰,添加成功后,查看公鑰跟Gitlab網頁添加的相同,則說明配置成功。
Eclipse中使用git--Egit:
EGit是Eclipse上的Git插件,官方內容參看:http://wiki.eclipse.org/EGit
EGIT使用教程:http://my.oschina.net/doloop/blog/221800
Git Bash+EGit在項目中配合使用最常用方法:
http://blog.csdn.net/hongshan50/article/details/22582049
Visual Studio 中使用git:
官方教程:https://www.visualstudio.com/en-us/get-started/code/gitquickstart