摘要
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 工作區、暫存區和版本庫概念:
- 工作區:就是你在電腦裡能看到的目錄。
- 暫存區:英文叫 stage 或 index。一般存放在 .git 目錄下的 index 檔案(.git/index)中,是以我們把暫存區有時也叫作索引(index)。
- 版本庫:工作區有一個隐藏目錄 .git,這個不算工作區,而是 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,後面我們會詳細介紹。
說明:
- workspace:工作區
- staging area:暫存區/緩存區
- local repository:版本庫或本地倉庫
- remote repository:遠端倉庫
建立倉庫指令
| 初始化倉庫 |
| 拷貝一份遠端倉庫,也就是下載下傳一個項目。 |
送出與修改
| 添加檔案到倉庫 |
| 檢視倉庫目前的狀态,顯示有變更的檔案。 |
| 比較檔案的不同,即暫存區和工作區的差異。 |
| 送出暫存區到本地倉庫。 |
| 回退版本。 |
| 删除工作區檔案。 |
| 移動或重命名工作區檔案。 |
送出日志
| 檢視曆史送出記錄 |
| 以清單形式檢視指定檔案的曆史修改記錄 |
遠端操作
| 遠端倉庫操作 |
| 從遠端擷取代碼庫 |
| 下載下傳遠端代碼并合并 |
| 上傳遠端代碼并合并 |
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問題總結
為了驗證是否成功,輸入以下指令:
$ 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問題總結
建立成功後,顯示如下資訊:
以上資訊告訴我們可以從這個倉庫克隆出新的倉庫,也可以把本地倉庫的内容推送到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 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的搭建與簡單配置
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使用者的密碼。記住自己設定的密碼,再次重新整理進入登入頁面
9、以管理者身份登入,預設的使用者是root,密碼是剛才設定的。
搭建好環境之後,下面的則根據官方文檔解釋,自己摸索做一些根據自己需要的修改,二次開發也可以。
git問題總結
git rebase 和 git merge 一樣都是用于從一個分支擷取并且合并到目前分支,但是他們采取不同的工作方式,以下面的一個工作場景說明其差別
那麼此時在feature上git 自動會産生一個新的commit(merge commit)
marge 特點:自動建立一個新的commit
如果合并的時候遇到沖突,僅需要修改後重新commit
優點:記錄了真實的commit情況,包括每個分支的詳情
缺點:因為每次merge會自動産生一個merge commit,是以在使用一些git 的GUI tools,特别是commit比較頻繁時,看到分支很雜亂。
rebase 本質是變基
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