搭建Git服務器及本機克隆提交


前文

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私鑰和公鑰


初學Git及簡單搭建git服務器和客戶端
此時 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是一樣的,此時設置的是全局的
初學Git及簡單搭建git服務器和客戶端
進到本地倉庫目錄中可以針對項目設置局部配置
初學Git及簡單搭建git服務器和客戶端

克隆倉庫

ssh key的步驟前面已經說完了,然后就可以克隆倉庫進行使用了
選擇你想要克隆倉庫的文件夾,右鍵選擇Git克隆,等同於 git clone [url]
URL是你要克隆的服務器版本庫路徑,目錄是你要克隆到你本地的路徑
初學Git及簡單搭建git服務器和客戶端
填寫服務器的url,確定,在克隆過程中會要求輸入git用戶的密碼,然后在本地生成了倉庫gittest,在gittest下面有.git目錄,就是本地的版本庫目錄了,如果上一步選擇了克隆成純版本庫,就不會有.git目錄了,在本地一般不這樣做
初學Git及簡單搭建git服務器和客戶端
初學Git及簡單搭建git服務器和客戶端

增加文件到暫存區

編輯一個文件保存,在空白處右鍵選擇TortoiseGit,選擇添加,加到暫存區,也就是git add,也可以在下一步里面直接提交
初學Git及簡單搭建git服務器和客戶端

本地提交文件

右鍵選擇Git提交,填寫日志信息,不然不能提交然后點提交,這一步是將文件提交到你本地的倉庫,git中不能提交一個空文件夾,里面一定要有文件才行
第一行默認提交到master分支,也可以選擇新建分支,提交到新分支上
初學Git及簡單搭建git服務器和客戶端
沒有添加的文件也可以直接提交到版本庫,也可以選擇不提交未添加的文件
初學Git及簡單搭建git服務器和客戶端

推送到遠程倉庫

將文件推送到遠程倉庫,右鍵選擇tortoiseGit,選擇推送,將文件推送到服務器倉庫上
可以選擇推送哪個分支上的信息,也可以選擇推送到哪個遠程分支上
目標:選擇推送到哪個遠程端上,選擇管理,可以增加新的遠程端,也可以直接寫別的URL
初學Git及簡單搭建git服務器和客戶端
確定推送
初學Git及簡單搭建git服務器和客戶端
在服務器倉庫下執行git log可以看到你推送的文件,因為服務器上是裸倉庫,所以沒有工作目錄,看不到推送的文件

拉取文件和獲取文件

拉取和獲取的區別
拉取:git pull 在將遠程倉庫最新版本拉到本地的同時,將其合並到本地的當前 HEAD 中。
一般選擇非fast forward,會多生成一個commit 記錄,並強制保留分支的開發記錄,不會丟失分支信息,這對於以后代碼進行分析特別有用。
初學Git及簡單搭建git服務器和客戶端
獲取:git fetch 將遠程倉庫最新版本拉到本地,不會自動合並 ,絕不會更改任何本地分支
實際使用中 使用git fetch 更安全 在merge之前可以看清楚 更新情況 再決定是否合並
初學Git及簡單搭建git服務器和客戶端

創建分支,切換分支

右鍵TortoiseGit,選擇創建分支,填入分支名稱,選擇在哪個分支上新建分支,如果勾選切換新分支,分支創建后就直接在新分支上工作了,否則在TortoiseGit中選擇切換分支
在分支上修改后提交到分支
初學Git及簡單搭建git服務器和客戶端
初學Git及簡單搭建git服務器和客戶端

合並

切換回master分支,TortoiseGit選擇合並,選擇非快進式合並,合並后master分支上有了其他分支上提交的信息
初學Git及簡單搭建git服務器和客戶端

解決沖突

當主干與分支修改了同一個文件,合並時會產生沖突
初學Git及簡單搭建git服務器和客戶端
打開文件與在命令行中一樣,用<<<<<<<,=======,>>>>>>>標記出不同分支的內容
初學Git及簡單搭建git服務器和客戶端
右鍵TortoiseGit中選擇解決沖突
初學Git及簡單搭建git服務器和客戶端
雙擊該文件進行修改,左邊窗口是分支上的內容,右邊窗口是master上的內容,你要在下面的窗口上解決沖突,修改正確的文件內容,然后保存,然后將解決后的文件進行提交
初學Git及簡單搭建git服務器和客戶端

顯示日志

紅色代表當前分支,綠色代表本地分支,淺×××代表遠端分支,×××代表標簽
可以看到各版本提交的信息,及分支合並的信息,還有文件的操作狀態
初學Git及簡單搭建git服務器和客戶端
顏色可以在設置中更改
初學Git及簡單搭建git服務器和客戶端
可以在每一條信息上右鍵選擇與上一版本比較差異

以上就是TortoiseGit的基本操作了
下面是一些命令行操作

svn遷移到git服務器

根據需要,后期將會將svn上的數據遷移到git上

將svn庫克隆到本地

使用TortoiseGit克隆svn庫
初學Git及簡單搭建git服務器和客戶端
URL是svn的地址,是你要克隆的文件夾
因為我的svn庫不是標准的trunk、branch、tags結構,所以下面的不勾選,如果是標准的svn結構,請勾選
克隆需要一段時間,根據svn庫的大小而定

在git服務器上創建新的裸倉庫

使用git init --bare svnrepo.git命令

將本地倉庫推送到git服務器

先建立遠端倉庫,在本地倉庫內右鍵選擇TortoiseGit,設置,然后選擇遠端,在右側URL中填寫git服務器倉庫地址,就是剛剛在git服務器上新建的裸倉庫,origin是默認的遠端名字,然后點擊確定
初學Git及簡單搭建git服務器和客戶端
遠端建立好后,就可以將本地克隆到的倉庫推送到服務器上了
在本地倉庫做一些修改,記住要先在本地進行提交,然后再推送到服務器上
TortoiseGit—>推送 就可以了,由於服務器上是裸倉庫,所以沒有工作區,看不到文件,git log一下就可以看到你剛才修改文件的提交記錄了

基礎命令

我是在linux上操作的,算是本地倉庫吧,不涉及遠程庫;在linux上操作與在windows上相同

把文件添加到版本庫中

編輯一個readme.txt文件,將文件加入版本庫中
[root@localhost repository]# git add readme.txt #將工作區中的文件添加到暫存區了

將文件提交到版本庫

[root@localhost repository]# git commit -m “提交readme”
-m 是提交信息,便於查看提交了什么東西,這一步是將暫存區中的文件提交到倉庫了

查看是否還有文件未提交

  1.  
    [root@localhost repository] # git status
  2.  
    #On branch master
  3.  
    nothing to commit (working directory clean)

這樣說明沒有任何文件未提交,工作區是干凈的

修改readme文件后保存,不進行任何操作,再查看狀態

  1.  
    [root@localhost repository] # git status
  2.  
    #On branch master
  3.  
    #Changed but not updated:
  4.  
    #(use "git add <file>..." to update what will be committed)
  5.  
    # (use "git checkout -- <file>..." to discard changes in working directory)
  6.  
    #
  7.  
    # modified: readme.txt
  8.  
    #
  9.  
    no changes added to commit (use "git add" and/or "git commit -a")

上面的命令告訴我們 readme.txt文件已被修改,但是並沒有提交

查看readme.txt文件修改了什么內容

  1.  
    [root@localhost repository]# git diff
  2.  
    diff --git a/readme.txt b/readme.txt
  3.  
    index 92e045e..d94ee74 100644
  4.  
    --- a/readme.txt
  5.  
    +++ b/readme.txt
  6.  
    @@ -5,4 +5,3 @@
  7.  
    666666
  8.  
    777777
  9.  
    999999
  10.  
    -000

可以看到,少了一行000
知道了對readme.txt文件做了什么修改后,我們可以放心的提交到倉庫了,提交修改和提交文件是一樣的2步(第一步是git add 第二步是:git commit)。

  1.  
    [root@localhost repository] # git add readme.txt
  2.  
    [root@localhost repository] # git commit -m "readme刪除000"

查看歷史記錄

  1.  
    [root@localhost repository] # git log
  2.  
    commit ffc46d25feacd0ae1926ace37efecd116402503e #版本號
  3.  
    Author: bai <xxx@qq.com>
  4.  
    Date: Tue Jan 9 16:49:18 2018 +0800
  5.  
     
  6.  
    readme刪除 000 #最近一次提交內容,也就是commit -m 寫的內容
  7.  
     
  8.  
    commit 1fac1a93037444bfbd59e51b57c511aaa0a9578f
  9.  
    Author: bai <xxx@qq.com>
  10.  
    Date: Mon Jan 8 11:26:26 2018 +0800
  11.  
     
  12.  
    readme增加 222222
  13.  
     
  14.  
    commit 876477f1b209ba61de4248ff26c2c1a098520295
  15.  
    Author: bai <xxx@qq.com>
  16.  
    Date: Mon Jan 8 11:20:45 2018 +0800
  17.  
     
  18.  
    提交readme.txt

如果嫌上面顯示的信息太多的話,我們可以使用命令 git log –pretty=oneline

  1.  
    [root@localhost repository] # git log --pretty=oneline
  2.  
    ffc46d25feacd0ae1926ace37efecd116402503e readme刪除 000
  3.  
    1fac1a93037444bfbd59e51b57c511aaa0a9578f readme增加222222
  4.  
    876477f1b209ba61de4248ff26c2c1a098520295 提交readme.txt

版本回退

[root@localhost repository]# git reset --hard HEAD^ #回退到上一版本

  1.  
    [root@localhost repository] # git log
  2.  
    commit 1fac1a93037444bfbd59e51b57c511aaa0a9578f
  3.  
    Author: bai <xxx@qq.com>
  4.  
    Date: Mon Jan 8 11:26:26 2018 +0800
  5.  
     
  6.  
    readme增加 222222
  7.  
     
  8.  
    commit 876477f1b209ba61de4248ff26c2c1a098520295
  9.  
    Author: bai <xxx@qq.com>
  10.  
    Date: Mon Jan 8 11:20:45 2018 +0800
  11.  
     
  12.  
    提交readme.txt

可以看到刪除000的操作沒有了
如果想要回退到上上個版本就把HEAD^ 改成 HEAD^^,以此類推
如果想回到100個版本之前的話,就git reset --hard HEAD~100

回退到指定版本

[root@localhost repository]# git reset HEAD 版本號

獲得版本號

  1.  
    [root@localhost repository] # git reflog
  2.  
    19ecf86 HEAD@{0}: HEAD^: updating HEAD
  3.  
    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
然后再重復第二步

刪除文件

  1.  
    [root@localhost repository] # git rm readme.txt
  2.  
    [root@localhost repository] # git commit -m “刪除readme”

創建分支

  1.  
    [root@localhost repository] # git checkout –b fenzhi
  2.  
    這個命令相當於兩條命令
  3.  
    git branch fenzhi 創建分支
  4.  
    git checkout fenzhi 切換到該分支

我們在分支上修改了文件內容提交后,在主分支上是看不到剛才修改的內容的

查看當前分支

  1.  
    [root@localhost repository] # git branch
  2.  
    * fenzhi
  3.  
    master

帶星號的則代表當前在該分支上

合並分支

  1.  
    [root@localhost repository] # git checkout master #在master分支上進行合並
  2.  
    [root@localhost repository] # git merge --no-ff fenzhi

在分支上修改內容后,與主分支合並,合並后就統一了文件內容

刪除分支

[root@localhost repository]# git branch -d fenzhi

解決沖突

當你在主分支上和其他分支上修改了同一個文件並且都提交了,當在主分支上合並的時候就會產生沖突
初學Git及簡單搭建git服務器和客戶端
查看文件內容是這樣的
初學Git及簡單搭建git服務器和客戶端
Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容,其中<<< HEAD是指主分支修改的內容,>>>>fenzhi 是指fenzhi上修改的內容
我們可以手動修改文件,解決沖突,然后在提交到版本庫

用git log查看分支歷史

git log --graph --pretty=oneline --abbrev-commit
初學Git及簡單搭建git服務器和客戶端

隱藏工作區

在開發中,會經常碰到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,在此感謝原作者的分享

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM