Github經理和員工開發

Git簡介

Git是目前世界上最早進的分佈式版本控制系統python

git的兩大特色:git

  • 版本控制:能夠解決多人同時開發的代碼問題,也能夠解決找回歷史代碼的問題
  • 分佈式:Git是分佈式版本控制系統,同一個Git倉庫,能夠分佈到不一樣的機器上。首先找一臺電腦充當服務器的角色,天天24小時開機,其餘每一個人都從這個「服務器」倉庫克隆一份到本身的電腦上,而且各自把各自的提交推送到服務器倉庫裏,也從服務器倉庫中拉取別人的提交。能夠本身搭建這臺服務器,也可使用GitHub網站

 安裝

sudo apt-get install git

安裝成功後,運行以下命令github

git

配置

在ubuntu的命令行中,修改某臺機器的git配置,在家目錄下:數據庫

修改成註冊github時的郵箱,填寫用戶名,要求組員的用戶名不能重複django

若是上述配置用戶名和郵箱不能用的話,可使用這種配置github用戶名和郵箱的方法 

git config --global user.name "zb"

git config --global user.email "1273844671@qq.com"

 最後能夠經過 git config -l 這個命令查看已配置的用戶名和郵箱信息ubuntu

git config -l

  

 

使用流程

在實際項目開發中,按照以下步驟使用git進行代碼管理瀏覽器

  • 1.項目經理在開發之初,建立好倉庫,上傳項目的框架、組員分支
  • 2.組員克隆項目框架,同步分支,按分工開發,在分支提交代碼
  • 3.在須要發佈時,項目經理將各分支合併到dev上,再合併到master上
  • git將代碼開發分紅了工做區、暫存區、倉庫區,爲了可以交換代碼還須要有服務器,通常使用github
  • git四部分的交互方式以下圖

建立

  • 在項目開始階段,須要由項目經理搭建項目框架,並上傳到倉庫
  • 以下操做都由項目經理完成

建立倉庫

註冊github帳戶,登陸後,點擊"start a project"緩存

在新頁面中,輸入項目的名稱django1,勾選'readme.md',點擊'create repository'服務器

添加成功後,轉到文件列表頁面,點擊'create new file'建立新文件框架

填寫文件名稱爲'.gitignore',代碼以下,表示項目中的pyc文件不須要被管理,由於這些文件代碼是根據py生成的

詳細的ignore文件能夠參考官方Python.gitignore文件

*.pyc
.idea/
migrations/

建立完成後,文件列表以下:

 

添加ssh帳戶

  • 若是某臺機器須要與github上的倉庫交互,那麼就要把這臺機器的ssh公鑰添加到這個github帳戶上
  • 點擊帳戶頭像後的下拉三角,選擇'settings'

點擊'SSH and GPG keys',添加ssh公鑰

生成git密鑰

刪除~/.ssh目錄,這裏存儲了舊的密鑰,沒有就不用刪除

rm -r .ssh

運行以下命令生成密鑰,本人沒寫,爲默認值

  • 在「圖標2」處能夠填寫保存密鑰的目錄
  • 在「圖標3」處能夠填寫密碼,若是填寫,通常爲項目的名稱,後續操做時會要求填寫此密碼
  • 公鑰名稱爲id_rsa.pub
  • 私鑰名稱爲id_rsa
ssh-keygen -t rsa -C "Github帳號,能夠是用戶名,也能夠是郵箱地址"
ssh-keygen -t rsa -C "1273844671@qq.com"

 

 

 

查看公鑰內容,複製此內容

cat id_rsa.pub

回到瀏覽器中,填寫標題,粘貼公鑰,點擊ADD SSH KEY

公鑰添加成功後,以下圖

克隆項目

在瀏覽器中點擊進入github首頁,再進入項目倉庫的頁面

複製git地址

 

在命令行中複製倉庫中的內容



git clone git地址 ,選擇的要是httts,會要填Github的用戶名和密碼,要是使用SSH則不會。
cd Desktop/

mkdir jiangshi/

cd jiangshi/

git clone https://github.com/zb14755456464/django1.git

cd bj_ttsx13/

  

 

有可能出現以下的錯誤,錯誤處理

  • 提示錯誤信息以下:
sign_and_send_pubkey: signing failed: agent refused operation

  

  • 錯誤緣由:在ssh帳戶中沒有加入新生成的密鑰
  • 解決:將密碼加入ssh帳戶
  • 逐條運行以下命令
eval "$(ssh-agent -s)"
ssh-add

 

建立項目分支

每一個員工開發期的代碼互不干擾,並行開發,則每人使用一條分支

項目開發中公用分支包括master、dev

  • 分支master用於發佈,默認分支,當須要發佈時將dev分支合併
  • 分支dev開發階段性的代碼合併,每一個階段的工做完成後須要進行一次,控制項目的進度
  • 成員分支用於每一個項目成員的代碼開發,實現不交叉,完成階段性的項目能夠和共用的dev分支進行合併。最後經理會用master分支發佈

 

建立分支,git branch 分支名稱

git branch dev

 

切換分支,git checkout 分支名稱

git checkout dev

將分支推送到服務器,git push origin 分支名稱,選擇的要是httts,會要填Github的用戶名和密碼,要是使用SSH則不會。

git push origin dev

  

將本地分支跟蹤服務器分支  git branch --set-upstream-to=origin/分支名稱 分支名稱.

主要的做用是:能夠知道本地的代碼,比服務器的新,仍是服務器的比本地的新,以及新幾個版本。通常是員工本身的代碼和本地的dev和並,在哪本地的dev分支和服務器的dev跟蹤。本身寫代碼的分支不用跟蹤。

git branch --set-upstream-to=origin/dev dev

  

建立並切換分支   git checkout -b 分支名稱

git checkout -b itcast

  

查看全部分支,當前分支前標記爲星*

git branch

  

刪除分支  

git branch -d 分支名稱
git branch -d dev

 

搭建項目框架

當前項目分支一共有3個,分別爲master、dev、itcast,當前在itcast分支上工做
在克隆的目錄下建立項目,使用django框架

經理能夠把項目共用的部分添加進去,如setting中的配置文件要連接的數據庫,靜態文件和上傳文件的配置,把csrf註銷等

將文件代碼添加到暫存區

git add ./

  

將暫存區提交到倉儲區

git commit -m '搭建框架'

 

以上兩步運行效果以下圖

 

上傳分支

把經理的分支上傳到服務器

git push origin itcast

這時候除了經理的分支,有項目框架的代碼 ttsx 其他上網都沒有,以下圖所示

dev 分支沒有項目框架的代碼 ttsx

在這個階段,經理要作的就是把itcast的分支合併到共用的dev分支,這樣全部的分支就能夠從dev分支上取代碼.

先切換到dev分支

git checkout dev

 

將itcast分支的內容合併到當前的分支dev

git merge itcast

  

把dev分支的內容推送到服務器

git push origin dev

 

這時服務器的分支dev就有項目ttsx的代碼了

 

員工-開發

項目經理建立完成倉庫後,接下來項目組成員就要進行開發工做了

如下操做由每一個組員獨自完成

添加ssh帳戶

  • 這一步是組員在ubuntu中生成ssh密鑰,而後交給項目經理添加到github中
  • 在ubuntu的命令行中,修改某臺機器的git配置

修改成註冊github時的郵箱,填寫用戶名,要求組員的用戶名不能重複

生成git密鑰

刪除~/.ssh目錄,這裏存儲了舊的密鑰

rm -r .ssh

運行以下命令生成密鑰

  • 在「圖標2」處能夠填寫保存密鑰的目錄
  • 在「圖標3」處能夠填寫密碼,若是填寫,通常爲項目的名稱,後續操做時會要求填寫此密碼
  • 公鑰名稱爲id_rsa.pub
  • 私鑰名稱爲id_rsa
ssh-keygen -t rsa -C "Github帳號,能夠是用戶名,也能夠是郵箱地址"

  

查看公鑰內容,複製此內容

cat id_rsa.pub

  

將複製的公鑰發給項目經理,等項目經理在github上添加後,會將項目地址下發,而後就能夠參與到項目開發中進行後續操做

本地克隆

在克隆出來的目錄下,隱藏目錄.git存儲了服務器、分支、文件變動等信息

在這裏我是另外的開了一個終端模擬員工

根據項目經理提供的地址,如「git@github.com:bossliu2016/django1.git」,從github上將項目克隆到本地,默認對應的是master分支內容

克隆下來git clone 項目地址

git clone git@github.com:bossliu2016/django1.git

克隆後以下圖

之因此沒有ttsx的項目那是由於本地的分支默認只有一個master分支,

git branch 

  

將github上的dev分支同步到本地,由於開發過程當中,全部組員都向這個分支上提交階段性代碼,並從這個分支獲取最新代碼,

意思就是根據遠程的dev分支建立本地的dev分支

git checkout -b dev origin/dev

  

員工建立一個本身的分支用於開發,這是在dev分支上建立的,他就擁有dev分支上的內容,而master分支上就沒有ttsx的項目

git checkout -b zj

  

添加

 

我是在經理(jiangshi)本身用的分支上itcast作的增長,在pycharm中寫一些東西以下圖,查看增長的信息以下:

 

 

 

 

git checkout itcast

git branch

git status

  

  

 

把工做區增長的內容提交到緩存區,完成一個小的單元測試能夠git add ./ 一次,能夠屢次執行 git add ./ 操做.

git add ./

把緩存區的內容提交到版本庫中,這裏要說明一下,不要頻繁的提交,而是完成一個業務提交一次,這是由於不讓版本庫的日誌過多,後期找的麻煩.

git commit -m '建立用戶應用'

 可使用git status 命令查看狀態

文件刪除

首先在物理上把文件給刪除了,而後執行git rm 刪除文件的路徑,主要是告訴版本庫,最後執行 git commit -m '刪除urls' 提交就好了.版本庫就會保存這個操做

在pycahrm中刪除urls以下圖'

能夠用git status 查看當前的狀態

git status

  

版本庫中不知道已經把它給刪除了,從這個版本中刪除

git rm ttsx/ttsx/urls.py 
git status

  

git commit -m '刪除urls'
git status

  

撤銷

把刪除的東西給恢復過來,只須要回到刪除以前的版本就好了,經過 git reser HEAD 或版本號

歷史版本的名稱:在Git中,用HEAD表示當前版本,版本號爲c27e22e,也就是最新的提交,上一個版本就是HEAD^,再上一個版本就是HEAD^^,固然往上100個版本寫100個^確定就麻煩了,提供了一種簡寫方式爲HEAD~100

查看倉庫區的歷史操做,

git log
git reflog

  

git reset HEAD^

把倉庫區的操做區的記錄回到了暫存區的記錄

git status

  

 git checkout -- ttsx/ttsx/urls.py
 git status

  

恢復成功,ru下圖

對比

對比工做區和倉庫區中某版本某文件的不一樣

git diff HEAD -- 文件名
拿當前的版本庫和工做區中的urls進行對比,一致則什麼都沒有
git diff HEAD -- ttsx/ttsx/urls.py

  在這裏我刪除urls的一條路徑在對比

git diff HEAD -- ttsx/ttsx/urls.py

  

上面的紅色表示當前的版本庫獨有這條路徑,而當前的工做區沒有這條路徑。,白色的內容表示的是共有的

在urls中在增長一條信息以下,在進行比較,這是當前的版本庫和工做區中的數據就各有各的不一樣

git diff HEAD -- ttsx/ttsx/urls.py

  

git add ./

git commit -m '建立商品應用'
#提交後在比較就一致了

git diff HEAD -- ttsx/ttsx/urls.py

git reflog

  

拿用戶的版本和商品的版本中的urls進行對比

git diff d822f0a ce0bfe3 -- ttsx/ttsx/urls.py

  

 

回退

  • 回退歷史版本到暫存區

回到建立用戶的版本

git reset ce0bfe3 

git status 

git checkout -- ttsx/ttsx/urls.py

git status 

  

對比的目的是爲了回退,對比兩個版本有什麼差別,決定要不要回退.

本地與服務器

把代碼提交到服務器,

git branch 

git push origin itcast 

  

從本地獲取服務器上的代碼

git branch
git pull 

當前是哪一個分支,就會從服務器上去拿那個分支的代碼

Debug分支

  • 在項目的正常開發過程當中,以前發佈過的版本可能很會出bug,這時就須要停下來如今的開發任務,先去修改bug,完成後再回來繼續開發任務
  • git中stash提供了保存現場的功能,能夠把當前工做區、暫存區中的內容不須要提交而保存下來,轉而去作bug修復,完成後再恢復現場,繼續開發工做

一個員工正在開發,還沒完成,出現了一個bug要解決,下面模擬在開發把一條url註釋

工做區並非乾淨的,由於功能沒作完也不能提交

git status

  

解決方法是:

  保存現場

git stash
git status

  

在master分支上出bug了,切換到master分支,注意不要直接在master 分支上作修改,要基於master分支新建一個分支如but001.

 

git checkout master 

git checkout -b but001

  在 but001分支上修改了README,隨便寫了幾句話,就當BUG解決了

git status

 

git add ./
git commit -m '修改說明的bug'

修改好bug後,切換到master分支上合併修改bug的分支

git checkout master

執行合併前,從服務器上獲取一下服務器上的master 代碼有可能別人也會在上面修改bug 

git pull

  

這個合併只在修改bug的時候用,由於git 合併的時候默認的是採用 fast forward分支,它自己的記錄發生在記錄在本身的生上,不會記錄在合併後的分支上。

由於在開發過程當中,遇到的bug多,不會保留那麼多的分支,會把bug後的分支刪除,因此會採用 no fast forward合併.

git merge --no-ff -m '修改說明bug' but001

  

推送到服務器

git push origin master 

  

刪除臨時分支bug001

git branch -d but001

  .

切換回工做分支itcast

git checkout itcast 

  

恢復現場,能夠繼續開發.

git stash pop  

切換到 itcast分支

git checkout itcast

把上面模擬的一條url註釋改過來

 

合併員工開發的代碼

這是在另外一個終端上,另外一個員工zj,寫的是商品模塊,

git add ./
git commit -m '開發商品應用'

  

首先把jiangshi的代碼合併到dev分支上

git status

git branch

git checkout dev 

#爲了保持本地的代碼和服務器上的一致
git pull

git merge itcast 

 # 看本地有沒有要提交的 

    git status

  

git push origin dev

  

把員工zj的代碼合併到dev分支上

git branch
 
git checkout dev

# 它從服務器上獲取代碼,就會把員工jiangsji的代碼user獲取過來

git pull

  

合併本身的分支zj, 產生了衝突

git merge zj

  

上面產生的衝突的主要緣由是當前的版本包括user而合併來的分支版本不包括,合併來的分支版本包括goos而當前的版本不包括。

兩個員工相互協商後的解決以下:

協商後員工zj能夠提交修改後的代碼

git add ./

git commit -m '解決url衝突'

  把最新的代碼提交

git push origin dev

  

 

合併完成後每一個人員工都獲取最新的代碼

jiangshi在dev分支上獲取最新的代碼

git checkout dev

git pull

  把最新的代碼合併到本身的itcast分支

git checkout itcast

git merge dev

  

jiangshi的最新代碼既有本身的user也有zj的goods

 

員工zj也要獲取最新的代碼

git checkout dev

git pull

git checkout zj

git merge dev

  

員工zj的最新代碼既有本身的good也有jiangshi的users

相關文章
相關標籤/搜索