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

終於搞定,mac本身做爲git服務器,mac也是客戶端,如何免登

從另一個linux服務器的上傳公鑰獲得提示css

ssh-copy-id -i ~/.ssh/id_rsa.pub git@192.168.1.111html

公鑰是傳到了mac的linux

/Users/git/.ssh/authorized_keysnginx

因此其餘的各個客戶端的包括(mac本身)的pub公鑰,都要複製到這個文件裏,就能夠免密碼登錄了git

 

注意mac裏的sourcetree是用的非root帳號,因此得在 非root帳號下生成一個公鑰,而後黏貼到服務器的authorized_keys文件裏,這樣sourcetree才能免密登錄github

==========================================shell

 

 

 

(原文)http://blog.51cto.com/xinsir/2060332
初識Git

Git是什麼?

  Git是目前世界上最早進的分佈式版本控制系統。windows

SVN與Git的最主要的區別?

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

基本概念

工做區:就是你在電腦裏能看到的目錄。
暫存區:英文叫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
也可使用源碼安裝,須要安裝不少依賴包

yum install curl-devel expat-devel gettext-devel \ openssl-devel zlib-devel

下載地址 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

禁止 git 用戶 ssh 登陸服務器,修改/etc/passwd文件

好比原先是

git:x:1002:1002::/home/git:/usr/bin/git

須要改爲
git:x:1002:1002::/home/git:/usr/bin/git-shell

 

 

建立版本庫

在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服務器和客戶端

設置用戶名、郵箱

由於Git是分佈式版本控制系統,因此須要填寫用戶名和郵箱做爲一個標識。
每個 Git 的提交都會使用這些信息,而且它會寫入到你的每一次提交中,不可更改。若是使用了 --global 選項,那麼該命令只須要運行一次,由於以後不管你在該系統上作任何事情, Git 都會使用那些信息。 當你想針對特定項目使用不一樣的用戶名稱與郵件地址時,能夠在那個項目目錄下運行沒有 --global 選項的命令來配置。
打開git bash
初學Git及簡單搭建git服務器和客戶端
若是想要檢查你的配置,可使用 git config --list 命令來列出全部 Git 當時能找到的配置。

[root@localhost ~]# git config --list user.name=xxx user.email=xxx@qq.com 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私鑰和公鑰
初學Git及簡單搭建git服務器和客戶端
此時 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

centos7用systemctl restart sshd.service

 

 

將客戶端公鑰加到服務器

由 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及簡單搭建git服務器和客戶端
能夠看到本地上的服務器倉庫了
初學Git及簡單搭建git服務器和客戶端

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

你已經在本地建立了一個Git倉庫後,又想在服務器建立一個Git倉庫,而且讓這兩個倉庫進行遠程同步
先在linux本地init一個倉庫,在裏面隨意編輯一個文件,在本地提交,而後鏈接遠程倉庫,將文件push到服務器上,因爲遠程倉庫是沒有工做目錄的,因此看不到你提交的文件,可是在服務器上git log一下,能夠看到你提交的歷史記錄
初學Git及簡單搭建git服務器和客戶端
遠程庫的名字就是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是同樣的,此時設置的是全局的
初學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 是提交信息,便於查看提交了什麼東西,這一步是將暫存區中的文件提交到倉庫了

查看是否還有文件未提交

[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 <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及簡單搭建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內容也刪除了。

相關文章
相關標籤/搜索