1. 程式人生 > >Docker模擬多人協作進行Git操作

Docker模擬多人協作進行Git操作

git dcoker laravel

今天我們利用Docker模擬出兩個終端,來進行git提交操作

開始前的準備

1.安裝docker應用,命令行輸入docker -v

技術分享

如果出現上面的提示就說明docker下載成功了!然後讓我們啟動docker服務

service docker start

接下來我們要拉取Git鏡像包,我這裏使用的是阿裏雲鏡像

git clone docker pull registry.cn-hangzhou.aliyuncs.com/kancloud/git

技術分享

下載成功我們來啟動三個容器

docker run -it --name yi -d registry.cn-hangzhou.aliyuncs.com/kancloud/git:latest /bin/bash
docker run -it --name er -d registry.cn-hangzhou.aliyuncs.com/kancloud/git:latest /bin/bash
docker run -it --name san -d registry.cn-hangzhou.aliyuncs.com/kancloud/git:latest /bin/bash

然後用 docker ps 來查看我們正在運行中的容器

技術分享

開啟三個終端分別進入三個容器內

docker exec -it [容器的ID] /bin/bash

技術分享

現在我們就有三個終端了!


一、GItHub

在github上註冊賬號,創建一個庫(接下來為了區分我們把github上面的這個庫叫做遠程倉庫),創建之後呢,因為github號召大家代碼開源,所以你的代碼所有人都可以看到,但是並不代表誰都可以向你的遠程庫裏面提交代碼,在這裏安全配置是通過id_rsa.pub來進行控制的,如何獲取id_rsa.pub在這裏我們就不過多介紹了,大家可以看看我的這篇博客

http://blog.csdn.net/li_haijiang/article/details/75668343

在分別獲取id_rsa.pub後我們要把他們填入github中,如圖所示
1.點擊用戶頭像,在下拉列表中選擇settings
2.在左邊選擇SSH and GPG keys
3.然後再右邊就可以看到New SSH key
4.把我們獲得id_rsa.pub填入第二個輸入框,在第一個框裏填入標識名

技術分享

我們把遠程倉庫起名為itxdl,讓我們在客戶終端看看是否能連通遠程倉庫吧

首先在yi裏面進行操作

#後面的這個地址是github給出來的地址git clone [email protected]:lihaijiang123/itxdl.git

技術分享

下載成功後我們來查看一個,可以發現itxdl這個倉庫已經被我們拉下來了,進入庫裏查看裏面的文件,就是github上創建的庫

技術分享

成功!

二、本地倉庫的提交與撤回

通過git init命令把這個目錄變成Git可以管理的倉庫,我們剛剛拉下來的itxdl庫已經是一個可被git管理的倉庫了,所以不需要再git init

下面我們拉入一個laravel框架到宿主機上,然後推送到github上

#宿主git add *
git commit -m "all clean laravel"git push origin master

註意 : git上傳.env文件是不會上傳的

終端yi的文件夾中下載下來

git clone [email protected]:lihaijiang123/itxdl.git

可以看到itxdl庫已經克隆到我們本地文件夾

技術分享
進入文件夾,可以發現我們的文件夾中就有了laravel這個框架的全部內容

技術分享

我們先進行本地操作

首先我們新建一個User控制器,在裏面新建index方法,查看一下

技術分享

第一步:使用命令 git add UserController.php添加到暫存區裏面去。如下:

技術分享

現在我們已經提交了一個UserController.php文件到本地倉庫了,我們下面可以通過命令git status來查看是否還有文件未提交,如下:

技術分享

說明沒有任何文件未提交,但是我現在繼續來改下UserController.php內容,比如我在下面添加show方法,使用git status來查看下結果,如下:

技術分享

上面的命令告訴我們 readme.txt文件已被修改,但是未被提交的修改。

接下來我想看下readme.txt文件到底改了什麽內容,如何查看呢?可以使用如下命令:

git diff UserController.php

技術分享

如上可以看到,UserController控制器裏面新增了一個show方法;

知道了對文件做了什麽修改後,我們可以放心的提交到倉庫了,提交修改和提交文件是一樣的2步

git add UserController.phpgit commit -m "UserController新增show方法"

版本退回

現在我繼續對UserController.php進行修改,新建add方法

技術分享

執行提交

git add UserController.phpgit commit -m "UserController.php增加add方法"

那麽我現在想查看下歷史記錄,如何查呢?我們現在可以使用命令 git log 演示如下所示:

git log

技術分享

git log命令顯示從最近到最遠的顯示日誌,如果嫌上面顯示的信息太多的話,我們可以使用命令 git log –pretty=oneline 演示如下:

技術分享

如果使用版本回退操作,我想把當前的版本回退到上一個版本
有兩種方法:

git reset --hard HEAD^

那麽如果要回退到上上個版本只需把HEAD^ 改成 HEAD^^ 以此類推。那如果要回退到前100個版本的話,使用上面的方法肯定不方便,我們可以使用下面的簡便命令操作:git reset –hard HEAD~100 即可。

未回退之前的UserController.php內容如下:

技術分享

git reset hard -- HEAD^

技術分享

可以看到,內容已經回退到上一個版本了。可以繼續使用git log 來查看下歷史記錄信息

技術分享

我們看到 新建add方法內容沒有了,但是現在我又想回退到最新的版本,如:有add方法的內容要如何恢復呢?我們可以通過版本號回退,使用命令方法如下:

git reset --hard 版本號

但是現在的問題假如我已經關掉過一次命令行或者增加add方法的版本號我並不知道呢?要如何知道增加add方法內容的版本號呢?可以通過如下命令即可獲取到版本號:

git reflog

技術分享

通過上面的顯示我們可以知道,增加add方法的版本號是fcb6553.我們現在可以命令

git reset --hard fcb6553

技術分享

修改一下add方法裏的內容 , 在我未提交之前,我發現添加i am a boy內容有誤,所以我得馬上恢復以前的版本,現在我可以有如下幾種方法可以做修改:

第一:如果我知道要刪掉那些內容的話,直接手動更改去掉那些需要的文件,然後add添加到暫存區,最後commit掉。

第二:我可以按以前的方法直接恢復到上一個版本。使用 git reset --hard HEAD^

但是現在我不想使用上面的2種方法,我想直接想使用撤銷命令該如何操作呢?首先在做撤銷之前,我們可以先用 git status 查看下當前的狀態。如下所示:

技術分享

這時Git會告訴你,git checkout -- file 可以丟棄工作區的修改,如下命令:

git checkout -- file

命令 git checkout -- UserController.php 意思就是,把UserController.php文件在工作區做的修改全部撤銷,這裏有2種情況,如下:

UserController.php修改後,還沒有放到暫存區,使用 撤銷修改就回到和版本庫一模一樣的狀態。
另外一種是UserController.php已經放入暫存區了,接著又作了修改,撤銷修改就回到添加暫存區後的狀態。

對於第二種情況,我想我們繼續做demo來看下,假如現在我對add方法添加一行 內容為111111111,我git add 增加到暫存區後,接著添加內容22222222,我想通過撤銷命令讓其回到暫存區後的狀態。操作如下

#恢復到沒有22222的狀態git checkout -- UserController.php

註意:命令git checkout -- file 中的 -- 很重要,如果沒有 -- 的話,那麽命令變成創建分支了。

刪除文件

假如我現在目錄添加一個文件TestController.php,然後提交,然後刪掉

git add TestController.phpgit commit -m "新增TestController控制器"rm TestController.php

只要沒有commit之前,如果我想在版本庫中恢復此文件如何操作呢?

可以使用如下命令 git checkout – b.txt,如下所示:

#放棄工作區裏的操作,恢復到上次提交後的樣子git checkout -- TestController.php

三、提交遠程倉庫

1.首先設置我們的身份

技術分享

獲取遠程庫的信息

當你從遠程庫克隆時候,實際上Git自動把本地的master分支和遠程的master分支對應起來了,並且遠程庫的默認名稱是origin。

要查看遠程庫的信息 使用 git remote
要查看遠程庫的詳細信息 使用 git remote –v

可以用git push推送到遠程倉庫,那麽我們就使用這個命令

技術分享

推送成功!這是我們到github上查看一下

技術分享

可以看到有三個控制器 succeed !


這時我們加入第二個終端 “er”

克隆github上的倉庫 ,保持終端er和終端yi的內容一致

git clone [email protected]:lihaijiang123/itxdl.git

然後回來終端yi繼續幹活,修改一下UserController.php後提交到遠程,這時終端er和github上的內容不一致了,我們在終端er修改UserController.php的內容後推送看看會怎麽樣呢

這裏git提示我們提交失敗,原因是遠程包含我所坐的操作,並且提示我可以先使用git pull ...然後在git push

技術分享

執行git pull後提示下載成功,但是合並有沖突,需要手動解決,解決的方法和分支管理中的 解決沖突完全一樣。解決後,提交,再push,我們查看一下UserController.php

技術分享

<<< HEAD是當前本地分支的指針
====下面的是遠程的分 , 手動解決沖突就好了

然後提交,推送

技術分享

成功!我們來github看一下

技術分享

ok,終端yi和終端er的沖突已經解決了

四、創建與合並分支

在版本後退裏,我們已經知道,每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,只有一條時間線,在Git裏,這個分支叫主分支,即master分支。HEAD嚴格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當前分支。

首先,我們來創建dev分支,然後切換到dev分支上。

//本地創建和遠程對應的分支git checkout -b 本地分支名 origin/遠程分支名//創建分支並切換單該分支上git checkout -b dev//查看分支git branch

技術分享

git branch查看分支,會列出所有的分支,當前分支前面會添加一個星號。然後我們在dev分支上繼續做demo,比如我們現在在TestController.php裏新建一個index方法,然後提交到本地倉庫

git branch
vim TsetController.phpgit add TestController.phpgit commit -m "Test控制器新建index方法"

PS : (如果想提交當前dev分支可以使用git push origin dev)

這時我們再切換回master分支,查看TestController.php文件,裏面並沒有index了控制器

git checkout master
cat TestController.php

因為當前不是分支dev,現在我們可以把dev分支上的內容合並到分支master上了,可以在master分支上,使用如下命令

git merge dev

技術分享

註意到上面的Fast-forward信息,Git告訴我們,這次合並是“快進模式”,也就是直接把master指向dev的當前提交,所以合並速度非常快。

合並完成後,我們可以接著刪除dev分支了

技術分享

分支沖突

當兩條分支對同一個文件同一個文本塊進行了不同的修改,並試圖合並時,Git不能自動合並的,稱為沖突(conflict),解決沖突需人手動修改,和上面說的兩個人解決沖突的方法是一樣的

分支管理策略

通常合並分支時,git一般使用”Fast forward”模式,在這種模式下,刪除分支後,會丟掉分支信息,現在我們來使用帶參數 --no-ff來禁用”Fast forward”模式。當不使用fast forward模式後,刪除的分支在git log中同樣可以查的到的

git merge --no-ff -m "註釋" dev

git log --graph --pretty=oneline --abbrev-commit

首先master主分支應該是非常穩定的,也就是用來發布新版本,一般情況下不允許在上面幹活,幹活一般情況下在新建的dev分支上幹活,幹完後,比如上要發布,或者說dev分支代碼穩定後可以合並到主分支master上來。

BUG分支

在開發中,會經常碰到bug問題,那麽有了bug就需要修復,在Git中,分支是很強大的,每個bug都可以通過一個臨時分支來修復,修復完成後,合並分支,然後將臨時的分支刪除掉。

比如我在開發中接到一個404 bug時候,我們可以創建一個404分支來修復它,但是,當前的dev分支上的工作還沒有提交.並不是我不想提交,而是工作進行到一半時候,我們還無法提交,比如我這個分支bug要2天完成,但是我issue-404 bug需要5個小時內完成。怎麽辦呢?還好,Git還提供了一個stash功能,可以把當前工作現場 ”隱藏起來”,等以後恢復現場後繼續工作。如下:

git statsh

現在我可以通過創建issue-404分支來修復bug了。

首先我們要確定在那個分支上修復bug,比如我現在是在主分支master上來修復的,現在我要在master分支上創建一個臨時分支,演示如下:

git checkout -b issue-404

修復完成後,切換到master分支上,並完成合並,最後刪除issue-404分支。

git checkout master
git merge --no-ff -m "合並404分支" issue-404git branch -d issue-404

然後在切換回dev分支,我們工作現場被保存到去哪裏呢?我們可以使用命令 git stash list來查看下

git stash list

那麽我們怎麽恢復工作區呢

//恢復不刪除git stash apply//刪除保存的內容git stash drop//另一種方法是 恢復的同時並刪除git stash pop

Git是幫助我們提高工作效率的,而不是讓我們因為他感覺到難的,git到這裏我們就介紹這麽多了,祝您工作愉快,下面給大家總結一下git的命令


技術分享

本文出自 “12920315” 博客,請務必保留此出處http://12930315.blog.51cto.com/12920315/1950909

Docker模擬多人協作進行Git操作