git

三種版本控制系統
三種版本的的區別
git (是個軟件) 是一種工具

githud (網站) 全球最火的代碼庫  上傳所有代碼 開源  權限控制不自由

gitlad(網站)  權限控制上更靈活(可公開,可不公開)不收費 共有倉庫 專門儲存代碼

什麼是集中式?
集中式開發:是將項目集中存放在中央服務器中,在工作的時候,大家只在自己電腦上操作,從同一個地方下載最新版本,然後開始工作,做完的工作再提交給中央服務器保存。這種方式需要聯網,現在雲開發就是這樣的處理方式。
       缺點:1.如果網絡出現異常或者很卡,直接影響工作效率。如果是中央服務器掛了,那就集體喝茶去了。
2.還有一種情況,各自電腦中操作的所有軟件工具,都存放在一箇中央服務器上(現在流行叫雲服務器),只需要用各自電腦登陸連接到雲服務器上,(一般服務 器都是用linux),比如用ps工具,大家其實用的是雲服務器中的同一個ps 軟件,在使用率高的情況下,ps會出現異常,當用ps篩選顏色的時候,已經混亂,無法正常選擇顏色,這個情況是我在開發中遇到的。以前我們是每個人用各自 安裝的ps,但是在這樣的環境下用的是同一個ps軟件的時候就會有bug。
3.安全度不高,重要的東西都放在一箇中央服務器中,如果被黑,那損失就大了。
優點:1.減少了硬件和軟件成本,硬件不用說了,現在流行盒子,一個小盒子只要連上中央服務器即可,以前都是一個個主機箱,那成本大多了。如果用到工具軟件需要收費,只需買一套正版就OK了。

git

什麼是分佈式?
分佈式開發:只要提供一臺電腦作爲版本集中存的服務器放就夠了,但這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它也一樣幹活,只是交換修改不方便而已。而每一臺電腦有各自獨立的開發環境,不需要聯網,本地直接運行,相對集中式安全係數高很多。
git
  

git部署
git
環境:
centos7u4
vm20 192.168.245.139 充當中央服務器
vm21 192.168.245.249

安裝:所有機器都安裝

yum install git -y
#git --version
git version 1.8.3.1

準備:
因爲Git是分佈式版本控制系統,所以,每個機器都必須自報家門:你的名字和Email地址。你也許會擔心,如果有人故意冒充別人怎麼辦?這個不必擔心,首先我們相信大家都是善良無知的羣衆,其次,真的有冒充的也是有辦法可查的。
注意git config命令的--global參數,用了這個參數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的用戶名和Email地址。

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

版本庫:
又名倉庫,英文名repository,可以簡單理解成一個目錄,這個目錄裏面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”.

1.創建一個空目錄:在vm20上創建

[root@vm20 /]# mkdir gittest
[root@vm20 /]# cd gittest/=

2.通過git init命令把這個目錄變成Git可以管理的倉庫:
方式1.創建本地庫:
這樣創建的庫其他機器可以clone,但是沒辦法push
[root@vm20 gittest]# git init
初始化空的 Git 版本庫於 /gittest/.git/

創建完成後查看庫目錄:
[root@vm20 gittest]# ls -a
. .. .git

git相關概念

1.現有源文件:
[root@vm20 gittest]# cat a.txt
friday
monday

2.第一次修改:添加一行tuesday
[root@vm20 gittest]# cat a.txt
friday
monday
tuesday

3.執行add:
[root@vm20 gittest]# git add a.txt

4.第二次修改:添加一行wednesday
[root@vm20 gittest]# cat a.txt
friday
monday
tuesday
wednesday

5.不做add,直接提交:
[root@vm20 gittest]# git commit -m "看看第二次修改有沒有被commit"
[master 0e14810] 看看第二次修改有沒有被commit
1 file changed, 1 insertion(+)
[root@vm20 gittest]# git status
位於分支 master
尚未暫存以備提交的變更:
(使用 "git add <file>..." 更新要提交的內容)
(使用 "git checkout -- <file>..." 丟棄工作區的改動)
修改: a.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

注意:如果第二修改也被add了不會出現上面的提示

6.查看當前版本和a.txt文件內容的區別(有輸出內容,說明現在版本庫和文件a.txt內容有區別,也就是第二次修改並沒有被提交):
[root@vm20 gittest]# git diff HEAD -- a.txt
diff --git a/a.txt b/a.txt
index 1091166..adfd1e9 100644
--- a/a.txt
+++ b/a.txt
@@ -1,3 +1,4 @@
friday
monday
tuesday
+wednesday

7.再次add後,發現工作區乾淨了,而且當前版本庫HEAD和a.txt沒有任何區別了:
[root@vm20 gittest]# git add a.txt
[root@vm20 gittest]# git commit -m "再看第二次修改有沒有被commit"
[master fe18903] 再看第二次修改有沒有被commit
1 file changed, 1 insertion(+)

[root@vm20 gittest]# git status
# 位於分支 master
無文件要提交,乾淨的工作區

[root@vm20 gittest]# git diff HEAD -- a.txt
[root@vm20 gittest]# 

撤銷修改

撤銷修改
場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file。
場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,
就回到了場景1,第二步按場景1操作。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,使用版本回退,不過前提是沒有推送到遠程庫。(見下節)

場景1: 源文件添加了一行thursday,還沒有add到stage(前提:之前提交過此文件)

[root@vm20 gittest]# cat a.txt
wednesday
thursday

撤銷剛纔的修改:

[root@vm20 gittest]# git checkout -- a.txt
[root@vm20 gittest]# cat a.txt
wednesday

場景2:源文件添加了一行thursday,並且add到了stage(前提:之前提交過此文件)

[root@vm20 gittest]# cat a.txt
wednesday
thursday
[root@vm20 gittest]# git add a.txt
[root@vm20 gittest]# git status
位於分支 master
要提交的變更:
(使用 "git reset HEAD <file>..." 撤出暫存區)

修改:      a.txt

[root@vm20 gittest]# git reset HEAD a.txt
重置後撤出暫存區的變更:
M a.txt
[root@vm20 gittest]# cat a.txt
wednesday
thursday
[root@vm20 gittest]# git checkout -- a.txt
[root@vm20 gittest]# cat a.txt
wednesday

版本回退

場景3:已經提交到版本庫
查看現在的版本:

[root@ansible gittest]# git log
commit 898a61cb50da77daeda51453bef38c98fecd46a0
Author: wing <[email protected]>
Date: Sun Feb 25 18:04:27 2018 +0800
test1
commit d75411fb17e661cefc1900a09c8a784e8aa0d79a
Author: wing <[email protected]>
Date: Sun Feb 25 17:56:45 2018 +0800
test1

版本回退(切換):
在Git中,上一個版本就HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100

回到上一個版本:

[root@vm20 gittest]# git reset --hard HEAD^
HEAD 現在位於 83f6e8d Signed-off-by: [email protected] <tom>

回到指定的版本(根據版本號):

[root@vm20 gittest]#git reset --hard 6fe5b9a2

消失的ID號:
回到早期的版本後再查看git log會發現最近的版本消失,可以使用reflog查看消失的版本ID,用於回退到消失的版本
[root@vm20 gittest]# git reflog
32c31f5 HEAD@{0}: reset: moving to 32c31f54c1
6fe5b9a HEAD@{1}: reset: moving to 6fe5b9a2
928ab9e HEAD@{2}: reset: moving to HEAD^^
83f6e8d HEAD@{3}: reset: moving to HEAD^
6fe5b9a HEAD@{5}: commit: 這個能寫中文
83f6e8d HEAD@{6}: commit: Signed-off-by: [email protected] <tom>
32c31f5 HEAD@{7}: commit: add a line monday
928ab9e HEAD@{8}: commit (amend): this is a new file test
bee2ba0 HEAD@{9}: commit: this is a new file test
c8e6b87 HEAD@{10}: commit: 添了兩個
fbecfa3 HEAD@{11}: commit: add haha
7e99d94 HEAD@{12}: commit: 添加hello一行
addd750 HEAD@{13}: commit (initial): test

然後順便把工作區的文件更新了。所以你讓HEAD指向哪個版本號,你就把當前版本定位在哪。

刪除文件

刪除文件:
從工作區刪除a.txt,並且從版本庫一起刪除

[root@vm20 gittest]# rm -rf a.txt
[root@vm20 gittest]# git status
位於分支 master
尚未暫存以備提交的變更:
(使用 "git add/rm <file>..." 更新要提交的內容)
(使用 "git checkout -- <file>..." 丟棄工作區的改動)

刪除:      a.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

[root@vm20 gittest]# git rm a.txt
rm 'a.txt'

[root@vm20 gittest]# git commit -m "刪除文件a.txt"
[master 4bb90a4] 刪除文件a.txt
1 file changed, 4 deletions(-)
delete mode 100644 a.txt

[root@vm20 gittest]# git status
#位於分支 master
無文件要提交,乾淨的工作區

刪除了文件readme.txt之後又後悔了,恢復回來

[root@vm20 gittest]# ls
readme.txt
[root@vm20 gittest]# rm -rf readme.txt
[root@vm20 gittest]# git checkout -- readme.txt
[root@vm20 gittest]# ls
readme.txt

部署遠程倉庫

部署遠程倉庫
遠程倉庫實際上和本地倉庫沒啥不同,純粹爲了7x24小時開機並交換大家的修改。
GitHub就是一個免費託管開源代碼的遠程倉庫。但是對於某些視源代碼如生命的商業公司來說,既不想公開源代碼,又捨不得給GitHub交保護費,那就只能自己搭建一臺Git服務器作爲私有倉庫使用。

搭建Git服務器需要準備一臺運行Linux的機器
第一步,安裝git:

yum install git

第二步,創建一個git用戶,用來運行git服務:

adduser git
passwd git(設置密碼)

第三步,創建證書登錄: 在 客戶端做
收集所有需要登錄的用戶的公鑰,就是他們自己的id_rsa.pub文件,把所有公鑰導入到/home/git/.ssh/authorized_keys文件裏,一行一個。

ssh- keygen
開發者:做祕鑰對(私鑰) 傳公鑰給主庫上的賬戶 ssh-copy-id -i 用戶@id
主庫 :/home/git/.ssh/authorized_keys

第四步,初始化Git倉庫:
選定一個目錄作爲Git倉庫,假定是/srv/sample.git,在/srv目錄下輸入命令:

git init --bare sample.git
Git就會創建一個裸倉庫,裸倉庫沒有工作區,因爲服務器上的Git倉庫純粹是爲了共享,所以不讓用戶直接登錄到服務器上去改工作區,並且服務器上的Git倉庫通常都以.git結尾。然後,把owner改爲git:
chown -R git:git sample.git (設置該所屬組) (不能在ROOT下,不然克隆路徑不對,權限不夠)

第五步,禁用shell登錄:
出於安全考慮,第二步創建的git用戶不允許登錄shell,這可以通過編輯/etc/passwd文件完成。找到類似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改爲:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
這樣,git用戶可以正常通過ssh使用git,但無法登錄shell,因爲我們爲git用戶指定的git-shell每次一登錄就自動退出。

第六步,克隆遠程倉庫:
現在,可以通過git clone命令克隆遠程倉庫了,在各自的電腦上運行:

git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就簡單了。

在客戶端添加你的名字和Email地址

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

git config --global user.name "wing"

第七步 推送 推送之後才能在倉庫查看 (客戶端)

[root@tomcat gittest4]# git push -u origin master
[email protected]'s password:
Counting objects: 3, done.
Writing objects: 100% (3/3), 213 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:/gittest3/teslaProject.git

  • [new branch] master -> master
    分支 master 設置爲跟蹤來自 origin 的遠程分支 master。

第八步 在倉庫端 創建一個目錄克隆下來就可以查看了

#git clone [email protected](可以主機名):/srv/sample.git

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