Git使用基礎篇

前言

  Git是一個分佈式的版本控制工具,本篇文章從介紹Git開始,重點在於介紹Git的基本命令和使用技巧,讓你嘗試使用Git的同時,體驗到原來一個版 本控制工具能夠對開發產生如此之多的影響,文章分爲兩部分,第一部分介紹Git的一些經常使用命令,其中穿插介紹Git的基本概念和原理,第二篇重點介紹 Git的使用技巧,最後會在Git Hub上建立一個開源項目開啓你的Git實戰之旅html

Git是什麼

        Git在Wikipedia上的定義:它是一個免費的、分佈式的版本控制工具,或是一個強調了速度快的源代碼管理工具。Git最初被Linus Torvalds開發出來用於管理Linux內核的開發。每個Git的工做目錄都是一個徹底獨立的代碼庫,並擁有完整的歷史記錄和版本追蹤能力,不依賴 於網絡和中心服務器。linux

        Git的出現減輕了許多開發者和開源項目對於管理分支代碼的壓力,因爲對分支的良好控制,更鼓勵開發者對本身感興趣的項目作出貢獻。其實許多開源項目 包括Linux kernel, Samba, X.org Server, Ruby on Rails,都已通過渡到使用Git做爲本身的版本控制工具。對於咱們這些喜歡寫代碼的開發者嘛,有兩點最大的好處,咱們能夠在任何地點(在上班的地鐵 上)提交本身的代碼和查看代碼版本;咱們能夠開許許多多個分支來實踐咱們的想法,而合併這些分支的開銷幾乎能夠忽略不計。git

Git 初始化

        如今進入本篇文章真正的主題,介紹一下Git的基本命令和操做,會從Git的版本庫的初始化,基本操做和獨有的經常使用命令三部分着手,讓你們可以開始使用Git。github

        Git一般有兩種方式來進行初始化:瀏覽器

        git clone: 這是較爲簡單的一種初始化方式,當你已經有一個遠程的Git版本庫,只須要在本地克隆一份,例如'git clone git://github.com/someone/some_project.git some_project'命令就是將'git://github.com/someone/some_project.git'這個URL地址的遠程版 本庫徹底克隆到本地some_project目錄下面服務器

        git initgit remote:這種方式稍微複雜一些,當你本地建立了一個工做目錄,你能夠進入這個目錄,使用 git init 命令進行初始化,Git之後就會對該目錄下的文件進行版本控制,這時候若是你須要將它放到遠程服務器上,能夠在遠程服務器上建立一個目錄,並把 可訪問的URL記錄下來,此時你就能夠利用 git remote add 命令來增長一個遠程服務器端,例如'git remote add origin git://github.com/someone/another_project.git'這條命令就會增長URL地址爲'git: //github.com/someone/another_project.git',名稱爲origin的遠程服務器,之後提交代碼的時候只須要使用 origin別名便可網絡

Git 基本命令    

     如今咱們有了本地和遠程的版本庫,讓咱們來試着用用Git的基本命令吧:app

        git pull:從版本庫(既能夠是遠程的也能夠是本地的)將代碼更新到本地,例如:'git pull origin master'就是將origin這個版本庫的代碼更新到本地的master主枝,該功能相似於SVN的updatessh

        git add:將全部改動的文件(新增和有變更的)放在暫存區,由git進行管理curl

        git rm:從當前的工做空間中和索引中刪除文件,例如'git rm app/model/user.rb',移除暫存區

        git commit:提交當前工做空間的修改內容,相似於SVN的commit命令,例如'git commit -m "story #3, add user model"',提交的時候必須用-m來輸入一條提交信息

        git push:將本地commit的代碼更新到遠程版本庫中,例如'git push origin branchname'就會將本地的代碼更新到名爲orgin的遠程版本庫中

        git log:查看歷史日誌

        git revert還原一個版本的修改,必須提供一個具體的Git版本號,例如'git revert bbaf6fb5060b4875b18ff9ff637ce118256d6f20',Git的版本號都是生成的一個哈希值、

        上面的命令幾乎都是每一個版本控制工具所公有的,下面就開始嘗試一下Git獨有的一些命令:

Git 獨有命令

        git branch:對分支的增、刪、查等操做,例如 git branch new_branch 會從當前的工做版本建立一個叫作new_branch的新分支,git branch -D new_branch 就會強制刪除叫作new_branch的分支,git branch 就會列出本地全部的分支

        git checkout:Git的checkout有兩個做用,其一是在 不一樣的branch之間進行切換,例如 'git checkout new_branch'就會切換到new_branch的分支上去;另外一個功能是 還原代碼的做用,例如git checkout app/model/user.rb 就會將user.rb文件從上一個已提交的版本中更新回來,未提交的內容所有會回滾

        git rebase:用下面兩幅圖解釋會比較清楚一些,rebase命令執行後,其實是將分支點從C移到了G,這樣分支也就具備了從C到G的功能 (使歷史更加簡潔明瞭)

                                             Git使用基礎篇

        git reset:回滾到指定的版本號,咱們有A-G提交的版本,其中C 的版本號是 bbaf6fb,咱們執行了'git reset bbaf6fb'那麼結果就只剩下了A-C三個提交的版本

                                              Git使用基礎篇

        git stash:將當前未提交的工做存入Git工做棧中,時機成熟的時候再應用回來,這裏暫時提一下這個命令的用法,後面在技巧篇會重點講解

        git config:新增、更改Git的各類設置,例如:git config branch.master.remote origin 就將master的遠程版本庫設置爲別名叫作origin版本庫

        git tag:將某個版本打上一個標籤,例如:git tag revert_version bbaf6fb50 來標記這個被你還原的版本,那麼之後你想查看該版本時,就可使用 revert_version標籤名,而不是哈希值了

Git 其餘命令

  add                #添加文件內容至索引

  branch            #列出、建立或刪除分支

  checkout         #檢出一個分支或路徑到工做區

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

  commit     #最近一次的提交,--amend修改最近一次提交說明

  diff                #顯示提交之間、提交和工做區之間等的差別  

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

  init                #建立一個空的 Git 版本庫或從新初始化一個已存在的版本庫

  log                 #顯示提交日誌 --stat 具體文件的改動

  reflog    #記錄丟失的歷史

  merge            #合併兩個或更多開發歷史,--squash 把分支全部提交合併成一個提交

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

  pull                #獲取併合並另外的版本庫或一個本地分支(至關於git fetch和git merge)

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

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

  reset                #重置當前HEAD到指定狀態

  rm                 #從工做區和索引中刪除文件

  show               #顯示各類類型的對象

  status              #顯示工做區狀態

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

  cherry-pick  #從其餘分支複製指定的提交,而後導入到如今的分支

  

git merge --squash issue1

git分支命令

建立分支:

git branch linux                           #建立分支

git checkout linux                        #切換分支

git branch                                    #查看當前分支狀況,當前分支前有*號

git add readme.txt                       #提交到暫存區

git commit -m 「new branch」        #提交到git版本倉庫

git checkout master                      #咱們在提交文件後再切回master分支

分支合併:(合併前必須保證在master主幹上)

git branch        #查看在哪一個位置

git merge Linux    #合併建立的Linux分支(–no–ff默認狀況下,Git執行」快進式合併」(fast-farward merge),會直接將Master分支指向Develop分支。使用–no–ff參數後,會執行正常合併,在Master分支上生成一個新節點。)

git branch -d linux   #確認合併後刪除分支

若是有衝突:

git merge linux     #合併Linux分支(衝突)

Auto-merging readme.txt

CONFLICT (content): Merge conflict in readme.txt

Automatic merge failed; fix conflicts and then commit the result.

  #那麼此時,咱們在master與linux分支上都分別對中readme文件進行了修改並提交了,那這種狀況下Git就無法再爲咱們自動的快速合併了,它只能告訴咱們readme文件的內容有衝突,須要手工處理衝突的內容後才能繼續合併

本身修改完readme.txt文件後再次提交

       

      –no–ff原理圖

git全局配置

yum install git                                       #安裝Git
git config –global user.name 「xubusi」                 #配置git使用用戶
git config –global user.email 「xubusi@mail.com」       #配置git使用郵箱
git config –global color.ui true                      #加顏色

 

git config –list                                      #全部配置的信息(上面的結果)
user.name=xubusi
user.email=xubusi@mail.com
color.ui=true

 

 

.git目錄結構

        Git之因此可以提供方便的本地分支等特性,是與它的文件存儲機制有關的。Git存儲版本控制信息時使用它本身定義的一套文件系統存儲機制,在代碼根目錄下有一個.git文件夾,會有以下這樣的目錄結構:

HEAD
branches/
config
description
hooks/
index
info/
objects/
refs/
Git使用基礎篇  

有幾個比較重要的文件和目錄須要解釋一下:

    HEAD:文件存放根節點的信息,其實目錄結構就表示一個樹型結構,Git採用這種樹形結構來存儲版本信息, 那麼HEAD就表示根;

    refs:目錄存儲了你在當前版本控制目錄下的各類不一樣引用(引用指的是你本地和遠程所用到的各個樹分支的信息),它有heads、 remotes、stash、tags四個子目錄,分別存儲對不一樣的根、遠程版本庫、Git棧和標籤的四種引用,你能夠經過命令'git show-ref'更清晰地查看引用信息;

    logs:目錄根據不一樣的引用存儲了日誌信息。所以,Git只須要代碼根目錄下的這一個.git目錄就能夠記錄完 整的版本控制信息,而不是像SVN那樣根目錄和子目錄下都有.svn目錄。那麼下面就來看一下Git與SVN的區別吧

    .gitigmore:  放一些不須要git管理的文件(例:IDE的工做目錄 .idea,)

 

 

Git與SVN的不一樣

        SVN(Subversion)是當前使用最多的版本控制工具。與它相比較,Git最大的優點在於兩點:易於本地增長分支和分佈式的特性

        下面兩幅圖能夠形象的展現Git與SVN的不一樣之處

 Git使用基礎篇    Git使用基礎篇

      GIT對於易於本地增長分支,圖中Git本地和服務器端結構都很靈活,全部版本都存儲在一個目錄中,你只須要進行分支的切換便可達到在某個分支工做的效果。

  SVN則徹底不一樣,若是你須要在本地試驗一些本身的代碼,只能本地維護多個不一樣的拷貝,每一個拷貝對應一個SVN服務器地址。

  分佈式對於Git而言,你能夠本地提交代碼,因此在上面的圖中,Git有利於將一個大任務分解,進行本地的屢次提交,而SVN只能在本地進行大量的一 次性更改,致使未來合併到主幹上形成巨大的風險。Git的代碼日誌是在本地的,能夠隨時查看。SVN的日誌在服務器上的,每次查看日誌須要先從服務器上下 載下來。我工做的小組,代碼服務器在美國,每次查看小組幾年前所作的工做時,日誌下載就須要十分鐘,這不能不說是一個痛苦。後來咱們遷移到Git上,利用 Git日誌在本地的特性,我用Ruby編寫了一個Rake腳本,能夠查看某個具體任務的全部代碼歷史,每次只須要幾秒鐘,大大方便個人工做。固然分佈式並 不是說用了Git就不須要一個代碼中心服務器,若是你工做在一個團隊裏,仍是須要一個服務器來保存全部的代碼的。

實際的例子:

  之前我所 在的小組使用SVN做爲版本控制工具,當我正在試圖加強一個模塊,工做作到一半,因爲會改變原模塊的行爲致使代碼服務器上許多測試的失敗,因此並無提交 代碼。這時候上級對我說,如今有一個很緊急的Bug須要處理, 必須在兩個小時內完成。我只好將本地的全部修改diff,並輸出成爲一個patch文件,而後回滾有關當前任務的全部代碼,再開始修改Bug的任務,等到 修改好後,在將patch應用回來。前先後後要完成多個繁瑣的步驟,這還不計中間代碼發生衝突所要進行的工做量。

  但是若是使用Git, 咱們只須要開一個分支或者轉回到主分支上,就能夠隨時開始Bug修改的任務,完成以後,只要切換到原來的分支就能夠優雅的繼續之前的任務。只要你願意,每 一個新的任務均可以開一個分支,完成後,再將它合併到主分支上,輕鬆而優雅。

gitlab介紹

安裝服務相關命令

安裝有可能的依賴:

yum install openssh-server

yum install postfix

yum install cronie

安裝gitlab:

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh #下載數據源

yum install gitlab-ce

安裝完成後:

gitlab-ctl reconfigure    #使配置文件生效 可是會初始化除了gitlab.rb以外的全部文件

gitlab-ctl status           #查看狀態

gitlab-ctl stop                #停服務

gitlab-ctl start               #起服務

gitlab-ctl tail                 #查看日誌的命令(Gitlab 默認的日誌文件存放在/var/log/gitlab 目錄下)

 

以下表示啓動成功:(全是run,有down表示有的服務沒啓動成功

 

而後打開瀏覽器輸入ip或者域名

相關目錄文件信息

相關目錄

.git/config                                              #版本庫特定的配置設置,可用--file修改

~/.gitconfig                                            #用戶特定的配置設置,可用--global修改 

/var/opt/gitlab/git-data/repositories/root    #庫默認存儲目錄

/opt/gitlab                                             #是gitlab的應用代碼和相應的依賴程序

/var/opt/gitlab                                       #此目錄下是運行gitlab-ctl reconfigure命令編譯後的應用數據和配置文件,不須要人爲修改配置
/etc/gitlab                                             #此目錄下存放了以omnibus-gitlab包安裝方式時的配置文件,這裏的配置文件才須要管理員手動編譯配置
/var/log/gitlab                                        #此目錄下存放了gitlab各個組件產生的日誌

/var/opt/gitlab/backups/                         #備份文件生成的目錄

相關文件

/opt/gitlab/embedded/service/gitlab-rails/config      #配置文件(修改clone的ip地址)

/etc/gitlab/gitlab.rb                                        #設置相關選項進行配置(gitlab地址就在這)

/var/opt/gitlab/git-data                                   #Git存儲庫數據(默認

 

 總結

        本篇介紹了Git的基本概念、一些經常使用命令和原理,你們能夠嘗試動手體會一下,下一篇會重點介紹Git命令的使用技巧,Git附帶的工具,最後會在Git Hub上建立一個開源項目。

    一段關於revert痛苦的經歷:https://blog.csdn.net/u013066244/article/details/79920012

相關文章
相關標籤/搜索