Gitlab詳細操作

原文鏈接:https://www.jianshu.com/p/fb61299086b6

基本操作

git安裝

在Windows上使用Git,可以從Git官網直接下載安裝程序,默認安裝即可。安裝完成之後會多處git bash和git GUI兩個程序,我們使用git bash 採用命令行的方式進行一系列的操作。

本地git倉庫

1、什麼是本地倉庫

版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裏面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”

2、本地倉庫的建立

  1. 在本地選擇一個目錄,新建文件夾,並在終端打開這個文件夾。
  2. 將這個文件夾初始化爲倉庫,使用命令 git init 將這個文件夾初始化爲git可以管理的倉庫,那麼現在我們的這個本地文件夾就變化了Git可以管理的倉庫,在這個文件夾下會有一個隱藏的 .git 文件夾

3、在本地的倉庫添加或者修改文件

在本地的倉庫進行代碼編寫的時候,我們首先要明白git中工作區和暫存區的概念。

  • 工作區

我們在資源管理器裏可以看到的文件就是我們的工作區

  • 暫存區

當我們的代碼完成了一個階段,我們想當前的這個版本在本地倉庫進行保存一個版本,也就是commit操作,但是假如我們每次文件修改後都需要進行一次commit,會比較麻煩,所以Git給我們提供了一種方式,就是將修改的文件進行一次add操作,添加到暫存區中,在進行了一些add之後,統一進行commit操作。當然也可以直接每次add之後就進行commit。

git add filename --將文件添加到暫存區
git add . -- 將本地倉庫所有的文件添加到暫存區
git commit -m "提交說明" --使用commit將暫存區的文件進行提交到本地的分支,-m 代表本次的提交說明

4、使用git status查看工作區和暫存區的狀態

當我們在工作區進行了文件的修改和文件的增加的時候,git status會告訴我們發生了什麼變化,來幫助我們進行判斷。

遠程倉庫

1、github和gitlab的區別

github和github都是基於git的web代碼倉庫管理軟件。區別主要在於github上的倉庫基本上都是開源的,當然也可以創建私有的代碼倉庫,但是費用比較昂貴。而gitlab是可以在企業內部搭建,可以創建私有的代碼倉庫,除此之外,gitlab還有一些其他的高級特性。相同之處是他們都是基於版本管理系統git,都使用git的命令進行操作。

2、遠程倉庫和本地倉庫的關聯

將本地的倉庫倉庫推送到遠程是比較安全的,當本地代碼出現問題的時候,我們可以很方便在的遠程倉庫上進行代碼的拉取。具體操作如下:

1.如果我們按照上面的步驟已經在本地上建好了一個倉庫,想和遠程倉庫進行關聯,我們首先要在遠程的倉庫上新建一個項目,然後我們使用下面的代碼進行關聯(http方式)

git remote add origin http://github.com/username/learngit.git
username 是遠程倉庫的用戶名,learngit是遠程倉庫的名稱

或者(ssh密鑰方式):

git remote add origin [email protected]:michaelliao/learngit.git

2.關聯的時候有兩種方式來驗證用戶的信息,一種是http方式,一種是ssh密鑰方式,如果想要簡化配置流程,使用http方式即可。

3.在經過了上述的關聯之後,我們下一次進行推動的時候,只需要使用 git push origin master 即可完成推送。origin代表遠程倉庫,master是這個倉庫的一個主分支也是默認分支。但是實際上我們是應該在其他分支上進行開發和推送,在下文會講到。

3、從遠程庫上進行克隆

在遠程倉庫新建項目,使用git clone命令克隆到本地進行開發。這時候本地就會出現一個和項目名稱相同的文件夾,在文件夾下同樣.git文件夾來記錄版本信息,這時候git已經在本地幫我們建立好了一個倉庫。因爲我們是直接在git上克隆下來的,所有已經和遠程的倉庫建立了關聯,我們可以直接進行代碼的推送

進階操作

版本回退

當我們在開發的時候,將文件進行添加到暫存區然後提交到本地的版本庫。版本庫會將我們每一次的操作來進行一次存檔。那麼久方便我們很容易回退到某個版本。
我們可以使用 git diff HEAD -- filename 命令可以查看工作區和版本庫裏面最新版本的區別,如果確定需要回退,那就按照下述的方式來進行回退。我們分幾個情境來進行版本回退

1、當前編輯的文件還沒有提交到暫存區

如果只是做了簡單的修改,我們可以手動恢復到我們想要的狀態,但是加入修改過多,已經忘記自己修改了什麼內容,那麼使用
git checkout -- file 可以丟棄工作區的修改,在這裏可能有兩種情況:

  1. 一種是file自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;

  2. 一種是readme.txt已經添加到暫存區後,又作了修改,現在,撤銷修改就回到添加到暫存區後的狀態。簡單說就是讓這個文件回到最近一次git commit或git add時的狀態。

2、文件已經提交到了暫存區但是並沒有提交到本地的版本庫

git reset HEAD <file> 可以把暫存區的修改撤銷掉(unstage),重新放回工作區。git reset命令既可以回退版本,也可以把暫存區的修改回退到工作區。當我們用HEAD時,表示最新的版本。
使用checkout 就可以丟棄工作區的修改了。

3、已經將文件存儲到暫存區並提交到了本地版本庫

當我們進行回退的時候,要知道我們要回退到哪個版本,在git中使用HEAD表示當前的版本,那麼如果要是回退到上個版本的話就是使用: git reset --hard HEAD^ 我們的版本就會被還原到上一個版本,使用HEAD^可以回退到上上一個版本,當然==再往上100個版本寫100個比較容易數不過來,所以寫成HEAD~100。

在使用git reset的時候,有兩個參數可以選擇,分別是git reset --hard/soft,hard和soft的主要區別在於,soft只是回退了commit的信息,也就是指向之前的commit信息,但是對應的文件並不會發生改變。而使用hard方式commit信息會指向之前的信息,同時在工作區的文件也會跟隨者進行變化。

4、當我們回退後又想前進到回退前的版本,git也提供了對應的操作方式

我們可以使用 git reflog 命令查看操作記錄,來判斷我們要回到哪個版本。

刪除文件恢復

在git中,刪除也是一個修改操作,一般會有以下兩種操作。

1、誤刪除文件(已經add或者已經commit)

在本機上將文件進行刪除後,我們介可以使用git status檢測到文件的變動。但是原來的文件必須是已經add操作的
使用git checkout -- 誤刪除文件名稱,和上文介紹的恢復工作區狀態的指令相同。

2、確定要刪除文件

當我們在資源管理器將某個文件刪除,使用git status 會提示我們使用 git rm 進行刪除文件
使用 git rm (文件名稱 然後進行commit
當然也可以使用git add . 來添加全部修改或新增的文件
注意,當我們沒有進行add 和commit操作的時候我們是無法從原來的版本庫進行恢復的,也就是直接新建一個文件,沒有經過任何操作,是無法恢復的。

分支管理

分支管理的目的就是將當前已經可以發佈模塊放在一個分支,在另外一個分支進行進一步開發,開發完成後可以進行分支合併。
在gitlab上默認的分支是master(主分支),也只有這一個分支,其他分支需要開發人員自行建立。
主要操作如下

指令 功能
git branch 查看分支(*指向的爲當前的分支)
git branch<name> 創建分支
git checkout<name> 切換分支
git checkout -b <name> 創建加切換分支
git merge <name> 合併某分支到當前分支
git branch -d<name> 刪除分支

1、創建與合併分支

創建分支

在本地新建dev分支並指向dev分支後,這時候倉庫下的文件更改都是在dev分支下的操作,當進行修改後,可以推送到遠程的dev分支,如果遠程沒有dev分支,git會幫助我們新建dev分支並將文件推送。其他開發者在自己的本機建立dev分支,也向遠程的dev分支進行推送(後面介紹本地dev分支和遠程dev分支相連以及衝突的解決)。

合併分支

切換到master分支之後,將dev分支合併到當前的master分支,合併完成後,git會提示我們當前分支比遠程的分支超前一個。

切換分支.png

合併圖解如下:
新建dev分支,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上:

新建分支.png

 

新提交一次後,dev指針往前移動一步,而master指針不變:

dev分支提交.png

合併dev分支,git的方式是將master指向dev分支

合併dev分支.png

在遠程倉庫進行合併的方式

在實際的開發中,一般master主分支是受保護的,也就是說只有項目的負責人才有權限在master分支上進行相關的操作,其他普通開發者只能向dev分支進行推送,那麼普通開發者怎麼才能讓負責人知道自己可以合併分支,這就需要在gitlab的dev分支界面發起合併請求,負責人收到請求後開始合併。

2、分支衝突的解決

本地衝突

當我們在本地使用master分支合併dev分支的時候出現衝突,如下圖

合併分支衝突.png

使用git status 也可以查看衝突

查看衝突.png

使用cat命令查看衝突,Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容

解決衝突.png

其中HEAD代表當前的代碼,>>>>代表其他版本衝突的代碼,我們打開衝突的文件,將代碼衝突進行修改之後,將HEAD,>>>等標誌刪除之後重新進行提交即可。

查看解決之後的文件.png

提交完成後重新進行合併

重新合併.png

遠程推送出現衝突

當我們的本地的分支推送到遠程的分支的時候,可能遠程上的分支已經進行了修改,那麼我們將會push失敗,解決方案是:
1.從遠程的分支上拉最新的分支 git pull
2.在拉取完成後,會自動提示我們衝突的文件,我們按照相同的方式進行修改後重新提交推送即可。

3、分支合併的模式

有兩種常用的合併分支的方式

1、快速合併方式

如果待合併的分支在當前分支的下游,也就是說沒有分叉時,會發生快速合併,git會提示我們此次合併是快速合併。

image.png

這種方法相當於直接把master分支移動到test分支所在的地方,並移動HEAD指針。

2、普通合併方式

如果我們不想要快速合併,那麼我們可以強制指定爲非快速合併,只需加上--no-ff參數,普通合併實質上是在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息。所以需要我們添加commit描述

image.png

3、兩種合併方式對比

下圖中第二、三次提交是快速合併,都是基於dev分支提交,但在查看log信息的時候,看不出來是合併操作,緊接着我們在dev分支繼續修改,然後使用普通合併模式進行修改,這次可以發現分支圖上顯示我們的操作流程,在dev分支進行修改,在master分支進行合併。推薦在合併的時候使用普通合併。

 

image.png

4、分支管理策略

實際開發時,應該按照以下幾個原則進行開發

1、master分支應該是非常穩定的,也就是僅用來發布新版本,平時不在上面幹活

2、幹活都在dev分支,也就是說Dev分支是不穩定的,到某個時候,比如發佈版本的時候,將dev分支合併到master上,在master分支發佈版本

3、開發者可以在dev分支上開發,每個人都有自己的分支,最後往dev分支合併就可以了

4、合併分支的時候,加上--no-ff參數就可以用普通模式合併,合併後的歷史有分支,可以看出曾經做過合併,而fast forward則看不出來

標籤管理

發佈一個版本時,我們通常先在版本庫中打一個標籤(tag),這樣,就唯一確定了打標籤時刻的版本。將來無論什麼時候,取某個標籤的版本,就是把那個打標籤的時刻的歷史版本取出來。所以,標籤也是版本庫的一個快照。我們在發佈一個版本的時候,會對應有一個commit, 但是這個commit可能是比較難記的,所以我們選擇一個好記憶的方式tag,例如v1.0 與某個commit綁定。

在Git中打標籤非常簡單,首先,切換到需要打標籤的分支上:
然後,敲命令git tag 就可以打一個新標籤:
git tag v1.0
可以用命令git tag查看所有標籤:
$ git tag
v1.0
默認標籤是打在最新提交的commit上的。有時候,如果忘了打標籤,比如,現在已經是週五了,但應該在週一打的標籤沒有打,怎麼辦?方法是找到歷史提交的commit id,然後打上就可以了:
git tag v0.9 f52c633

協同開發實例

項目負責人在遠程倉庫新建了倉庫,克隆到本地,新建dev分支並推送到遠程,那麼遠程倉庫也就有了dev分支。

在克隆結束倉庫之後,最好在本地這個倉庫使用本地 set 的方法設置 gitlab 用戶名和email(如果本機沒有GitHub的環境可以忽略)

git config —local user.name ‘XXX’ git config —local user.email ‘[email protected]

設置完之後可以使用git config --list 查看

設置完成之後將本地文件推到遠程dev

其他開發人員從遠程倉庫克隆倉庫到本地,在本地新建dev分支並直接切換到dev分支,然後將服務器上的dev版本使用git pull 命令拉下來,這樣本地就具有了一個dev的開發環境,之後就在dev上進行開發和push(同樣進行一下local的配置)

本地dev開發完成之後,push到遠程dev,如果和遠程有衝突,會出現下圖的情況

這時候我們需要將遠程的dev分支上的文件拉下來,git會提示我們什麼地方出了問題,git pull相當於自動的 fetch 和 merge 操作,會試圖自動將遠程庫合併入本地庫,在有衝突時再要求手動合併,git fetch 只是將遠程的文件拉下來,不會與本地的分支進行合併,而pull的操作時將遠程的代碼拉取下來並與本地的分支進行合併

git提示我們 這是dev分支.txt 有衝突,那麼我們就針對這個文件進行修改,其中HEAD代表當前的代碼,>>>>代表其他版本衝突的代碼,我們打開衝突的文件,將代碼衝突進行修改之後,將HEAD,>>>等標誌刪除之後重新進行提交即可。

修改完衝突之後進行add和commit,最後push到雲端沒有問題

常見問題的解決

  • git推送到遠程錯誤的文件怎麼處理

先回退到前一個版本:

git reset --hard HEAD^

然後強制推送當前這個版本到雲端

git push origin HEAD --force

  • 從遠程pull數據時候存在衝突怎麼解決?

出現這種問題的原因是遠程上已經存在的代碼和我們本地的代碼,因爲代碼衝突並不止是存在於向遠程推送時會發生。解決方式時根據提示,找到錯誤的文件,進行修改即可。要注意pull的意義就是爲了在本地進行代碼合併,來避免推送到遠程的時候出現代碼衝突。

 

 

轉摘,原文鏈接:https://www.jianshu.com/p/fb61299086b6

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章