Git是一個分佈式的版本控制工具,本篇文章從介紹Git開始,重點在於介紹Git的基本命令和使用技巧,讓你嘗試使用Git的同時,體驗到原來一個版 本控制工具能夠對開發產生如此之多的影響,文章分爲兩部分,第一部分介紹Git的一些經常使用命令,其中穿插介紹Git的基本概念和原理,第二篇重點介紹 Git的使用技巧,最後會在Git Hub上建立一個開源項目開啓你的Git實戰之旅html
Git在Wikipedia上的定義:它是一個免費的、分佈式的版本控制工具,或是一個強調了速度快的源代碼管理工具。Git最初被Linus Torvalds開發出來用於管理Linux內核的開發。每個Git的工做目錄都是一個徹底獨立的代碼庫,並擁有完整的歷史記錄和版本追蹤能力,不依賴 於網絡和中心服務器。linux
Git的出現減輕了許多開發者和開源項目對於管理分支代碼的壓力,因爲對分支的良好控制,更鼓勵開發者對本身感興趣的項目作出貢獻。其實許多開源項目 包括Linux kernel, Samba, X.org Server, Ruby on Rails,都已通過渡到使用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 init和git 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的基本命令吧: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 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 reset:回滾到指定的版本號,咱們有A-G提交的版本,其中C 的版本號是 bbaf6fb,咱們執行了'git reset bbaf6fb'那麼結果就只剩下了A-C三個提交的版本
git stash:將當前未提交的工做存入Git工做棧中,時機成熟的時候再應用回來,這裏暫時提一下這個命令的用法,後面在技巧篇會重點講解
git config:新增、更改Git的各類設置,例如:git config branch.master.remote origin 就將master的遠程版本庫設置爲別名叫作origin版本庫
git tag:將某個版本打上一個標籤,例如:git tag revert_version bbaf6fb50 來標記這個被你還原的版本,那麼之後你想查看該版本時,就可使用 revert_version標籤名,而不是哈希值了
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 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原理圖
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文件夾,會有以下這樣的目錄結構:
HEAD branches/ config description hooks/ index info/ objects/ refs/
有幾個比較重要的文件和目錄須要解釋一下:
HEAD:文件存放根節點的信息,其實目錄結構就表示一個樹型結構,Git採用這種樹形結構來存儲版本信息, 那麼HEAD就表示根;
refs:目錄存儲了你在當前版本控制目錄下的各類不一樣引用(引用指的是你本地和遠程所用到的各個樹分支的信息),它有heads、 remotes、stash、tags四個子目錄,分別存儲對不一樣的根、遠程版本庫、Git棧和標籤的四種引用,你能夠經過命令'git show-ref'更清晰地查看引用信息;
logs:目錄根據不一樣的引用存儲了日誌信息。所以,Git只須要代碼根目錄下的這一個.git目錄就能夠記錄完 整的版本控制信息,而不是像SVN那樣根目錄和子目錄下都有.svn目錄。那麼下面就來看一下Git與SVN的區別吧
.gitigmore: 放一些不須要git管理的文件(例:IDE的工做目錄 .idea,)
SVN(Subversion)是當前使用最多的版本控制工具。與它相比較,Git最大的優點在於兩點:易於本地增長分支和分佈式的特性。
下面兩幅圖能夠形象的展現Git與SVN的不一樣之處
GIT對於易於本地增長分支,圖中Git本地和服務器端結構都很靈活,全部版本都存儲在一個目錄中,你只須要進行分支的切換便可達到在某個分支工做的效果。
SVN則徹底不一樣,若是你須要在本地試驗一些本身的代碼,只能本地維護多個不一樣的拷貝,每一個拷貝對應一個SVN服務器地址。
分佈式對於Git而言,你能夠本地提交代碼,因此在上面的圖中,Git有利於將一個大任務分解,進行本地的屢次提交,而SVN只能在本地進行大量的一 次性更改,致使未來合併到主幹上形成巨大的風險。Git的代碼日誌是在本地的,能夠隨時查看。SVN的日誌在服務器上的,每次查看日誌須要先從服務器上下 載下來。我工做的小組,代碼服務器在美國,每次查看小組幾年前所作的工做時,日誌下載就須要十分鐘,這不能不說是一個痛苦。後來咱們遷移到Git上,利用 Git日誌在本地的特性,我用Ruby編寫了一個Rake腳本,能夠查看某個具體任務的全部代碼歷史,每次只須要幾秒鐘,大大方便個人工做。固然分佈式並 不是說用了Git就不須要一個代碼中心服務器,若是你工做在一個團隊裏,仍是須要一個服務器來保存全部的代碼的。
實際的例子:
之前我所 在的小組使用SVN做爲版本控制工具,當我正在試圖加強一個模塊,工做作到一半,因爲會改變原模塊的行爲致使代碼服務器上許多測試的失敗,因此並無提交 代碼。這時候上級對我說,如今有一個很緊急的Bug須要處理, 必須在兩個小時內完成。我只好將本地的全部修改diff,並輸出成爲一個patch文件,而後回滾有關當前任務的全部代碼,再開始修改Bug的任務,等到 修改好後,在將patch應用回來。前先後後要完成多個繁瑣的步驟,這還不計中間代碼發生衝突所要進行的工做量。
但是若是使用Git, 咱們只須要開一個分支或者轉回到主分支上,就能夠隨時開始Bug修改的任務,完成以後,只要切換到原來的分支就能夠優雅的繼續之前的任務。只要你願意,每 一個新的任務均可以開一個分支,完成後,再將它合併到主分支上,輕鬆而優雅。
安裝有可能的依賴:
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