Github經理和員工開發


Git簡介

Git是目前世界上最先進的分布式版本控制系統

git的兩大特點:

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

 安裝

sudo apt-get install git

安裝成功后,運行如下命令

git

配置

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

修改為注冊github時的郵箱,填寫用戶名,要求組員的用戶名不能重復

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

git config --global user.name "zb"

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

 最后可以通過 git config -l 這個命令查看已配置的用戶名和郵箱信息

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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM