天天看點

Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結

摘要

Git 是一個開源的分布式版本控制系統,用于靈活高效地處理任何或小或大的項目。Git 是 Linux 核心開發而開發的一個開放源碼的版本控制軟體。Git 與常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本庫的方式,不必伺服器端軟體支援。但是對于的很多應屆畢業生學生沒有還是沒有接觸過git等相關工具,特别是對于的跨專業的同學嗎,沒有做好自己代碼的管理的習慣,或者是其他的情況。本章我将詳細的講述git的原理核使用,友善大家使用。

Git 安裝配置

Linux 平台上安裝

Git 的工作需要調用 curl,zlib,openssl,expat,libiconv 等庫的代碼,是以需要先安裝這些依賴工具。在有 yum 的系統上(比如 Fedora)或者有 apt-get 的系統上(比如 Debian 體系),可以用下面的指令安裝:各 Linux 系統可以使用其安裝包管理工具(apt-get、yum 等)進行安裝:

Debian/Ubuntu Git 安裝指令為:
$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
  libz-dev libssl-dev

$ apt-get install git

$ git --version
git version 1.8.1.2

Centos/RedHat
如果你使用的系統是 Centos/RedHat 安裝指令為:

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

$ yum -y install git-core

$ git --version
git version 1.7.1

源碼安裝

我們也可以在官網下載下傳源碼包來安裝,最新源碼包下載下傳位址:https://git-scm.com/download

安裝指定系統的依賴包:

########## Centos/RedHat ##########
$ yum install curl-devel expat-devel gettext-devel \
  openssl-devel zlib-devel

########## Debian/Ubuntu ##########
$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
  libz-dev libssl-dev

解壓安裝下載下傳的源碼包:

$ tar -zxf git-1.7.2.2.tar.gz
$ cd git-1.7.2.2
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install

           

Git 配置

Git 提供了一個叫做 git config 的工具,專門用來配置或讀取相應的工作環境變量。這些環境變量,決定了 Git 在各個環節的具體工作方式和行為。這些變量可以存放在以下三個不同的地方:

  • /etc/gitconfig

    檔案:系統中對所有使用者都普遍适用的配置。若使用

    git config

    時用

    --system

    選項,讀寫的就是這個檔案。
  • ~/.gitconfig

    檔案:使用者目錄下的配置檔案隻适用于該使用者。若使用

    git config

    時用

    --global

    選項,讀寫的就是這個檔案。
  • 目前項目的 Git 目錄中的配置檔案(也就是工作目錄中的

    .git/config

    檔案):這裡的配置僅僅針對目前項目有效。每一個級别的配置都會覆寫上層的相同配置,是以

    .git/config

    裡的配置會覆寫

    /etc/gitconfig

    中的同名變量。

在 Windows 系統上,Git 會找尋使用者主目錄下的 .gitconfig 檔案。主目錄即 $HOME 變量指定的目錄,一般都是 C:\Documents and Settings\$USER。此外,Git 還會嘗試找尋 /etc/gitconfig 檔案,隻不過看當初 Git 裝在什麼目錄,就以此作為根目錄來定位。

使用者資訊

配置個人的使用者名稱和電子郵件位址:

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

差異分析工具

還有一個比較常用的是,在解決合并沖突時使用哪種差異分析工具。比如要改用 vimdiff 的話:

$ git config --global merge.tool vimdiff
           

檢視配置資訊

要檢查已有的配置資訊,可以使用 git config --list 指令:

$ git config --list
http.postbuffer=2M
user.name=runoob
[email protected]
           

Git 工作流程

一般工作流程如下:

  • 克隆 Git 資源作為工作目錄。
  • 在克隆的資源上添加或修改檔案。
  • 如果其他人修改了,你可以更新資源。
  • 在送出前檢視修改。
  • 送出修改。
  • 在修改完成後,如果發現錯誤,可以撤回送出并再次修改并送出。
Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結

Git 工作區、暫存區和版本庫

我們先來了解下 Git 工作區、暫存區和版本庫概念:

  • 工作區:就是你在電腦裡能看到的目錄。
  • 暫存區:英文叫 stage 或 index。一般存放在 .git 目錄下的 index 檔案(.git/index)中,是以我們把暫存區有時也叫作索引(index)。
  • 版本庫:工作區有一個隐藏目錄 .git,這個不算工作區,而是 Git 的版本庫。
Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結

Git 建立倉庫

Git 建立倉庫:

git init

克隆倉庫的指令格式為:

git clone <repo> <directory>

git 的設定使用 git config 指令

$ git config --list
credential.helper=osxkeychain
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true


設定送出代碼時的使用者資訊:

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

Git 基本操作

Git 常用的是以下 6 個指令:git clone、git push、git add 、git commit、git checkout、git pull,後面我們會詳細介紹。

Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結

說明:

  • workspace:工作區
  • staging area:暫存區/緩存區
  • local repository:版本庫或本地倉庫
  • remote repository:遠端倉庫

建立倉庫指令

git init

初始化倉庫

git clone

拷貝一份遠端倉庫,也就是下載下傳一個項目。

送出與修改

git add

添加檔案到倉庫

git status

檢視倉庫目前的狀态,顯示有變更的檔案。

git diff

比較檔案的不同,即暫存區和工作區的差異。

git commit

送出暫存區到本地倉庫。

git reset

回退版本。

git rm

删除工作區檔案。

git mv

移動或重命名工作區檔案。

送出日志

git log

檢視曆史送出記錄

git blame

以清單形式檢視指定檔案的曆史修改記錄

遠端操作

git remote

遠端倉庫操作

git fetch

從遠端擷取代碼庫

git pull

下載下傳遠端代碼并合并

git push

上傳遠端代碼并合并

Git 分支管理

幾乎每一種版本控制系統都以某種形式支援分支。使用分支意味着你可以從開發主線上分離開來,然後在不影響主線的同時繼續工作。有人把 Git 的分支模型稱為必殺技特性,而正是因為它,将 Git 從版本控制系統家族裡區分出來。

建立分支指令:

git branch (branchname)

切換分支指令:

git checkout (branchname)

當你切換分支的時候,Git 會用該分支的最後送出的快照替換你的工作目錄的内容, 是以多個分支不需要多個目錄。合并分支指令:

git merge (合并分支項目檔案)

列出分支基本指令:

git branch

沒有參數時,git branch 會列出你在本地的分支。

删除分支指令:

git branch -d (branchname)

合并沖突:合并并不僅僅是簡單的檔案添加、移除的操作,Git 也會合并修改。

顯示沖突的解決:git diff
           

Git 檢視送出曆史

在使用 Git 送出了若幹更新之後,又或者克隆了某個項目,想回顧下送出曆史,我們可以使用 git log 指令檢視。

Git 送出曆史一般常用兩個指令:

  • git log - 檢視曆史送出記錄。
  • git blame - 以清單形式檢視指定檔案的曆史修改記錄。

Git 标簽

如果你達到一個重要的階段,并希望永遠記住那個特别的送出快照,你可以使用 git tag 給它打上标簽。

指定标簽資訊指令:

git tag -a <tagname> -m "runoob.com标簽"

PGP簽名标簽指令:

git tag -s <tagname> -m "runoob.com标簽"
           

Git Github

添加遠端庫

要添加一個新的遠端倉庫,可以指定一個簡單的名字,以便将來引用,指令格式如下:

git remote add [shortname] [url]
           

本例以 Github 為例作為遠端倉庫,如果你沒有 Github 可以在官網 https://github.com/注冊。由于你的本地 Git 倉庫和 GitHub 倉庫之間的傳輸是通過SSH加密的,是以我們需要配置驗證資訊:

使用以下指令生成 SSH Key:

$ ssh-keygen -t rsa -C "[email protected]"

後面的 [email protected] 改為你在 Github 上注冊的郵箱,之後會要求确認路徑和輸入密碼,我們這使用預設的一路回車就行。

成功的話會在 ~/ 下生成 .ssh 檔案夾,進去,打開 id_rsa.pub,複制裡面的 key。
           
$ ssh-keygen -t rsa -C "********@163.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/tianqixin/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase):    # 直接回車
Enter same passphrase again:                   # 直接回車
Your identification has been saved in /Users/tianqixin/.ssh/id_rsa.
Your public key has been saved in /Users/tianqixin/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:MDKVidPTDXIQoJwoqUmI4LBAsg5XByBlrOEzkxrwARI [email protected]
The key's randomart image is:
+---[RSA 3072]----+
|E*+.+=**oo       |
|%Oo+oo=o. .      |
|%**.o.o.         |
|OO.  o o         |
|+o+     S        |
|.                |
|                 |
|                 |
|                 |
+----[SHA256]-----+
           

回到 github 上,進入 Account => Settings(賬戶配置)。

Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結
Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結
Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結

Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結

為了驗證是否成功,輸入以下指令:

$ ssh -T [email protected]
The authenticity of host 'github.com (52.74.223.119)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes                   # 輸入 yes
Warning: Permanently added 'github.com,52.74.223.119' (RSA) to the list of known hosts.
Hi tianqixin! You've successfully authenticated, but GitHub does not provide shell access. # 成功資訊
           

以下指令說明我們已成功連上 Github。

之後登入後點選" New repository " 如下圖所示:

Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結

Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結

建立成功後,顯示如下資訊:

Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結

以上資訊告訴我們可以從這個倉庫克隆出新的倉庫,也可以把本地倉庫的内容推送到GitHub倉庫。

現在,我們根據 GitHub 的提示,在本地的倉庫下運作指令:

$ mkdir runoob-git-test                     # 建立測試目錄
$ cd runoob-git-test/                       # 進入測試目錄
$ echo "# 菜鳥教程 Git 測試" >> README.md     # 建立 README.md 檔案并寫入内容
$ ls                                        # 檢視目錄下的檔案
README
$ git init                                  # 初始化
$ git add README.md                         # 添加檔案
$ git commit -m "添加 README.md 檔案"        # 送出并備注資訊
[master (root-commit) 0205aab] 添加 README.md 檔案
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

# 送出到 Github
$ git remote add origin [email protected]:tianqixin/runoob-git-test.git
$ git push -u origin master
           

以下指令請根據你在Github成功建立新倉庫的地方複制,而不是根據我提供的指令,因為我們的Github使用者名不一樣,倉庫名也不一樣。接下來我們傳回 Github 建立的倉庫,就可以看到檔案已上傳到 Github上:

Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結
$ git remote
origin
$ git remote -v
origin    [email protected]:tianqixin/runoob-git-test.git (fetch)
origin    [email protected]:tianqixin/runoob-git-test.git (push)
           

提取遠端倉庫

Git 有兩個指令用來提取遠端倉庫的更新。

1、從遠端倉庫下載下傳新分支與資料:

git fetch

該指令執行完後需要執行 git merge 遠端分支到你所在的分支。

2、從遠端倉庫提取資料并嘗試合并到目前分支:

git merge

該指令就是在執行 git fetch 之後緊接着執行 git merge 遠端分支到你所在的任意分支。

推送你的新分支與資料到某個遠端倉庫指令:

git push [alias] [branch]

删除遠端倉庫你可以使用指令:

git remote rm [别名]
           

Git Gitee

大家都知道國内通路 Github 速度比較慢,很影響我們的使用。如果你希望體驗到 Git 飛一般的速度,可以使用國内的 Git 托管服務——Gitee(gitee.com)。Gitee 提供免費的 Git 倉庫,還內建了代碼品質檢測、項目示範等功能。對于團隊協作開發,Gitee 還提供了項目管理、代碼托管、文檔管理的服務,5 人以下小團隊免費。

說明一句就是:這個中國版本的github。

Git 伺服器搭建

上一章節中我們遠端倉庫使用了 Github,Github 公開的項目是免費的,2019 年開始 Github 私有存儲庫也可以無限制使用。這當然我們也可以自己搭建一台 Git 伺服器作為私有倉庫使用。接下來我們将以 Centos 為例搭建 Git 伺服器。

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檔案裡,一行一個。

如果沒有該檔案建立它:
$ cd /home/git/
$ mkdir .ssh
$ chmod 755 .ssh
$ touch .ssh/authorized_keys
$ chmod 644 .ssh/authorized_keys

3、初始化Git倉庫

首先我們標明一個目錄作為Git倉庫,假定是/home/gitrepo/runoob.git,在/home/gitrepo目錄下輸入指令:
$ cd /home
$ mkdir gitrepo
$ chown git:git gitrepo/
$ cd gitrepo

$ git init --bare runoob.git
Initialized empty Git repository in /home/gitrepo/runoob.git/

以上指令Git建立一個空倉庫,伺服器上的Git倉庫通常都以.git結尾。然後,把倉庫所屬使用者改為git:

$ chown -R git:git runoob.git

4、克隆倉庫

$ git clone [email protected]:/home/gitrepo/runoob.git
Cloning into 'runoob'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

192.168.45.4 為 Git 所在伺服器 ip ,你需要将其修改為你自己的 Git 服務 ip。

這樣我們的 Git 伺服器安裝就完成。

           

GitLab的建構工作

更加詳細的操作流程如下所示:https://www.cnblogs.com/hgzero/p/14088215.html#2.1%20%E6%96%B9%E5%BC%8F%E4%B8%80:%E4%B8%8B%E8%BD%BDgitlab-ce%E7%9A%84rpm%E5%8C%85

git-lab的官方下載下傳位址:https://packages.gitlab.com/gitlab/gitlab-ce

稍具規模一點的公司都會搭建屬于自己的git,svn,而内部git用的最多的則是gitlab,雖然官網已經提供了非常多的功能,但内網搭建更能保證項目的私有性,隻有公司内部員工才可以通路,更加安全。這裡示範gitlab的搭建與簡單配置

Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結

gitlab詳細操作

1、安裝一些依賴軟體包,SSH一般系統是預設安裝好的,不過也不排除一些最小安裝的系統沒有sshd服務。

sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd


2、關閉防火牆,或者開放HTTP的端口

//重新整理防火牆的規則
iptables -F


3、安裝郵件服務,當gitlab想要通過郵件通知,也可以另外配置其它的郵件伺服器

sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix

4、從官網擷取一件安裝腳本,當然自己手動安裝也是可以的gitlab下載下傳位址,使用官網腳本會簡單一些。執行這一步會如果使用CentOS系統,會添加gitlab的yum源

//輸出到檔案裡是為了看下下載下傳的腳本内容
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh > rpm.sh
chmod +x rpm.sh
./rpm.sh

5、安裝gitlab

//使用yum安裝gitlab
yum install -y gitlab-ee
//可以看下gitlab-ee包的内容,看到gitlab安裝在/opt/gitlab目錄下
rpm -ql gitlab-ee | less

6、上面已經安裝好了gitlab,不過可以稍作一些配置,配置gitlab監聽的位址與端口,gitlab的配置檔案在/etc/gitlab/目錄下,主要配置檔案為gitlab.rb

我修改了下gitlab.rb檔案中的nginx監聽位址,
external_url 'http://gitlab.ai-he.me'
nginx['listen_addresses'] = ['0.0.0.0', '[::]']
# 系統端口沖突,我把端口改為了82
nginx['listen_port'] = 82
裡面的配置項非常的多,可以對照官網文檔根據需要修改。gitlab配置選項


7、運作gitlab命名,并重新開機

//重新配置gitlab
sudo gitlab-ctl reconfigure
//重新開機gitlab
gitlab-ctl restart 
// 檢視gitlab-ctl指令的幫助資訊
gitlab-ctl --help

8、打開浏覽器檢視效果,第一次打開頁面會讓我們設定root使用者的密碼。記住自己設定的密碼,再次重新整理進入登入頁面
           
Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結

9、以管理者身份登入,預設的使用者是root,密碼是剛才設定的。

Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結
Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結

搭建好環境之後,下面的則根據官方文檔解釋,自己摸索做一些根據自己需要的修改,二次開發也可以。

git問題總結

git rebase 和 git merge 一樣都是用于從一個分支擷取并且合并到目前分支,但是他們采取不同的工作方式,以下面的一個工作場景說明其差別

那麼此時在feature上git 自動會産生一個新的commit(merge commit)

Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結

marge 特點:自動建立一個新的commit

如果合并的時候遇到沖突,僅需要修改後重新commit

優點:記錄了真實的commit情況,包括每個分支的詳情

缺點:因為每次merge會自動産生一個merge commit,是以在使用一些git 的GUI tools,特别是commit比較頻繁時,看到分支很雜亂。

rebase 本質是變基

Git——代碼管理工具摘要Git 安裝配置 Git 工作流程 Git 工作區、暫存區和版本庫Git 建立倉庫Git 基本操作 Git 分支管理Git 檢視送出曆史Git 标簽 Git Github Git GiteeGit 伺服器搭建 GitLab的建構工作git問題總結

 rebase 特點:會合并之前的commit曆史

優點:得到更簡潔的項目曆史,去掉了merge commit

缺點:如果合并出現代碼問題不容易定位,因為re-write了history

如果你rebase master 到你的feature分支:

rebase 将所有master的commit移動到你的feature 的頂端。問題是:其他人還在original master上開發,由于你使用了rebase移動了master,git 會認為你的主分支的曆史與其他人的有分歧,會産生沖突。

如果你想要一個幹淨的,沒有merge commit的線性曆史樹,那麼你應該選擇git rebase。如果你想保留完整的曆史記錄,并且想要避免重寫commit history的風險,你應該選擇使用git merge

git