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

相关文章
相关标签/搜索