Git詳解及 github與gitlab使用

来源:http://www.cnblogs.com/clsn/archive/2017/11/30/7929958.html
-Advertisement-
Play Games

1.1 關於版本控制 1.1.1 本地版本控制 本地版本控制系統 許多人習慣用複製整個項目目錄的方式來保存不同的版本,或許還會改名加上備份時間以示區別。這麼做唯一的 好處就是簡單,但是特別容易犯錯。有時候會混淆所在的工作目錄,一不小心會寫錯文件或者覆蓋意想外的文件。 1.1.2 集中化的版本控制系統 ...


1.1 關於版本控制

1.1.1 本地版本控制

本地版本控制系統 許多人習慣用複製整個項目目錄的方式來保存不同的版本,或許還會改名加上備份時間以示區別。這麼做唯一的 好處就是簡單,但是特別容易犯錯。有時候會混淆所在的工作目錄,一不小心會寫錯文件或者覆蓋意想外的文件。

1.1.2 集中化的版本控制系統

如何讓在不同系統上的開發者協同工作?於是,集中化的版本控制系統(Centralized Version  Control Systems,簡稱 CVCS)應運而生。這類系統,諸如 CVSSubversion 以及Perforce 等,都有一個單一的集中管理的伺服器,保存所有文件的修訂版本,而協同工作的人們都通過客戶端連到這台伺服器,取出最新的文件或者提交更新。多年以來,這已成為版本控制系統的標準做法。

1.1.3 分散式版本控制系統

         在這類系統中,像GitMercurialBazaar 以及 Darcs 等,客戶端並不只提取最新版本的文件快照,而是把代碼倉庫完整地鏡像下來。這麼一來,任何一處協同工作用的伺服器發生故障,事後都可以用任何一個鏡像出來的本地倉庫恢復。因為每一次的克隆操作,實際上都是一次對代碼倉庫的完整備份。

1.2 Git簡介

 

    官網:https://git-scm.com

         git是一個分散式版本控制軟體,最初由林納斯·托瓦茲(Linus Torvalds)創作,於2005年以GPL發佈。最初目的是為更好地管理Linux內核開發而設計。

Git 官方中文手冊 https://git-scm.com/book/zh/v2

1.2.1 Git歷史

2002年開始,林納斯·托瓦茲決定使用BitKeeper作為Linux內核主要的版本控制系統用以維護代碼。因為BitKeeper為專有軟體,這個決定在社區中長期遭受質疑。在Linux社區中,特別是理查德·斯托曼與自由軟體基金會的成員,主張應該使用開放源代碼的軟體來作為Linux核心的版本控制系統。林納斯·托瓦茲曾考慮過採用現成軟體作為版本控制系統(例如Monotone),但這些軟體都存在一些問題,特別是性能不佳。現成的方案,如CVS的架構,受到林納斯·托瓦茲的批評。

2005年,安德魯·垂鳩寫了一個簡單程式,可以連接BitKeeper的存儲庫,BitKeeper著作權擁有者拉里·麥沃伊認為安德魯·垂鳩對BitKeeper內部使用的協議進行逆向工程,決定收回無償使用BitKeeper的授權。Linux內核開發團隊與BitMover公司進行蹉商,但無法解決他們之間的歧見。林納斯·托瓦茲決定自行開發版本控制系統替代BitKeeper,以十天的時間,編寫出第一個git版本

1.3 安裝git

1.3.1 環境說明

[root@gitlab ~]# rpm -qa centos-release
centos-release-7-4.1708.el7.centos.x86_64
[root@gitlab ~]# uname -a
Linux gitlab 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@gitlab ~]# getenforce 
Disabled
[root@gitlab ~]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

# 本文使用的linux系統均為該系統

# 本文使用的windows系統為 Microsoft Windows [版本 10.0.15063]

1.3.2 Yum安裝Git

# centos 自帶git

[root@gitlab ~]# rpm -qa git
git-1.8.3.1-11.el7.x86_64

 # 安裝方法

yum install git -y

1.3.3 編譯安裝

編譯安裝可以安裝較新版本的git

Git下載地址: https://github.com/git/git/releases

# 安裝依賴關係
yum install curl-devel expat-devel gettext-devel  openssl-devel zlib-devel
# 編譯安裝
tar -zxf git-2.0.0.tar.gz
cd git-2.0.0
make configure
./configure --prefix=/usr
make  
make install  

1.4 初次運行 Git 前的配置

1.4.1 配置git

命令集

git config --global user.name "clsn"  #配置git使用用戶
git config --global user.email "[email protected]"  #配置git使用郵箱
git config --global color.ui true  #語法高亮
git config --list # 查看全局配置

配置過程

[root@gitlab ~]# git config --global user.name "clsn"  #配置git使用用戶
[root@gitlab ~]# git config --global user.email "[email protected]"  #配置git使用郵箱
[root@gitlab ~]# git config --global color.ui true  #語法高亮
[root@gitlab ~]# git config --list # 查看全局配置
user.name=clsn
user.email=[email protected]
color.ui=true

生成的配置文件

[root@gitlab ~]# cat .gitconfig 
[user]
    name = clsn
    email = [email protected]
[color]
    ui = true

1.4.2 獲取幫助

使用Git時需要獲取幫助,有三種方法可以找到Git命令的使用手冊:

git help <verb>
git <verb> --help
man git-<verb>

例如,要想獲得配置命令的手冊,執行

git help config

1.5 獲取 Git 倉庫(初始化倉庫)

# 創建目錄
mkdir git_data
# 進入目錄
cd git_data/
# 初始化
git init
# 查看工作區狀態
git status

操作過程

[root@gitlab ~]# mkdir git_data
[root@gitlab ~]# cd git_data/
[root@gitlab git_data]# git init
初始化空的 Git 版本庫於 /root/git_data/.git/
[root@gitlab git_data]# git status
# 位於分支 master
#
# 初始提交
#
無文件要提交(創建/拷貝文件並使用 "git add" 建立跟蹤)

1.6 Git命令常規操作

常用命令說明

命令

命令說明

add    

添加文件內容至索引

bisect 

通過二分查找定位引入 bug 的變更

branch 

列出、創建或刪除分支

checkout

檢出一個分支或路徑到工作區

clone  

克隆一個版本庫到一個新目錄

commit 

記錄變更到版本庫

diff   

顯示提交之間、提交和工作區之間等的差異

fetch  

從另外一個版本庫下載對象和引用

grep   

輸出和模式匹配的行

init   

創建一個空的

Git    

版本庫或重新初始化一個已存在的版本庫

log    

顯示提交日誌

merge  

合併兩個或更多開發歷史

mv     

移動或重命名一個文件、目錄或符號鏈接

pull   

獲取併合並另外的版本庫或一個本地分支

push   

更新遠程引用和相關的對象

rebase 

本地提交轉移至更新後的上游分支中

reset  

重置當前HEAD到指定狀態

rm     

從工作區和索引中刪除文件

show   

顯示各種類型的對象

status 

顯示工作區狀態

tag

創建、列出、刪除或校驗一個GPG簽名的 tag 對象

常用操作示意圖

文件的狀態變化周期

1.6.1 創建文件

[root@gitlab git_data]# touch README
[root@gitlab git_data]# git status
# 位於分支 master
#
# 初始提交
#
# 未跟蹤的文件:
#   (使用 "git add <file>..." 以包含要提交的內容)
#
#    README
提交為空,但是存在尚未跟蹤的文件(使用 "git add" 建立跟蹤)

 

添加文件跟蹤

[root@gitlab git_data]# git add ./*
[root@gitlab git_data]# git status
# 位於分支 master
#
# 初始提交
#
# 要提交的變更:
#   (使用 "git rm --cached <file>..." 撤出暫存區)
#
#    新文件:    README
#

文件會添加到.git的隱藏目錄

[root@gitlab git_data]# tree  .git/
.git/
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   └── update.sample
├── index
├── info
│   └── exclude
├── objects
│   ├── e6
│   │   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags

由工作區提交到本地倉庫

[root@gitlab git_data]# git commit  -m 'first commit'  
[master(根提交) bb963eb] first commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README

查看git的狀態

[root@gitlab git_data]# git status
# 位於分支 master
無文件要提交,乾凈的工作區

提交後的git目錄狀態

[root@gitlab git_data]# tree  .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   └── update.sample
├── index
├── info
│   └── exclude
├── logs
│   ├── HEAD
│   └── refs
│       └── heads
│           └── master
├── objects
│   ├── 54
│   │   └── 3b9bebdc6bd5c4b22136034a95dd097a57d3dd
│   ├── bb
│   │   └── 963eb32ad93a72d9ce93e4bb55105087f1227d
│   ├── e6
│   │   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│   ├── info
│   └── pack
└── refs
    ├── heads
    │   └── master
    └── tags

1.6.2 添加新文件

git add  * 添加到暫存區域
git commit  提交git倉庫 -m 後面接上註釋信息,內容關於本次提交的說明,方便自己或他人查看

修改或刪除原有文件

常規方法

git add  *
git commit

簡便方法

git commit -a  -m "註釋信息"

-a 表示直接提交

Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are
not affected.

1.6.3 刪除git內的文件

命令說明:

沒有添加到暫存區的數據直接rm刪除即可。

已經添加到暫存區數據:

git rm --cached database 

#→將文件從git暫存區域的追蹤列表移除(並不會刪除當前工作目錄內的數據文件)

git rm -f database

#→將文件數據從git暫存區和工作目錄一起刪除

命令實踐:

# 創建新文件
[root@gitlab git_data]# touch 123
[root@gitlab git_data]# git status
# 位於分支 master
# 未跟蹤的文件:
#   (使用 "git add <file>..." 以包含要提交的內容)
#
#    123
提交為空,但是存在尚未跟蹤的文件(使用 "git add" 建立跟蹤)

# 將文件添加到暫存區域

[root@gitlab git_data]# git add 123
[root@gitlab git_data]# git status
# 位於分支 master
# 要提交的變更:
#   (使用 "git reset HEAD <file>..." 撤出暫存區)
#
#    新文件:    123

刪除文件

[root@gitlab git_data]# rm 123 -f
[root@gitlab git_data]# ls
[root@gitlab git_data]# git status
# 位於分支 master
# 要提交的變更:
#   (使用 "git reset HEAD <file>..." 撤出暫存區)
#
#    新文件:    123
#
# 尚未暫存以備提交的變更:
#   (使用 "git add/rm <file>..." 更新要提交的內容)
#   (使用 "git checkout -- <file>..." 丟棄工作區的改動)
#
#    刪除:      123
# 
[root@gitlab git_data]# git reset HEAD  ./* 
[root@gitlab git_data]# git status
# 位於分支 master
無文件要提交,乾凈的工作區

1.6.4 重命名暫存區數據

沒有添加到暫存區的數據直接mv/rename改名即可。

已經添加到暫存區數據:

git mv README NOTICE

1.6.5 查看歷史記錄

git log   #→查看提交歷史記錄

git log -2   #→查看最近幾條記錄

git log -p -1  #-p顯示每次提交的內容差異,例如僅查看最近一次差異

git log --stat -2 #--stat簡要顯示數據增改行數,這樣能夠看到提交中修改過的內容,對文件添加或移動的行數,併在最後列出所有增減行的概要信息

git log --pretty=oneline #--pretty根據不同的格式展示提交的歷史信息

git log --pretty=fuller -2 #→以更詳細的模式輸出提交的歷史記錄

git log --pretty=fomat:"%h %cn"  #→查看當前所有提交記錄的簡短SHA-1哈希字串與提交著的姓名。

使用format參數來指定具體的輸出格式

格式

說明

%s

提交說明。

%cd

提交日期。

%an

作者的名字。

%cn

提交者的姓名。

%ce

提交者的電子郵件。

%H

提交對象的完整SHA-1哈希字串。

%h

提交對象的簡短SHA-1哈希字串。

%T

樹對象的完整SHA-1哈希字串。

%t

樹對象的簡短SHA-1哈希字串。

%P

父對象的完整SHA-1哈希字串。

%p

父對象的簡短SHA-1哈希字串。

%ad

作者的修訂時間。

命令實踐

[root@gitlab git_data]# git log
commit a409fc46f792228a8119705e9cc97c2a013534ab
Author: clsn <[email protected]>
Date:   Wed Nov 29 11:44:14 2017 +0800

    test

commit bb963eb32ad93a72d9ce93e4bb55105087f1227d
Author: clsn <[email protected]>
Date:   Wed Nov 29 10:57:02 2017 +0800

    first commit

1.6.6 還原歷史數據

Git服務程式中有一個叫做HEAD的版本指針,當用戶申請還原數據時,其實就是將HEAD指針指向到某個特定的提交版本,但是因為Git是分散式版本控制系統,為了避免歷史記錄衝突,故使用了SHA-1計算出十六進位的哈希字串來區分每個提交版本,另外預設的HEAD版本指針會指向到最近的一次提交版本記錄,而上一個提交版本會叫HEAD^,上上一個版本則會叫做HEAD^^,當然一般會用HEAD~5來表示往上數第五個提交版本。

git reset --hard   hash

git reset --hard HEAD^  #→還原歷史提交版本上一次

git reset --hard 3de15d4 #→找到歷史還原點的SHA-1值後,就可以還原(值不寫全,系統

會自動匹配)

測試命令

[root@gitlab git_data]# git log
commit a409fc46f792228a8119705e9cc97c2a013534ab
Author: clsn <[email protected]>
Date:   Wed Nov 29 11:44:14 2017 +0800

    test

commit bb963eb32ad93a72d9ce93e4bb55105087f1227d
Author: clsn <[email protected]>
Date:   Wed Nov 29 10:57:02 2017 +0800

    first commit

         還原數據

[root@gitlab git_data]# git reset --hard  bb963
HEAD 現在位於 bb963eb first commit
# 查看數據
[root@gitlab git_data]# ls
README

1.6.7 還原未來數據

什麼是未來數據?就是你還原到歷史數據了,但是你後悔了,想撤銷更改,但是git log已經找不到這個版本了。

git reflog #→查看未來歷史更新點

測試命令

[root@gitlab git_data]# git reflog
bb963eb HEAD@{0}: res

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [20171130]關於rman備份疑問.txt--//前面測試太亂,重新做一些rman as copy相關測試.1.環境:SCOTT@book> @ &r/ver1PORT_STRING VERSION BANNER x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Da ...
  • 聲明局部變數語法:DECLARE @variable_name DataType其中 variable_name為局部變數的名稱,DataType為數據類型。給局部變數賦值有兩種方法:1、SET @variable_name=value2、SELECT @variable_name=value兩者的 ...
  • 這篇主要講如何將數據保存回Mysql,但是裡面還會涉及到如何將錯誤信息以及提示信息保存到文件里,方便以後的運維,再有就是如何使用PHP寫進程BAT。 Redis數據刷回資料庫前的知識準備 首先針對上篇提到的關於redis刷回資料庫的安全性的設計模式,因為我們使用的是list來做數據索引,所以在我們將 ...
  • 註意要先關閉 selinux 和 防火牆 創建掛載點 mkdir /opt/gua 掛載光碟 mount /dev/cdrom /opt/gua/ 進入目錄 cd /opt/gua/CentOS/ 安裝samba服務 rpm -ivh samba-3.0.33-3.28.el5.i386.rpm - ...
  • 1.1 ISO/OSI 七層模型 筆記: 打入ipconfig: mac地址:Media Access Control 也是物理地址,這是由網卡決定的。負責的是內網,也就是區域網通信。 IPv4地址:是負責外網的,也就是公網通信。 埠是來確定你伺服器給的哪個服務的 1.2 Linux網路基礎之TC ...
  • 性能監測著重於電腦系統資源監測,是對系統進行預防性維護的必要工作,可通過分析監視數據來瞭解系統存在哪些瓶頸,應當採取何種措施來調整或更新受影響的資源, Linux系 統提供了多種性能監測工具來幫助管理員完成系統監控工作; 1》性能監測概述: 系統性能監測與調整是Linux系統管理員日常維護工作的一 ...
  • 1、Shell腳本運行方式 創建Shell腳本文件,一般以.sh結尾(如:example.sh) Shell腳本運行方式如下: 添加 ‘x’ 執行許可權(相對或絕對路徑執行) 使用bash或source(.)命令調用腳本文件 2、Bash的基本功能 (1)、歷史命令history -c:清空歷史命令 ...
  • 在開始搜索框輸入regedit打開註冊表,定位到HKEY_LOCAL_MACHINE SYSTEM ControlSet001 Control GraphicsDrivers Configuration 然後右鍵點擊Configuration,選擇查找,輸入Scaling,在右框內即可看到scali ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...