Git與Gitlab

Git介紹

git(/ɡ?t/)是一個分布式版本控制軟件,最初由林納斯·托瓦茲(Linus Torvalds)創(chuàng)作,于2005年以GPL發(fā)布。Git是免費的。

林納斯·托瓦茲自嘲地取了這個名字“git”,該詞源自英國俚語,意思大約是“混賬”。




集中式與分布式

集中式版本控制系統(tǒng),版本庫是集中存放在中央服務器的,而干活的時候,用的都是自己的電腦,所以要先從中央服務器取得最新的版本,然后開始干活,干完活了,再把自己的活推送給中央服務器。
集中式版本控制系統(tǒng)最大的毛病就是必須聯(lián)網(wǎng)才能工作。
常用集中式版本控制系統(tǒng)有:CVS、SVN。

分布式版本控制系統(tǒng)根本沒有“中央服務器”,每個人的電腦上都是一個完整的版本庫,這樣,你工作的時候,就不需要聯(lián)網(wǎng)了,因為版本庫就在你自己的電腦上。既然每個人電腦上都有一個完整的版本庫,那多個人如何協(xié)作呢?比方說你在自己電腦上改了文件A,你的同事也在他的電腦上改了文件A,這時,你們倆之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。
常用分布式版本控制系統(tǒng)有:Git。

和集中式版本控制系統(tǒng)相比,分布式版本控制系統(tǒng)的安全性要高很多,因為每個人電腦里都有完整的版本庫,某一個人的電腦壞掉了不要緊,隨便從其他人那里復制一個就可以了。而集中式版本控制系統(tǒng)的中央服務器要是出了問題,所有人都沒法干活了。


Git常用命令

yum install git -y

#--global全局配置
git config --global user.name "Username"
git config --globla user.email "Email"

#創(chuàng)建版本庫
mkdir gitest&&cd gitest
#init, Create an empty Git repository or reinitialize an existing one
git init    #目錄下多了一個.git目錄

echo "First Git test" > README

#add,把文件添加到倉庫
git add README
#git add file1 file2...

#commit,把文件提交到倉庫
git commit -m "Readme"

#為什么Git添加文件需要add,commit一共兩步呢?
#因為commit可以一次提交很多文件,所以你可以多次add不同的文件。

#status,查看狀態(tài)
git status

#diff,Show changes between commits, commit and working tree, etc
git diff

#版本回退,如果文件誤刪,還可以從commit中恢復
#log,查看提交記錄,能看到Commit ID(sha1sum散列值)
#在Git中,用HEAD表示當前版本,也就是最新的Commit ID

#reset, Reset current HEAD to the specified state
git reset --hard HEAD^  #回退到上一版本

#也可以利用commit id回退
#用git log可以查看提交歷史,以便確定要回退到哪個版本
git reset --hard $commit_id #回退到之前某個版本

#reflog,記錄每一個命令
#用git reflog查看命令歷史,以便確定要回到未來的哪個版本
git reflog

#checkout,  Checkout a branch or paths to the working tree
#當你改亂了工作區(qū)某個文件的內(nèi)容,想直接丟棄工作區(qū)的修改時,用命令git checkout -- file
git checkout --file #把file在工作區(qū)的修改全部撤銷
git checkout --README
#當你不但改亂了工作區(qū)某個文件的內(nèi)容,還添加到了暫存區(qū)時,想丟棄修改,分兩步。
#第一步用命令git reset HEAD file,就回到了場景1,第二步git checkout --file。
git reset HEAD file && git checkout --file

#rm,Remove files from the working tree and from the index
#確實要從版本庫中刪除該文件
#如果一個文件已經(jīng)被提交到版本庫,那么你永遠不用擔心誤刪
git rm README


#或者誤刪某文件,需要恢復
git checkout -- README


版本庫(Repository)

隱藏目錄.git是Git的版本庫。
Git版本庫里面存放了很多東西,其中最重要的就是 stage(或index)的暫存區(qū),還有Git為我們自動創(chuàng)建的第一個分支master,以及指向master的一個指針叫HEAD

git add把文件添加進去,實際是把文件添加到暫存區(qū);
git commit提交更改,實際是把暫存區(qū)的所有內(nèi)容提交到當前分支。默認git commit就是往master上提交更改。


遠程倉庫

在Github免費獲得Git遠程倉庫。

  1. 創(chuàng)建SSH-Key
#把你的github郵箱地址
ssh-keygen -t rsa -C "email@example.com"
#會生成 ~/.ssh,包含 私鑰:id_rsa,公鑰:id_rsa.pub
  1. 將公鑰寫入Github
    在Github--Account settings--SSH Keys--Add SSH Key里面,添加你的id_rsa.pub公鑰文件。
    當然,你可以添加多個Key哦,畢竟可能你有多臺登陸設(shè)備。
    這個就相當于SSH無密鑰認證。


添加遠程倉庫

你想將Github的倉庫同本地倉庫之間同步。

git remote add origin  git@github.com:username/repo_name.git

#push,把本地倉庫內(nèi)容推送到遠程
#-u參數(shù),Git不但會把本地的master分支內(nèi)容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關(guān)聯(lián)起來,在以后的推送或者拉取時就可以簡化命令
git push -u origin master
git push origin master

#克隆遠程倉庫,clone
git clone URL


分支管理

git默認創(chuàng)建的是master主分支,當然我們也可以創(chuàng)建需要的branch

首先,master分支是應該穩(wěn)定的,也就是僅用來發(fā)布新版本,平時不能在上面干活。
干活可以新建一個dev分支,也就是說,dev分支是不穩(wěn)定的。到某個時候,比如1.0版本發(fā)布時,再把dev分支合并到master上,在master發(fā)布1.0版本。

你和你的小伙伴每個人都在dev分支上干活,每個人都有自己的分支,時不時往'dev'分支上合并就行了。

#創(chuàng)建新分支, branch
git branch test
git checkout test   #切換到test分支
#快捷: git checkout -b test

#查看分支
git branch  #*號表示當前分支

#在test分支下修改
echo "2nd Git" >> README
git add README
git commit -m "branch test"

#切回其他分支
git checkout master

#merge,合并指定分支到當前分支
#將test分支合并到master
git merge test  #現(xiàn)在修改后的README內(nèi)容就在master中

#刪除分支
git brach -d test
git branch  #查看分支

#查看分支合并圖
git log --graph

#--no-ff,普通模式合并
#合并后有歷史分支,能看出曾經(jīng)做過合并
git merge --no-ff -m "no-ff-merge" test

#fast forward,看不出來曾經(jīng)做過合并


#Bug分支
#stash,把當前工作現(xiàn)場”儲藏“起來,等以后恢復后繼續(xù)工作
#在處理bug上挺適合
git checkout -b iss001
修改bug
git add file
git commit -m "fix bug-001"

#bug修復完成后切換并合并
git checkout master
git merge --no-ff -m "merge bug-001"

#查看工作現(xiàn)場儲藏到哪去了
git stash list

#刪除工作現(xiàn)場
git stash drop
#恢復并刪除
git stash pop


標簽管理

發(fā)布一個新版本時,通常先在版本庫中打一個標簽(tag),這樣,就唯一確定了打標簽時刻的版本。
將來無論什么時候,取某個表全的版本,就是把那個打標簽的時刻的歷史版本取出來。所以,標簽也是版本庫的一個快照。

tag其實是指向 commit id的。
git有commit,為什么還要引入tag? commit id 是一串散列值,并不簡單明了。但是tag,我可以寫為"v1.0","v1.2"...
tag,"v1.0"指向?qū)?code>commit id,很方便明了。

#首先切換到需要打tag的分支上
git brach test

#創(chuàng)建tag
git tag tag-name
git tag v1.0
#默認tag是打在最新提交的commit上

#查看所有tag
git tag

#指定tag對應的commit
git tag $tag-name $commit_id
git tag v1.0 65432ba

#標簽不是按時間順序列出的,而是按照字母排序
git show $tag-name
git show v1.0

#創(chuàng)建帶有說明的標簽,-a tag-name;-m 說明
git tag -a $tag-name -m "v1.1 released" $commit-id
git tag -a v1.1 -m "V1.1" 6543bb

#用私鑰簽名一個標簽
git tag -s $tag-name -m "pri-key" $commit-id
git tag -s v1.2 -m "pri-key v1.2" 6543bc

#刪除標簽
git tag -d $tag-name
git tag -d v1.2

#推送某個標簽到遠程
git pust origin $tag-name
git push origin v1.0

#推送全部標簽
git push origin --tags





GitLab基本操作

GitLab常用命令:

#載入配置文件
gitlab-ctl reconfigure

#啟動,關(guān)閉,重啟服務
gitlab-ctl start | stop | restart

#檢查服務日志信息
gitlab-ctl tail redis
gitlab-ctl tail postgresql
gitlab-ctl tail gitlab-workhorse
gitlab-ctl tail logrotate
gitlab-ctl tail nginx
gitlab-ctl tail sidekiq
gitlab-ctl tail unicorn
gitlab-ctl status
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 聲明:這篇文章來源于廖雪峰老師的官方網(wǎng)站,我僅僅是作為學習之用 Git簡介 Git是什么? Git是目前世界上最先...
    橫渡閱讀 3,976評論 3 27
  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git,從https:/...
    落魂灬閱讀 12,699評論 4 54
  • 作者/Author:蘇近之 地點/Address:浙江省杭州市浙江交通職業(yè)技術(shù)學院 時間/Time:2015年06...
    IYANYU閱讀 322評論 0 2
  • 迷鹿mirror閱讀 490評論 0 1
  • 同齡人之中,我結(jié)婚的不算早也稱不上晚,剛畢業(yè)兩年就結(jié)婚了!婆家位于稠木嶺,有一座幾代人居住的老房子和剛剛修葺好沒幾...
    憶蓮閱讀 358評論 0 0