前文
Git是什么?
Git是目前世界上最先進的分布式版本控制系統。
SVN與Git的最主要的區別?
SVN是集中式版本控制系統,版本庫是集中放在中央服務器的,而干活的時候,用的都是自己的電腦,所以首先要從中央服務器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服務器。集中式版本控制系統是必須聯網才能工作,如果在局域網還可以,帶寬夠大,速度夠快,如果在互聯網下,如果網速慢的話,就納悶了。
Git是分布式版本控制系統,那么它就沒有中央服務器的,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯網了,因為版本都是在自己的電腦上。既然每個人的電腦都有一個完整的版本庫,那多個人如何協作呢?比如說自己在電腦上改了文件A,其他人也在電腦上改了文件A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。
在linux上搭建git服務器
linux系統環境:
1、安裝Git
$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel $ yum install git
接下來我們 創建一個git用戶組和用戶,用來運行git服務:
$ groupadd git $ useradd git -g git
2、創建證書登錄
收集所有需要登錄的用戶的公鑰,公鑰位於id_rsa.pub文件中,把我們的公鑰導入到/home/git/.ssh/authorized_keys文件里(.ssh/authorized_keys系統默認隱藏不顯示),一行一個。如果沒有該文件創建它:
$ cd /home/git/ $ mkdir .ssh $ chmod 755 .ssh $ touch .ssh/authorized_keys $ chmod 644 .ssh/authorized_keys
之后的步驟請結合 步驟5放置客戶端公鑰
3、初始化Git倉庫
3.1、首先我們選定一個目錄作為Git倉庫,假定是在根目錄下的/repository/gitTest.git,在根目錄下/輸入命令:
$ mkdir repository $ chown git:git repository/ $ cd repository $ git init --bare gitTest.git Initialized empty Git repository in /repository/gitTest.git/
*注:如果初始化遠程倉庫的話,要使用這個命令:git init --bare gitTest.git
這樣初始化的倉庫並沒有.git目錄,只有.git目錄下的文件。
不使用--bare選項時,就會生成.git目錄以及其下的版本歷史記錄文件,這些版本歷史記錄文件就存放在.git目錄下;而使用--bare選項時,不再生成.git目錄,而是只生成.git目錄下面的版本歷史記錄文件,這些版本歷史記錄文件也不再存放在.git目錄下面,而是直接存放在版本庫的根目錄下面
用"git init"初始化的版本庫用戶也可以在該目錄下執行所有git方面的操作。但別的用戶在將更新push上來的時候容易出現沖突。
解決辦法就是使用”git init --bare”方法創建一個所謂的裸倉庫,之所以叫裸倉庫是因為這個倉庫只保存git歷史提交的版本信息,而不允許用戶在上面進行各種git操作,如果你硬要操作的話,只會得到下面的錯誤(”This operation must be run in a work tree”),這個就是最好把遠端倉庫初始化成bare倉庫的原因。
說白了,就是會創建一個裸倉庫,裸倉庫沒有工作區,服務器上的Git倉庫純粹是為了共享,所以不讓用戶直接登錄到服務器上去改工作區,並且服務器上的Git倉庫通常都以.git結尾
3.2、 然后,把倉庫所屬用戶改為git:
$ chown -R git:git gitTest.git
5、放置客戶端公鑰
通過步驟2,我們已經在服務點創建了證書登錄的目錄,如果客戶端要訪問服務端,需要提供公鑰到證書登錄的目錄中,公鑰位於id_rsa.pub文件中,把我們的公鑰導入到/home/git/.ssh/authorized_keys文件里,以下為客戶端操作
打開客戶端(“假設window系統”,前提是客戶端也安裝了git服務,鼠標右擊選擇“git bash”)隨機目錄下的git bash,輸入ssh-keygen -t rsa -C “郵箱”,生成ssh私鑰和公鑰
此時 C:\Users\用戶名.ssh 下會多出兩個文件 id_rsa 和 id_rsa.pub
id_rsa 是私鑰
id_rsa.pub 是公鑰
然后把id_rsa.pub文件放置在服務器/home/git/.ssh/authorized_keys文件中,由於.ssh/authorized_keys系統默認不顯示,請使用“mv”命令移動文件
6、在客戶端clone遠程倉庫
將服務器上的/opt/repository/gittest.git庫克隆到本地 git clone [URL]git是用戶名@服務器地址:倉庫路徑
git clone 用戶名@服務器IP:目標倉庫
7、客戶端提交到遠程倉庫
本地倉庫在Respository.git目錄下,先進入gitTest目錄中,commit提交到本地git,之后才提交到服務器遠程庫
$ cd gitTest $ git add * $ git commit -m '20190708_1156_git_testing' $ git push -u origin master
*注遠程庫的名字就是origin,這是Git默認的叫法,也可以改成別的。
把本地庫的內容推送到遠程,用git push命令,實際上是把當前分支master推送到遠程。
由於遠程庫是空的,我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以后的推送或者拉取時就可以簡化命令,git push origin master就行
要查看遠程庫的信息 使用 git remote
它會列出你指定的每一個遠程服務器的簡寫。 如果你已經克隆了自己的倉庫,那么至少應該能看到 origin - 這是 Git 給你克隆的倉庫服務器的默認名字
要查看遠程庫的詳細信息 使用 git remote –v
會顯示需要讀寫遠程倉庫使用的 Git 保存的簡寫與其對應的 URL,如果你的遠程倉庫不止一個,該命令會將它們全部列出
8、tortoiseGit的安裝使用
使用Git命令有時候確實不怎么方便,特別是每次都要輸入密碼,如果配置SSH的方式,又實在是很麻煩,
tortoiseGit就是一個客戶端圖形界面。
安裝
下載安裝包,選擇版本,地址:https://download.tortoisegit.org/tgit/
進入具體版本頁面后,根據Windows操作系統版本選擇相應的程序安裝包和中文語言包.
https://download.tortoisegit.org/tgit/2.5.0.0/ 這是2.5.0.0版本的,直接安裝即可
設置
在桌面右鍵選擇tortoiseGit,選擇設置,設置用戶名和郵箱,跟在git bash是一樣的,此時設置的是全局的
進到本地倉庫目錄中可以針對項目設置局部配置
克隆倉庫
ssh key的步驟前面已經說完了,然后就可以克隆倉庫進行使用了
選擇你想要克隆倉庫的文件夾,右鍵選擇Git克隆,等同於 git clone [url]
URL是你要克隆的服務器版本庫路徑,目錄是你要克隆到你本地的路徑
填寫服務器的url,確定,在克隆過程中會要求輸入git用戶的密碼,然后在本地生成了倉庫gittest,在gittest下面有.git目錄,就是本地的版本庫目錄了,如果上一步選擇了克隆成純版本庫,就不會有.git目錄了,在本地一般不這樣做
增加文件到暫存區
編輯一個文件保存,在空白處右鍵選擇TortoiseGit,選擇添加,加到暫存區,也就是git add,也可以在下一步里面直接提交
本地提交文件
右鍵選擇Git提交,填寫日志信息,不然不能提交然后點提交,這一步是將文件提交到你本地的倉庫,git中不能提交一個空文件夾,里面一定要有文件才行
第一行默認提交到master分支,也可以選擇新建分支,提交到新分支上
沒有添加的文件也可以直接提交到版本庫,也可以選擇不提交未添加的文件
推送到遠程倉庫
將文件推送到遠程倉庫,右鍵選擇tortoiseGit,選擇推送,將文件推送到服務器倉庫上
可以選擇推送哪個分支上的信息,也可以選擇推送到哪個遠程分支上
目標:選擇推送到哪個遠程端上,選擇管理,可以增加新的遠程端,也可以直接寫別的URL
確定推送
在服務器倉庫下執行git log可以看到你推送的文件,因為服務器上是裸倉庫,所以沒有工作目錄,看不到推送的文件
拉取文件和獲取文件
拉取和獲取的區別
拉取:git pull 在將遠程倉庫最新版本拉到本地的同時,將其合並到本地的當前 HEAD 中。
一般選擇非fast forward,會多生成一個commit 記錄,並強制保留分支的開發記錄,不會丟失分支信息,這對於以后代碼進行分析特別有用。
獲取:git fetch 將遠程倉庫最新版本拉到本地,不會自動合並 ,絕不會更改任何本地分支
實際使用中 使用git fetch 更安全 在merge之前可以看清楚 更新情況 再決定是否合並
創建分支,切換分支
右鍵TortoiseGit,選擇創建分支,填入分支名稱,選擇在哪個分支上新建分支,如果勾選切換新分支,分支創建后就直接在新分支上工作了,否則在TortoiseGit中選擇切換分支
在分支上修改后提交到分支
合並
切換回master分支,TortoiseGit選擇合並,選擇非快進式合並,合並后master分支上有了其他分支上提交的信息
解決沖突
當主干與分支修改了同一個文件,合並時會產生沖突
打開文件與在命令行中一樣,用<<<<<<<,=======,>>>>>>>標記出不同分支的內容
右鍵TortoiseGit中選擇解決沖突
雙擊該文件進行修改,左邊窗口是分支上的內容,右邊窗口是master上的內容,你要在下面的窗口上解決沖突,修改正確的文件內容,然后保存,然后將解決后的文件進行提交
顯示日志
紅色代表當前分支,綠色代表本地分支,淺×××代表遠端分支,×××代表標簽
可以看到各版本提交的信息,及分支合並的信息,還有文件的操作狀態
顏色可以在設置中更改
可以在每一條信息上右鍵選擇與上一版本比較差異
以上就是TortoiseGit的基本操作了
下面是一些命令行操作
svn遷移到git服務器
根據需要,后期將會將svn上的數據遷移到git上
將svn庫克隆到本地
使用TortoiseGit克隆svn庫
URL是svn的地址,是你要克隆的文件夾
因為我的svn庫不是標准的trunk、branch、tags結構,所以下面的不勾選,如果是標准的svn結構,請勾選
克隆需要一段時間,根據svn庫的大小而定
在git服務器上創建新的裸倉庫
使用git init --bare svnrepo.git命令
將本地倉庫推送到git服務器
先建立遠端倉庫,在本地倉庫內右鍵選擇TortoiseGit,設置,然后選擇遠端,在右側URL中填寫git服務器倉庫地址,就是剛剛在git服務器上新建的裸倉庫,origin是默認的遠端名字,然后點擊確定
遠端建立好后,就可以將本地克隆到的倉庫推送到服務器上了
在本地倉庫做一些修改,記住要先在本地進行提交,然后再推送到服務器上
TortoiseGit—>推送 就可以了,由於服務器上是裸倉庫,所以沒有工作區,看不到文件,git log一下就可以看到你剛才修改文件的提交記錄了
基礎命令
我是在linux上操作的,算是本地倉庫吧,不涉及遠程庫;在linux上操作與在windows上相同
把文件添加到版本庫中
編輯一個readme.txt文件,將文件加入版本庫中[root@localhost repository]# git add readme.txt #將工作區中的文件添加到暫存區了
將文件提交到版本庫
[root@localhost repository]# git commit -m “提交readme”
-m 是提交信息,便於查看提交了什么東西,這一步是將暫存區中的文件提交到倉庫了
查看是否還有文件未提交
-
[root@localhost repository]
-
-
nothing to commit (working directory clean)
這樣說明沒有任何文件未提交,工作區是干凈的
修改readme文件后保存,不進行任何操作,再查看狀態
-
[root@localhost repository] # git status
-
#On branch master
-
#Changed but not updated:
-
#(use "git add <file>..." to update what will be committed)
-
# (use "git checkout -- <file>..." to discard changes in working directory)
-
#
-
# modified: readme.txt
-
#
-
no changes added to commit (use "git add" and/or "git commit -a")
上面的命令告訴我們 readme.txt文件已被修改,但是並沒有提交
查看readme.txt文件修改了什么內容
-
[root@localhost repository]# git diff
-
diff --git a/readme.txt b/readme.txt
-
index 92e045e..d94ee74 100644
-
--- a/readme.txt
-
+++ b/readme.txt
-
-
666666
-
777777
-
999999
-
-000
可以看到,少了一行000
知道了對readme.txt文件做了什么修改后,我們可以放心的提交到倉庫了,提交修改和提交文件是一樣的2步(第一步是git add 第二步是:git commit)。
-
[root@localhost repository] # git add readme.txt
-
[root@localhost repository] # git commit -m "readme刪除000"
查看歷史記錄
-
[root@localhost repository] # git log
-
commit ffc46d25feacd0ae1926ace37efecd116402503e #版本號
-
Author: bai <xxx@qq.com>
-
Date: Tue Jan 9 16:49:18 2018 +0800
-
-
readme刪除 000 #最近一次提交內容,也就是commit -m 寫的內容
-
-
commit 1fac1a93037444bfbd59e51b57c511aaa0a9578f
-
Author: bai <xxx@qq.com>
-
Date: Mon Jan 8 11:26:26 2018 +0800
-
-
readme增加 222222
-
-
commit 876477f1b209ba61de4248ff26c2c1a098520295
-
Author: bai <xxx@qq.com>
-
Date: Mon Jan 8 11:20:45 2018 +0800
-
-
提交readme.txt
如果嫌上面顯示的信息太多的話,我們可以使用命令 git log –pretty=oneline
-
[root@localhost repository] # git log --pretty=oneline
-
ffc46d25feacd0ae1926ace37efecd116402503e readme刪除 000
-
1fac1a93037444bfbd59e51b57c511aaa0a9578f readme增加222222
-
876477f1b209ba61de4248ff26c2c1a098520295 提交readme.txt
版本回退
[root@localhost repository]# git reset --hard HEAD^ #回退到上一版本
-
[root@localhost repository] # git log
-
commit 1fac1a93037444bfbd59e51b57c511aaa0a9578f
-
Author: bai <xxx@qq.com>
-
Date: Mon Jan 8 11:26:26 2018 +0800
-
-
readme增加 222222
-
-
commit 876477f1b209ba61de4248ff26c2c1a098520295
-
Author: bai <xxx@qq.com>
-
Date: Mon Jan 8 11:20:45 2018 +0800
-
-
提交readme.txt
可以看到刪除000的操作沒有了
如果想要回退到上上個版本就把HEAD^ 改成 HEAD^^,以此類推
如果想回到100個版本之前的話,就git reset --hard HEAD~100
回退到指定版本
[root@localhost repository]# git reset HEAD 版本號
獲得版本號
-
[root@localhost repository] # git reflog
-
19ecf86 HEAD@{0}: HEAD^: updating HEAD
-
ffc46d2 HEAD@{1}: commit: readme刪除 000
ffc46d2就是版本號
撤銷修改
1.如果已經提交了的話,就直接回退到上一版本
2.如果沒有添加到暫存區的話,使用git checkout -- 文件名 撤銷工作區的所有修改[root@localhost repository]# git checkout -- readme.txt
3.如果已經添加到暫存區的話,想丟棄修改[root@localhost repository]# git reset HEAD readme.txt
然后再重復第二步
刪除文件
-
[root@localhost repository] # git rm readme.txt
-
[root@localhost repository] # git commit -m “刪除readme”
創建分支
-
[root@localhost repository] # git checkout –b fenzhi
-
這個命令相當於兩條命令
-
git branch fenzhi 創建分支
-
git checkout fenzhi 切換到該分支
我們在分支上修改了文件內容提交后,在主分支上是看不到剛才修改的內容的
查看當前分支
-
[root@localhost repository] # git branch
-
* fenzhi
-
master
帶星號的則代表當前在該分支上
合並分支
-
[root@localhost repository] # git checkout master #在master分支上進行合並
-
[root@localhost repository] # git merge --no-ff fenzhi
在分支上修改內容后,與主分支合並,合並后就統一了文件內容
刪除分支
[root@localhost repository]# git branch -d fenzhi
解決沖突
當你在主分支上和其他分支上修改了同一個文件並且都提交了,當在主分支上合並的時候就會產生沖突
查看文件內容是這樣的
Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容,其中<<< HEAD是指主分支修改的內容,>>>>fenzhi 是指fenzhi上修改的內容
我們可以手動修改文件,解決沖突,然后在提交到版本庫
用git log查看分支歷史
git log --graph --pretty=oneline --abbrev-commit
隱藏工作區
在開發中,會經常碰到bug問題,那么有了bug就需要修復,每個bug都可以通過一個臨時分支來修復,修復完成后,合並分支,然后將臨時的分支刪除掉。比如我在開發中接到一個404 bug時候,我們可以創建一個404分支來修復它,但是,當前的dev分支上的工作還沒有提交。
工作進行到一半時候,我們還無法提交,比如我這個分支bug要2天完成,但是404 bug需要5個小時內完成。怎么辦呢?還好,Git還提供了一個stash功能,可以把當前工作現場 ”隱藏起來”,等以后恢復現場后繼續工作。
在你需要隱藏的dev分支下執行git stash,這時候雖然dev分支上的內容還沒有提交,但是git status看一下工作區是干凈的,也就是dev的工作現場被隱藏了
現在創建404分支來修復bug了。首先我們要確定在哪個分支上修復bug,比如我現在是在主分支master上來修復的,現在我要在master分支上創建一個臨時分支修復完成后,切換到master分支上,並完成合並,最后刪除404分支。
然后我們回到dev分支上干活,工作區是干凈的,那么我們工作現場去哪里呢?我們可以使用命令 git stash list來查看下
工作區是干凈的,那么我們工作現場去哪里呢?我們可以使用命令 git stash list來查看下。Git把stash內容存在某個地方了,但是需要恢復一下,可以使用如下2個方法:
git stash apply恢復,恢復后,stash內容並不刪除,你需要使用命令git stash drop來刪除。
另一種方式是使用git stash pop,恢復的同時把stash內容也刪除了。
總結
1、如果在服務器搭建Git遠程庫
2、本地如果訪問和提交文件到Git遠程庫
3、TortoiseGit使用於操作
本文借鑒於:https://blog.csdn.net/u010597189/article/details/81284642,在此感謝原作者的分享