Git和SVN的詳細解釋
- Git歷史
同生活中的許多偉大事件一樣,Git 誕生於一個極富紛爭大舉創新的年代。Linux 核心開源專案有著為數眾廣的參與者。絕大多數的 Linux 核心維護工作都花在了提交補丁和儲存歸檔的繁瑣事務上(1991-2002年間)。到 2002 年,整個專案組開始啟用分散式版本控制系統 BitKeeper 來管理和維護程式碼。
到 2005 年的時候,開發 BitKeeper 的商業公司同 Linux 核心開源社群的合作關係結束,他們收回了免費使用 BitKeeper 的權力。這就迫使 Linux 開源社群(特別是 Linux的締造者 Linus Torvalds )不得不吸取教訓,只有開發一套屬於自己的版本控制系統才不至於重蹈覆轍。他們對新的系統訂了若干目標:
• 速度
• 簡單的設計
• 對非線性開發模式的強力支援(允許上千個並行開發的分支)
• 完全分散式
• 有能力高效管理類似 Linux 核心一樣的超大規模專案(速度和資料量)
- Git與svn對比
- Svn
SVN是集中式版本控制系統,版本庫是集中放在中央伺服器的,而幹活的時候,用的都是自己的電腦,所以首先要從中央伺服器哪裡得到最新的版本,然後幹活,幹完後,需要把自己做完的活推送到中央伺服器。集中式版本控制系統是必須聯網才能工作,如果在區域網還可以,頻寬夠大,速度夠快,如果在網際網路下,如果網速慢的話,就鬱悶了。
下圖就是標準的集中式版本控制工具管理方式:
集中管理方式在一定程度上看到其他開發人員在幹什麼,而管理員也可以很輕鬆掌握每個人的開發許可權。
但是相較於其優點而言,集中式版本控制工具缺點很明顯:
- 伺服器單點故障
- 容錯性差
- Git
Git是分散式版本控制系統,那麼它就沒有中央伺服器的,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯網了,因為版本都是在自己的電腦上。既然每個人的電腦都有一個完整的版本庫,那多個人如何協作呢?比如說自己在電腦上改了檔案A,其他人也在電腦上改了檔案A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。
下圖就是分散式版本控制工具管理方式:
- git工作流程
一般工作流程如下:
- 從遠端倉庫中克隆 Git 資源作為本地倉庫。
- 從本地倉庫中checkout程式碼然後進行程式碼修改
- 在提交前先將程式碼提交到暫存區。
- 提交修改。提交到本地倉庫。本地倉庫中儲存修改的各個歷史版本。
- 在修改完成後,需要和團隊成員共享程式碼時,可以將程式碼push到遠端倉庫。
下圖展示了 Git 的工作流程:
- Git的安裝
最早Git是在Linux上開發的,很長一段時間內,Git也只能在Linux和Unix系統上跑。不過,慢慢地有人把它移植到了Windows上。現在,Git可以在Linux、Unix、Mac和Windows這幾大平臺上正常運行了。由於開發機大多數情況都是windows,所以本教程只講解windows下的git的安裝及使用。
-
- 軟體下載
下載地址:https://git-scm.com/download
參考資料中安裝包已經下載完畢,根據不同的作業系統選擇對應的安裝包。
-
- 軟體安裝
- 安裝git for windows
- 軟體安裝
一路“下一步”使用預設選項即可。
-
-
- 安裝TortoiseGit
-
一路“下一步”使用預設選項即可。
預設選項下會啟動配置畫面:
由於目前只有英文語言包,預設即可繼續下一步。
配置git.exe,在4.2.1中已經安裝過git-for-windows了所以在此找到git.exe所在的目錄。
配置開發者姓名及郵箱,每次提交程式碼時都會把此資訊包含到提交的資訊中。
使用預設配置,點選“完成”按鈕完成配置。
完整完畢後在系統右鍵選單中會出現git的選單項。
-
-
- 安裝中文語言包
-
安裝中文語言包並不是必選項。可以根據個人情況來選擇安裝。
直接“下一步”完整完畢。
語言包安裝完畢後可以在TortoiseGit的設定中調整語言
- 使用git管理檔案版本
- 建立版本庫
什麼是版本庫呢?版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。由於git是分散式版本管理工具,所以git在不需要聯網的情況下也具有完整的版本管理能力。
建立一個版本庫非常簡單,可以使用git bash也可以使用tortoiseGit。首先,選擇一個合適的地方,建立一個空目錄(D:\temp\git\repository)。
-
-
- 使用GitBash
-
在當前目錄中點選右鍵中選擇Git Bash來啟動。
或者在開始選單中啟動。注意如果是從開始選單啟動的gitbash需要切換目錄到倉庫所在的目錄。
建立倉庫執行命令:
$ git init
-
-
- 使用TortoiseGit
-
使用TortoiseGit時只需要在目錄中點選右鍵選單選擇“在這裡建立版本庫”
版本庫建立成功,會在此目錄下建立一個.git的隱藏目錄,如下所示:
在windows中如何顯示隱藏目錄隱藏目錄請自行百度o(╯□╰)o
概念:
版本庫:“.git”目錄就是版本庫,將來檔案都需要儲存到版本庫中。
工作目錄:包含“.git”目錄的目錄,也就是.git目錄的上一級目錄就是工作目錄。只有工作目錄中的檔案才能儲存到版本庫中。
-
- 新增檔案
- 新增檔案過程
- 新增檔案
在D:\temp\git\repository目錄下建立一個mytest.txt檔案
文字檔案變為帶“+”號的圖示:
提交檔案:在mytest.txt上再次點選右鍵選擇“提交”,此時將檔案儲存至版本庫中。
-
-
- 工作區和暫存區
-
Git和其他版本控制系統如SVN的一個不同之處就是有暫存區的概念。
什麼是工作區(Working Directory)?
工作區就是你在電腦裡能看到的目錄,比如我的reporstory資料夾就是一個工作區。
有的同學可能會說repository不是版本庫嗎怎麼是工作區了?其實repository目錄是工作區,在這個目錄中的“.git”隱藏資料夾才是版本庫。這回概念清晰了吧。
Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master,以及指向master的一個指標叫HEAD。
如下圖所示:
分支和HEAD的概念我們稍後再講。前面講了我們把檔案往Git版本庫裡新增的時候,是分兩步執行的:
第一步是用git add把檔案新增進去,實際上就是把檔案修改新增到暫存區;
第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。
因為我們建立Git版本庫時,Git自動為我們建立了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。
你可以簡單理解為,需要提交的檔案修改通通放到暫存區,然後,一次性提交暫存區的所有修改。
-
- 修改檔案
- 提交修改
- 修改檔案
被版本庫管理的檔案不可避免的要發生修改,此時只需要直接對檔案修改即可。修改完畢後需要將檔案的修改提交到版本庫。
在mytest.txt檔案上點選右鍵,然後選擇“提交”
-
-
- 檢視修改歷史
-
在開發過程中可能會經常檢視程式碼的修改歷史,或者叫做修改日誌。來檢視某個版本是誰修改的,什麼時間修改的,修改了哪些內容。
可以在檔案上點選右鍵選擇“顯示日誌”來檢視檔案的修改歷史。
-
-
- 差異比較
-
當檔案內容修改後,需要和修改之前對比一下修改了哪些內容此時可以使用“比較差異功能”
-
-
- 還原修改
-
當檔案修改後不想把修改的內容提交,還想還原到未修改之前的狀態。此時可以使用“還原”功能
注意:此操作會撤銷所有未提交的修改,所以當做還原操作是需要慎重慎重!!!
-
- 刪除檔案
需要刪除無用的檔案時可以使用git提供的刪除功能直接將檔案從版本庫中刪除。
-
- 案例:將java工程提交到版本庫
第一步:將參考資料中的java工程project-test複製到工作目錄中
第二步:將工程新增到暫存區。
點選確定完成暫存區新增。
三、忽略檔案或資料夾
在此工程中,並不是所有檔案都需要儲存到版本庫中的例如“bin”目錄及目錄下的檔案就可以忽略。好在Git考慮到了大家的感受,這個問題解決起來也很簡單,在Git工作區的根目錄下建立一個特殊的.gitignore檔案,然後把要忽略的檔名填進去,Git就會自動忽略這些檔案。
如果使用TortoiseGit的話可以使用選單項直接進行忽略。
選擇保留本地檔案。完成後在此資料夾內會多出一個.gitignore檔案,這個檔案就是檔案忽略檔案,當然也可以手工編輯。其中的內容就是把bin目錄忽略掉。
- 提交程式碼
將程式碼新增到master分支上,其中.gitignore檔案也需要新增到暫存區,然後提交到版本庫。
-
- 忽略檔案語法規範
空行或是以 # 開頭的行即註釋行將被忽略。
可以在前面新增正斜槓 / 來避免遞迴,下面的例子中可以很明白的看出來與下一條的區別。
可以在後面新增正斜槓 / 來忽略資料夾,例如 build/ 即忽略build資料夾。
可以使用 ! 來否定忽略,即比如在前面用了 *.apk ,然後使用 !a.apk ,則這個a.apk不會被忽略。
* 用來匹配零個或多個字元,如 *.[oa] 忽略所有以".o"或".a"結尾, *~ 忽略所有以 ~ 結尾的檔案(這種檔案通常被許多編輯器標記為臨時檔案); [] 用來匹配括號內的任一字元,如 [abc] ,也可以在括號內加連線符,如 [0-9] 匹配0至9的數; ? 用來匹配單個字元。
看了這麼多,還是應該來個栗子:
# 忽略 .a 檔案
*.a
# 但否定忽略 lib.a, 儘管已經在前面忽略了 .a 檔案
!lib.a
# 僅在當前目錄下忽略 TODO 檔案, 但不包括子目錄下的 subdir/TODO
/TODO
# 忽略 build/ 資料夾下的所有檔案
build/
# 忽略 doc/notes.txt, 不包括 doc/server/arch.txt
doc/*.txt
# 忽略所有的 .pdf 檔案 在 doc/ directory 下的
doc/**/*.pdf
- 遠端倉庫
- 新增遠端庫
現在我們已經在本地建立了一個Git倉庫,又想讓其他人來協作開發,此時就可以把本地倉庫同步到遠端倉庫,同時還增加了本地倉庫的一個備份。
常用的遠端倉庫就是github:https://github.com/,接下來我們演示如何將原生代碼同步到github。
-
-
- 在github上建立倉庫
-
首先你得在github上建立一個賬號,這個就不演示了。然後在github上建立一個倉庫:
點選“create repository”按鈕倉庫就建立成功了。
Github支援兩種同步方式“https”和“ssh”。如果使用https很簡單基本不需要配置就可以使用,但是每次提交程式碼和下載程式碼時都需要輸入使用者名稱和密碼。而且如果是公司配置的私有git伺服器一般不提供hppts方式訪問,所以我們著重將“ssh”方式。
-
-
- ssh協議
- 什麼是ssh?
- ssh協議
-
SSH是英文Secure Shell的簡寫形式。通過使用SSH,你可以把所有傳輸的資料進行加密,這樣"中間人"這種攻擊方式就不可能實現了,而且也能夠防止DNS欺騙和IP欺騙。使用SSH,還有一個額外的好處就是傳輸的資料是經過壓縮的,所以可以加快傳輸的速度。SSH有很多功能,它既可以代替Telnet,又可以為FTP、Pop、甚至為PPP提供一個安全的"通道"。
如果一個使用者從本地計算機,使用SSH協議登入另一臺遠端計算機,我們就可以認為,這種登入是安全的,即使被中途截獲,密碼也不會洩露。
最早的時候,網際網路通訊都是明文通訊,一旦被截獲,內容就暴露無疑。1995年,芬蘭學者Tatu Ylonen設計了SSH協議,將登入資訊全部加密,成為網際網路安全的一個基本解決方案,迅速在全世界獲得推廣,目前已經成為Linux系統的標準配置。
-
-
-
- ssh金鑰生成
-
-
在windows下我們可以使用 Git Bash.exe來生成金鑰,可以通過開始選單或者右鍵選單開啟Git Bash
git bash 執行命令,生命公鑰和私鑰
命令: ssh-keygen -t rsa
執行命令完成後,在window本地使用者.ssh目錄C:\Users\使用者名稱\.ssh下面生成如下名稱的公鑰和私鑰:
-
-
-
- ssh金鑰配置
-
-
金鑰生成後需要在github上配置金鑰本地才可以順利訪問。
在key部分將id_rsa.pub檔案內容新增進去,然後點選“Add SSH key”按鈕完成配置。
-
-
- 同步到遠端倉庫
-
同步到遠端倉庫可以使用git bash也可以使用tortoiseGit
-
-
-
- 使用git bash
-
-
在倉庫所在的目錄(D:\temp\git\repository)點選右鍵選擇“Git Bash Here”,啟動git bash程式。
然後在git bash中執行如下語句:
git remote add origin [email protected]:sublun/mytest.git
git push -u origin master
注意:其中紅色字型部分需要替換成個人的使用者名稱。
如何出現如下錯誤:
可以先執行如下命令,然後再執行上面的命令
$ git remote rm origin
-
-
-
- 使用TortoiseGit同步
-
-
一、由於TortoiseGit使用的ssh工具是“PuTTY”git Bash使用的ssh工具是“openSSH”,如果想讓TortoiseGit也使用剛才生成的金鑰可以做如下配置:
Url:遠端倉庫的地址
推送URL:也是相同的
Putty金鑰:選擇剛才生成的金鑰中的私鑰
- 同步。在本地倉庫的資料夾中單擊右鍵,選擇“Git同步”
-
- 從遠端倉庫克隆
克隆遠端倉庫也就是從遠端把倉庫複製一份到本地,克隆後會建立一個新的本地倉庫。選擇一個任意部署倉庫的目錄,然後克隆遠端倉庫。
-
-
- 使用git bash:
-
$ git clone [email protected]:sublun/mytest.git
-
-
- 使用TortoiseGit:
-
在任意目錄點選右鍵:
-
- 從遠端倉庫取程式碼
Git中從遠端的分支獲取最新的版本到本地有這樣2個命令:
- git fetch:相當於是從遠端獲取最新版本到本地,不會自動merge(合併程式碼)
- git pull:相當於是從遠端獲取最新版本並merge到本地
上述命令其實相當於git fetch 和 git merge
在實際使用中,git fetch更安全一些
因為在merge前,我們可以檢視更新情況,然後再決定是否合併
如果使用TortoiseGit的話可以從右鍵選單中點選“拉取”(pull)或者“獲取”(fetch)
-
- 搭建私有Git伺服器
- 伺服器搭建
- 搭建私有Git伺服器
遠端倉庫實際上和本地倉庫沒啥不同,純粹為了7x24小時開機並交換大家的修改。GitHub就是一個免費託管開原始碼的遠端倉庫。但是對於某些視原始碼如生命的商業公司來說,既不想公開原始碼,又捨不得給GitHub交保護費,那就只能自己搭建一臺Git伺服器作為私有倉庫使用。
搭建Git伺服器需要準備一臺執行Linux的機器,在此我們使用CentOS。以下為安裝步驟:
1、安裝git服務環境準備
yum -y install curl curl-devel zlib-devel openssl-devel perl cpio expat-devel gettext-devel gcc cc
2、下載git-2.5.0.tar.gz
1)解壓縮
2)cd git-2.5.0
3)autoconf
4)./configure
5)make
6)make install
3、新增使用者
adduser -r -s /bin/sh -c 'git version control' -d /home/git git
4、設定/home/git資料夾操作許可權
mkdir /home/git
chown git:git /home/git
5、設定密碼
passwd git
輸入兩次密碼
6、切換到git使用者
su git
7、建立git倉庫
git --bare init /home/git/first
注意:如果不使用“--bare”引數,初始化倉庫後,提交master分支時報錯。這是由於git預設拒絕了push操作,需要.git/config新增如下程式碼:
[receive]
denyCurrentBranch = ignore
推薦使用:git --bare init初始化倉庫。
-
-
- 連線伺服器
-
私有git伺服器搭建完成後就可以向連線github一樣連線使用了,但是我們的git伺服器並沒有配置金鑰登入,所以每次連線時需要輸入密碼。
使用命令連線:
$ git remote add origin ssh://[email protected]/home/git/first
這種形式和剛才使用的形式好像不一樣,前面有ssh://字首,好吧你也可以這樣寫:
$ git remote add origin [email protected]:first
使用TortoiseGit同步的話參考上面的使用方法。
- 分支管理
- 建立合併分支
在我們每次的提交,Git都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,只有一條時間線,在Git裡,這個分支叫主分支,即master分支。HEAD指標嚴格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當前分支。
一開始的時候,master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能確定當前分支,以及當前分支的提交點:
每次提交,master分支都會向前移動一步,這樣,隨著你不斷提交,master分支的線也越來越長。
當我們建立新的分支,例如dev時,Git新建了一個指標叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上:
你看,Git建立一個分支很快,因為除了增加一個dev指標,改改HEAD的指向,工作區的檔案都沒有任何變化!
不過,從現在開始,對工作區的修改和提交就是針對dev分支了,比如新提交一次後,dev指標往前移動一步,而master指標不變:
假如我們在dev上的工作完成了,就可以把dev合併到master上。Git怎麼合併呢?最簡單的方法,就是直接把master指向dev的當前提交,就完成了合併:
所以Git合併分支也很快!就改改指標,工作區內容也不變!
合併完分支後,甚至可以刪除dev分支。刪除dev分支就是把dev指標給刪掉,刪掉後,我們就剩下了一條master分支:
-
- 使用TortoiseGit實現分支管理
使用TortoiseGit管理分支就很簡單了。
-
-
- 建立分支
-
在本地倉庫資料夾中點選右鍵,然後從選單中選擇“建立分支”:
如果想建立完畢後直接切換到新分支可以勾選“切換到新分支”選項或者從選單中選擇“切換/檢出”來切換分支:
-
-
- 合併分支
-
分支切換到dev後就可以對工作區的檔案進行修改,然後提交到dev分支原理的master分支不受影響。例如我們修改mytest.txt中的內容,然後提交到dev分支。
切換到master分支後還是原理的內容:
將dev分支的內容合併到master分支,當前分支為master。從右鍵選單中選擇“合併”:
再檢視mytest.txt的內容就已經更新了:
-
- 解決衝突
兩個分支中編輯的內容都是相互獨立互不干擾的,那麼如果在兩個分支中都對同一個檔案進行編輯,然後再合併,就有可能會出現衝突。
例如在master分支中對mytest.txt進行編輯:
然後提交到版本庫。
切換到dev分支,對mytest.txt進行編輯:
最後進行分支合併,例如將dev分支合併到master分支。需要先切換到master分支然後進行分支合併。
出現版本衝突。
衝突需要手動解決。
在衝突檔案上單機右鍵選擇“解決衝突”選單項:
把衝突解決完畢的檔案提交到版本庫就可以了。
- Eclipse客戶端egit
- 安裝egit外掛
EclipseMars版本自帶此外掛
如果使用eclipse的egit外掛是不需要安裝git。
-
- Egit使用
- 使用者資訊
- Egit使用
配置使用者資訊,此資訊為提交程式碼時,提交者的身份認證資訊。
-
-
- 將工程新增到本地倉庫
-
當工程新增到本地倉庫後,工程的位置已經及移動到本地倉庫。
-
-
- 新增暫存區
- 忽略檔案
- 新增暫存區
-
在新增暫存區之前,專案中有些檔案不需要上傳到倉庫中,可以使用git排除配置檔案.gitignore來忽略上傳檔案。
-
-
-
- 新增到暫存區
-
-
把本地檔案新增本地版本庫暫存區域。
-
-
- 提交(本地倉庫)
-
必須先新增到暫存區域後才能提交程式碼
注意:提交時必須編寫提交資訊,不能新增空格。
-
-
- 共享版本庫(push到遠端倉庫)
-
本地使用者提交先提交到本地版本庫,如果需要提交到共享版本庫,那麼就需要push到遠端共享版本庫。
選擇push把當前專案程式碼push到共享版本庫中。
填寫遠端倉庫地址:
點選finish提交成功。
-
-
- 克隆(從遠端倉庫下載程式碼)
-
選擇git檢視,建立共享版本庫:
指定共享版本庫位置,連線共享版本庫。更新程式碼到本地倉庫
建立新的本地倉庫:
本地倉庫建立完畢:
此操作是把遠端倉庫克隆到本地倉庫。
接下來需要把本地倉庫專案匯入到本地eclipse中進行開發:
直接匯入專案:
-
-
- 更新
-
直接從共享版本庫更新版本內容。
-
-
- 解決衝突
-
使用合併工具merge tool解決衝突:
- Git歷史
同生活中的許多偉大事件一樣,Git 誕生於一個極富紛爭大舉創新的年代。Linux 核心開源專案有著為數眾廣的參與者。絕大多數的 Linux 核心維護工作都花在了提交補丁和儲存歸檔的繁瑣事務上(1991-2002年間)。到 2002 年,整個專案組開始啟用分散式版本控制系統 BitKeeper 來管理和維護程式碼。
到 2005 年的時候,開發 BitKeeper 的商業公司同 Linux 核心開源社群的合作關係結束,他們收回了免費使用 BitKeeper 的權力。這就迫使 Linux 開源社群(特別是 Linux的締造者 Linus Torvalds )不得不吸取教訓,只有開發一套屬於自己的版本控制系統才不至於重蹈覆轍。他們對新的系統訂了若干目標:
• 速度
• 簡單的設計
• 對非線性開發模式的強力支援(允許上千個並行開發的分支)
• 完全分散式
• 有能力高效管理類似 Linux 核心一樣的超大規模專案(速度和資料量)
- Git與svn對比
- Svn
SVN是集中式版本控制系統,版本庫是集中放在中央伺服器的,而幹活的時候,用的都是自己的電腦,所以首先要從中央伺服器哪裡得到最新的版本,然後幹活,幹完後,需要把自己做完的活推送到中央伺服器。集中式版本控制系統是必須聯網才能工作,如果在區域網還可以,頻寬夠大,速度夠快,如果在網際網路下,如果網速慢的話,就鬱悶了。
下圖就是標準的集中式版本控制工具管理方式:
集中管理方式在一定程度上看到其他開發人員在幹什麼,而管理員也可以很輕鬆掌握每個人的開發許可權。
但是相較於其優點而言,集中式版本控制工具缺點很明顯:
- 伺服器單點故障
- 容錯性差
- Git
Git是分散式版本控制系統,那麼它就沒有中央伺服器的,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯網了,因為版本都是在自己的電腦上。既然每個人的電腦都有一個完整的版本庫,那多個人如何協作呢?比如說自己在電腦上改了檔案A,其他人也在電腦上改了檔案A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。
下圖就是分散式版本控制工具管理方式:
- git工作流程
一般工作流程如下:
- 從遠端倉庫中克隆 Git 資源作為本地倉庫。
- 從本地倉庫中checkout程式碼然後進行程式碼修改
- 在提交前先將程式碼提交到暫存區。
- 提交修改。提交到本地倉庫。本地倉庫中儲存修改的各個歷史版本。
- 在修改完成後,需要和團隊成員共享程式碼時,可以將程式碼push到遠端倉庫。
下圖展示了 Git 的工作流程:
- Git的安裝
最早Git是在Linux上開發的,很長一段時間內,Git也只能在Linux和Unix系統上跑。不過,慢慢地有人把它移植到了Windows上。現在,Git可以在Linux、Unix、Mac和Windows這幾大平臺上正常運行了。由於開發機大多數情況都是windows,所以本教程只講解windows下的git的安裝及使用。
-
- 軟體下載
下載地址:https://git-scm.com/download
參考資料中安裝包已經下載完畢,根據不同的作業系統選擇對應的安裝包。
-
- 軟體安裝
- 安裝git for windows
- 軟體安裝
一路“下一步”使用預設選項即可。
-
-
- 安裝TortoiseGit
-
一路“下一步”使用預設選項即可。
預設選項下會啟動配置畫面:
由於目前只有英文語言包,預設即可繼續下一步。
配置git.exe,在4.2.1中已經安裝過git-for-windows了所以在此找到git.exe所在的目錄。
配置開發者姓名及郵箱,每次提交程式碼時都會把此資訊包含到提交的資訊中。
使用預設配置,點選“完成”按鈕完成配置。
完整完畢後在系統右鍵選單中會出現git的選單項。
-
-
- 安裝中文語言包
-
安裝中文語言包並不是必選項。可以根據個人情況來選擇安裝。
直接“下一步”完整完畢。
語言包安裝完畢後可以在TortoiseGit的設定中調整語言
- 使用git管理檔案版本
- 建立版本庫
什麼是版本庫呢?版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。由於git是分散式版本管理工具,所以git在不需要聯網的情況下也具有完整的版本管理能力。
建立一個版本庫非常簡單,可以使用git bash也可以使用tortoiseGit。首先,選擇一個合適的地方,建立一個空目錄(D:\temp\git\repository)。
-
-
- 使用GitBash
-
在當前目錄中點選右鍵中選擇Git Bash來啟動。
或者在開始選單中啟動。注意如果是從開始選單啟動的gitbash需要切換目錄到倉庫所在的目錄。
建立倉庫執行命令:
$ git init
-
-
- 使用TortoiseGit
-
使用TortoiseGit時只需要在目錄中點選右鍵選單選擇“在這裡建立版本庫”
版本庫建立成功,會在此目錄下建立一個.git的隱藏目錄,如下所示:
在windows中如何顯示隱藏目錄隱藏目錄請自行百度o(╯□╰)o
概念:
版本庫:“.git”目錄就是版本庫,將來檔案都需要儲存到版本庫中。
工作目錄:包含“.git”目錄的目錄,也就是.git目錄的上一級目錄就是工作目錄。只有工作目錄中的檔案才能儲存到版本庫中。
-
- 新增檔案
- 新增檔案過程
- 新增檔案
在D:\temp\git\repository目錄下建立一個mytest.txt檔案
文字檔案變為帶“+”號的圖示:
提交檔案:在mytest.txt上再次點選右鍵選擇“提交”,此時將檔案儲存至版本庫中。
-
-
- 工作區和暫存區
-
Git和其他版本控制系統如SVN的一個不同之處就是有暫存區的概念。
什麼是工作區(Working Directory)?
工作區就是你在電腦裡能看到的目錄,比如我的reporstory資料夾就是一個工作區。
有的同學可能會說repository不是版本庫嗎怎麼是工作區了?其實repository目錄是工作區,在這個目錄中的“.git”隱藏資料夾才是版本庫。這回概念清晰了吧。
Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master,以及指向master的一個指標叫HEAD。
如下圖所示:
分支和HEAD的概念我們稍後再講。前面講了我們把檔案往Git版本庫裡新增的時候,是分兩步執行的:
第一步是用git add把檔案新增進去,實際上就是把檔案修改新增到暫存區;
第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。
因為我們建立Git版本庫時,Git自動為我們建立了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。
你可以簡單理解為,需要提交的檔案修改通通放到暫存區,然後,一次性提交暫存區的所有修改。
-
- 修改檔案
- 提交修改
- 修改檔案
被版本庫管理的檔案不可避免的要發生修改,此時只需要直接對檔案修改即可。修改完畢後需要將檔案的修改提交到版本庫。
在mytest.txt檔案上點選右鍵,然後選擇“提交”
-
-
- 檢視修改歷史
-
在開發過程中可能會經常檢視程式碼的修改歷史,或者叫做修改日誌。來檢視某個版本是誰修改的,什麼時間修改的,修改了哪些內容。
可以在檔案上點選右鍵選擇“顯示日誌”來檢視檔案的修改歷史。
-
-
- 差異比較
-
當檔案內容修改後,需要和修改之前對比一下修改了哪些內容此時可以使用“比較差異功能”
-
-
- 還原修改
-
當檔案修改後不想把修改的內容提交,還想還原到未修改之前的狀態。此時可以使用“還原”功能
注意:此操作會撤銷所有未提交的修改,所以當做還原操作是需要慎重慎重!!!
-
- 刪除檔案
需要刪除無用的檔案時可以使用git提供的刪除功能直接將檔案從版本庫中刪除。
-
- 案例:將java工程提交到版本庫
第一步:將參考資料中的java工程project-test複製到工作目錄中
第二步:將工程新增到暫存區。
點選確定完成暫存區新增。
三、忽略檔案或資料夾
在此工程中,並不是所有檔案都需要儲存到版本庫中的例如“bin”目錄及目錄下的檔案就可以忽略。好在Git考慮到了大家的感受,這個問題解決起來也很簡單,在Git工作區的根目錄下建立一個特殊的.gitignore檔案,然後把要忽略的檔名填進去,Git就會自動忽略這些檔案。
如果使用TortoiseGit的話可以使用選單項直接進行忽略。
選擇保留本地檔案。完成後在此資料夾內會多出一個.gitignore檔案,這個檔案就是檔案忽略檔案,當然也可以手工編輯。其中的內容就是把bin目錄忽略掉。
- 提交程式碼
將程式碼新增到master分支上,其中.gitignore檔案也需要新增到暫存區,然後提交到版本庫。
-
- 忽略檔案語法規範
空行或是以 # 開頭的行即註釋行將被忽略。
可以在前面新增正斜槓 / 來避免遞迴,下面的例子中可以很明白的看出來與下一條的區別。
可以在後面新增正斜槓 / 來忽略資料夾,例如 build/ 即忽略build資料夾。
可以使用 ! 來否定忽略,即比如在前面用了 *.apk ,然後使用 !a.apk ,則這個a.apk不會被忽略。
* 用來匹配零個或多個字元,如 *.[oa] 忽略所有以".o"或".a"結尾, *~ 忽略所有以 ~ 結尾的檔案(這種檔案通常被許多編輯器標記為臨時檔案); [] 用來匹配括號內的任一字元,如 [abc] ,也可以在括號內加連線符,如 [0-9] 匹配0至9的數; ? 用來匹配單個字元。
看了這麼多,還是應該來個栗子:
# 忽略 .a 檔案
*.a
# 但否定忽略 lib.a, 儘管已經在前面忽略了 .a 檔案
!lib.a
# 僅在當前目錄下忽略 TODO 檔案, 但不包括子目錄下的 subdir/TODO
/TODO
# 忽略 build/ 資料夾下的所有檔案
build/
# 忽略 doc/notes.txt, 不包括 doc/server/arch.txt
doc/*.txt
# 忽略所有的 .pdf 檔案 在 doc/ directory 下的
doc/**/*.pdf
- 遠端倉庫
- 新增遠端庫
現在我們已經在本地建立了一個Git倉庫,又想讓其他人來協作開發,此時就可以把本地倉庫同步到遠端倉庫,同時還增加了本地倉庫的一個備份。
常用的遠端倉庫就是github:https://github.com/,接下來我們演示如何將原生代碼同步到github。
-
-
- 在github上建立倉庫
-
首先你得在github上建立一個賬號,這個就不演示了。然後在github上建立一個倉庫:
點選“create repository”按鈕倉庫就建立成功了。
Github支援兩種同步方式“https”和“ssh”。如果使用https很簡單基本不需要配置就可以使用,但是每次提交程式碼和下載程式碼時都需要輸入使用者名稱和密碼。而且如果是公司配置的私有git伺服器一般不提供hppts方式訪問,所以我們著重將“ssh”方式。
-
-
- ssh協議
- 什麼是ssh?
- ssh協議
-
SSH是英文Secure Shell的簡寫形式。通過使用SSH,你可以把所有傳輸的資料進行加密,這樣"中間人"這種攻擊方式就不可能實現了,而且也能夠防止DNS欺騙和IP欺騙。使用SSH,還有一個額外的好處就是傳輸的資料是經過壓縮的,所以可以加快傳輸的速度。SSH有很多功能,它既可以代替Telnet,又可以為FTP、Pop、甚至為PPP提供一個安全的"通道"。
如果一個使用者從本地計算機,使用SSH協議登入另一臺遠端計算機,我們就可以認為,這種登入是安全的,即使被中途截獲,密碼也不會洩露。
最早的時候,網際網路通訊都是明文通訊,一旦被截獲,內容就暴露無疑。1995年,芬蘭學者Tatu Ylonen設計了SSH協議,將登入資訊全部加密,成為網際網路安全的一個基本解決方案,迅速在全世界獲得推廣,目前已經成為Linux系統的標準配置。
-
-
-
- ssh金鑰生成
-
-
在windows下我們可以使用 Git Bash.exe來生成金鑰,可以通過開始選單或者右鍵選單開啟Git Bash
git bash 執行命令,生命公鑰和私鑰
命令: ssh-keygen -t rsa
執行命令完成後,在window本地使用者.ssh目錄C:\Users\使用者名稱\.ssh下面生成如下名稱的公鑰和私鑰:
-
-
-
- ssh金鑰配置
-
-
金鑰生成後需要在github上配置金鑰本地才可以順利訪問。
在key部分將id_rsa.pub檔案內容新增進去,然後點選“Add SSH key”按鈕完成配置。
-
-
- 同步到遠端倉庫
-
同步到遠端倉庫可以使用git bash也可以使用tortoiseGit
-
-
-
- 使用git bash
-
-
在倉庫所在的目錄(D:\temp\git\repository)點選右鍵選擇“Git Bash Here”,啟動git bash程式。
然後在git bash中執行如下語句:
git remote add origin [email protected]:sublun/mytest.git
git push -u origin master
注意:其中紅色字型部分需要替換成個人的使用者名稱。
如何出現如下錯誤:
可以先執行如下命令,然後再執行上面的命令
$ git remote rm origin
-
-
-
- 使用TortoiseGit同步
-
-
一、由於TortoiseGit使用的ssh工具是“PuTTY”git Bash使用的ssh工具是“openSSH”,如果想讓TortoiseGit也使用剛才生成的金鑰可以做如下配置:
Url:遠端倉庫的地址
推送URL:也是相同的
Putty金鑰:選擇剛才生成的金鑰中的私鑰
- 同步。在本地倉庫的資料夾中單擊右鍵,選擇“Git同步”
-
- 從遠端倉庫克隆
克隆遠端倉庫也就是從遠端把倉庫複製一份到本地,克隆後會建立一個新的本地倉庫。選擇一個任意部署倉庫的目錄,然後克隆遠端倉庫。
-
-
- 使用git bash:
-
$ git clone [email protected]:sublun/mytest.git
-
-
- 使用TortoiseGit:
-
在任意目錄點選右鍵:
-
- 從遠端倉庫取程式碼
Git中從遠端的分支獲取最新的版本到本地有這樣2個命令:
- git fetch:相當於是從遠端獲取最新版本到本地,不會自動merge(合併程式碼)
- git pull:相當於是從遠端獲取最新版本並merge到本地
上述命令其實相當於git fetch 和 git merge
在實際使用中,git fetch更安全一些
因為在merge前,我們可以檢視更新