1. 程式人生 > >初學Git及簡單搭建git服務器和客戶端

初學Git及簡單搭建git服務器和客戶端

獲得 互聯網 local 沖突 user upd 分享 拉取 兩個文件

初識Git

Git是什麽?

  Git是目前世界上最先進的分布式版本控制系統。

SVN與Git的最主要的區別?

  SVN是集中式版本控制系統,版本庫是集中放在中央服務器的,而幹活的時候,用的都是自己的電腦,所以首先要從中央服務器哪裏得到最新的版本,然後幹活,幹完後,需要把自己做完的活推送到中央服務器。集中式版本控制系統是必須聯網才能工作,如果在局域網還可以,帶寬夠大,速度夠快,如果在互聯網下,如果網速慢的話,就納悶了。
  Git是分布式版本控制系統,那麽它就沒有中央服務器的,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯網了,因為版本都是在自己的電腦上。既然每個人的電腦都有一個完整的版本庫,那多個人如何協作呢?比如說自己在電腦上改了文件A,其他人也在電腦上改了文件A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。

基本概念

工作區:就是你在電腦裏能看到的目錄。
暫存區:英文叫stage, 或index。一般存放在 ".git目錄下" 下的index文件(.git/index)中,所以我們把暫存區有時也叫作索引(index)。
版本庫:工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。

在linux上安裝git作為服務器

linux系統環境:

[root@localhost ~]# cat /etc/issue
CentOS release 6.9 (Final)
Kernel \r on an \m

linux上作為我的git服務器

安裝git

我這裏使用的yum安裝
[root@localhost ~]# yum install git


也可以使用源碼安裝,需要安裝很多依賴包,下載地址 https://github.com/git/git/releases

    $ tar -zxf git-2.0.0.tar.gz
  $ cd git-2.0.0
  $ make configure
  $ ./configure --prefix=/usr
  $ make all doc info
  $ sudo make install install-doc install-html install-info

獲取git版本

[root@localhost ~]# git version  #git版本
git version 1.7.1

git安裝好後,創建 git 用戶,用來管理 Git 服務,並為 git 用戶設置密碼

[root@localhost ~]# useradd git
[root@localhost ~]# passwd git

創建版本庫

在Disk文件夾下新建了一個文件夾名為repository
[root@localhost Disk]# mkdir repository
將repository初始化為git倉庫
[root@localhost repository]# git init
該命令將創建一個名為 .git 的子目錄,是隱藏的,這個子目錄含有你初始化的 Git 倉庫中所有的必須文件,這些文件是 Git 倉庫的骨幹。

[root@localhost repository]# ll -a
drwxr-xr-x.  8 root root 4096 1月   8 17:35 .git

我從網上查到,如果初始化遠程倉庫的話,要使用這個命令:git init --bare repository.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結尾。
然後,把倉庫所屬用戶改為git:
[root@localhost Disk]# chown -R git:git repository.git

在windows上安裝git作為客戶端

安裝git

下載地址:http://gitforwindows.org/
直接安裝即可,安裝後在開始菜單裏會有git bash、git GUI和git CMD
技術分享圖片

設置用戶名、郵箱

因為Git是分布式版本控制系統,所以需要填寫用戶名和郵箱作為一個標識。
每一個 Git 的提交都會使用這些信息,並且它會寫入到你的每一次提交中,不可更改。如果使用了 --global 選項,那麽該命令只需要運行一次,因為之後無論你在該系統上做任何事情, Git 都會使用那些信息。 當你想針對特定項目使用不同的用戶名稱與郵件地址時,可以在那個項目目錄下運行沒有 --global 選項的命令來配置。
打開git bash
技術分享圖片
如果想要檢查你的配置,可以使用 git config --list 命令來列出所有 Git 當時能找到的配置。

[root@localhost ~]# git config --list
user.name=xxx
[email protected]
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
......

將linux服務端和windows客戶端關聯起來

客戶端生成ssh私鑰和公鑰

想要他們連接的話要創建證書登錄
收集所有需要登錄的用戶的公鑰,公鑰位於id_rsa.pub文件中,把我們的公鑰導入到/home/git/.ssh/authorized_keys文件裏,一行一個。
打開windows的git bash,輸入ssh-keygen -t rsa -C “郵箱”,生成ssh私鑰和公鑰
技術分享圖片
此時 C:\Users\用戶名.ssh 下會多出兩個文件 id_rsa 和 id_rsa.pub
id_rsa 是私鑰
id_rsa.pub 是公鑰

服務器端 Git 打開 RSA 認證

進入 /etc/ssh 目錄,編輯 sshd_config,打開以下三個配置的註釋:

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

保存並重啟 sshd 服務:
[root@localhost ssh]# /etc/rc.d/init.d/sshd restart

將客戶端公鑰加到服務器

由 AuthorizedKeysFile 得知公鑰的存放路徑是 .ssh/authorized_keys,實際上是 $Home/.ssh/authorized_keys,由於管理 Git 服務的用戶是 git,所以實際存放公鑰的路徑是 /home/git/.ssh/authorized_keys
在 /home/git/ 下創建目錄 .ssh

[root@localhost git]# pwd
/home/git
[root@localhost git]# mkdir .ssh
[root@localhost git]# ls -a 
. .. .bash_logout .bash_profile .bashrc .gnome2 .mozilla .ssh

然後把 .ssh 文件夾的 owner 修改為 git,為.ssh和authorized_keys修改權限

[root@localhost git]# chown -R git:git .ssh
[root@localhost git]# chmod 700 .ssh
[root@localhost git]# touch .ssh/authorized_keys
[root@localhost git]#chmod 600 .ssh/authorized_keys

將客戶端公鑰id_rsa.pub文件的內容寫到服務器端 /home/git/.ssh/authorized_keys 文件裏

在客戶端clone遠程倉庫

將服務器上的/opt/repository/gittest.git庫克隆到本地 git clone [url]
技術分享圖片
可以看到本地上的服務器倉庫了
技術分享圖片

在客戶端遠程倉庫並提交代碼

你已經在本地創建了一個Git倉庫後,又想在服務器創建一個Git倉庫,並且讓這兩個倉庫進行遠程同步
先在linux本地init一個倉庫,在裏面隨意編輯一個文件,在本地提交,然後連接遠程倉庫,將文件push到服務器上,由於遠程倉庫是沒有工作目錄的,所以看不到你提交的文件,但是在服務器上git log一下,可以看到你提交的歷史記錄
技術分享圖片
遠程庫的名字就是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,如果你的遠程倉庫不止一個,該命令會將它們全部列出

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,確定,在克隆過程中會要求輸入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 是提交信息,便於查看提交了什麽東西,這一步是將暫存區中的文件提交到倉庫了

查看是否還有文件未提交

[root@localhost repository]# git status
#On branch master
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
@@ -5,4 +5,3 @@
 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 <[email protected]>
Date:   Tue Jan 9 16:49:18 2018 +0800

    readme刪除000       #最近一次提交內容,也就是commit -m 寫的內容

commit 1fac1a93037444bfbd59e51b57c511aaa0a9578f
Author: bai <[email protected]>
Date:   Mon Jan 8 11:26:26 2018 +0800

    readme增加222222

commit 876477f1b209ba61de4248ff26c2c1a098520295
Author: bai <[email protected]>
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 <[email protected]>
Date:   Mon Jan 8 11:26:26 2018 +0800

    readme增加222222

commit 876477f1b209ba61de4248ff26c2c1a098520295
Author: bai <[email protected]>
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內容也刪除了。

初學Git及簡單搭建git服務器和客戶端