Git &GitHub Git版本控制

Git版本控制

GIT介绍  

Git 是一个开源的分布式版本控制软件,用以有效、高速的处理从很小到很是大的项目版本管理。 Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发。Git 是根据GNU通用公共许可证版本2的条款分发的自由/免费软件,安装参见:http://git-scm.com/html

GitHub是一个基于Git的远程文件托管平台(同GitCafe、BitBucket和GitLab等)。git

Git自己彻底能够作到版本控制,但其全部内容以及版本记录只能保存在本机,若是想要将文件内容以及版本记录同时保存在远程,则须要结合GitHub来使用。使用场景:github

  • 无GitHub:在本地 .git 文件夹内维护历时文件
  • 有GitHub:在本地 .git 文件夹内维护历时文件,同时也将历时文件托管在远程仓库

其余:django

    集中式:远程服务器保存全部版本,用户客户端有某个版本
    分布式:远程服务器保存全部版本,用户客户端有全部版本服务器

GIT安装

安装:https://git-scm.com/downloadsapp

GIT基本使用

先进入你要管理的文件夹,例如咱们进入一个django项目文件夹分布式

打开GIT工具ide

git init 初始化,表示即将对当前文件夹进行版本控制工具

初始化后,会在当前目录自动建立 .git 文件夹,该文件是Git中最重要的文件夹,由于Git相关文件以及版本都将保存在该文件夹中,有了它,妈妈不再用担忧我好多文件来记录版本了,经过Git命令能够将全部版本保存在 .git 文件中post

git status  查看Git当前状态,如:那些文件被修改过、那些文件还未提交到版本库等

上图中红色的文件就是还未管理的文件

git add .  git add 文件名,将指定文件添加到版本库的暂存状态

添加完成后再次查看状态git status

能够看到这些文件都变绿了,都被管理起来了

git commit -m "描述信息"  将暂存区的文件提交到版本库的分支

注意:执行git commit 命令时,可能会提示进行用户和邮箱的配置,该配置用于记录当前版本由那个用户提交

  • git config --local user.name 'xxx'
  • git config --local user.email 'you@example.com'

提交完成后再次查看状态git status

发现当前工做目录已经空了,这时若是对一个文件进行修改,再查看

会发现该文件又出现了,此时能够再次提交

这样咱们就又了两个版本了,如何查看呢

git log 查看提交记录,即:历史版本记录

 能够看到每个版本都对应一段字符串,若是要回滚到第一次提交

git reset --hard daf67abd92c4425f61575200da54b56d8978b380

这时再查看历史记录git log

发现第一次修改的版本没有了,要如何找到呢

git reflog

切换回第一次修改

代码开发到一半,须要修改前一个版本的bug

有时候当咱们正在开发时,可能上一个版本出现了bug,须要紧急修复,这时该怎么办呢,这里有两种方式

方式一:使用git stash

咱们可使用git stash命令,这样咱们写了一半的代码就会被保存到一个暂存区域,而后代码会回滚到咱们修改前的版本,也就是有bug的版本,咱们就能够进行bug修复了,修复完bug后,咱们进行提交

提交完成后咱们须要回到咱们以前开发了一半的状态继续进行开发,这时须要执行git stash pop将以前开发了一半的内容从暂存区再次拿到工做区进行开发

特别的:执行 git stash pop 命令时,可能会遇到冲突,由于在紧急修复bug的代码和经过stash存储在“某个地方”的代码会有重合部分,因此执行 git stash pop 时候就会出现冲突,有冲突解决冲突便可

复制代码
a. 原来内容:
    from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): return HttpResponse('非洲专区') b. 开发到一半直播功能: from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): return HttpResponse('非洲专区') def live(request): print('开发到一半') return HttpResponse('....') c. 执行git stash,回到当前版本未修改状态: from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): return HttpResponse('非洲专区') d. 修复Bug并提交: from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): return HttpResponse('非洲xxxxx专区') e. 继续开发直播功能 git stash pop,此时会出现冲突: MacBook-Pro-4:pondo wupeiqi$ git stash pop Auto-merging app01/views.py CONFLICT (content): Merge conflict in app01/views.py 表示app01/views.py存在冲突须要解决,此时文件内容为: from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): <<<<<<< Updated upstream: # 修复Bug时更改的内容 return HttpResponse('非洲xxxx区') ======= # 修复Bug前正在开发新功能时的内容 return HttpResponse('非洲专区') def live(request): print('刚开发到一半') return HttpResponse('直播功能') >>>>>>> Stashed changes 须要自行解决冲突,而后继续开发,如: from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): return HttpResponse('非洲xxxx区') def live(request): print('刚开发到一半') return HttpResponse('直播功能')
复制代码

git stash其它相关命令

git stash             将当前工做区全部修改过的内容存储到“某个地方”,将工做区还原到当前版本未修改过的状态
git stash list        查看“某个地方”存储的全部记录
git stash clear     清空“某个地方”
git stash pop       将第一个记录从“某个地方”从新拿到工做区(可能有冲突)
git stash apply     编号, 将指定编号记录从“某个地方”从新拿到工做区(可能有冲突) 
git stash drop      编号,删除指定编号的记录

方式二:使用分支

分支学习:branch称为分支,默认仅有一个名为master的分支。通常开发新功能流程为:开发新功能时会在分支dev上进行,开发完毕后再合并到master分支

 咱们要开发时通常要先建立一个dev分支,并在dev分支上进行开发,master分支上通常放咱们开发完成的代码

  • git branch 分支名称            建立分支
  • git checkout 分支名称          切换分支
  • git branch -m 分支名称         建立并切换到指定分支
  • git branch                    查看全部分支
  • git branch -d 分支名称         删除分支
  • git merge 分支名称             将指定分支合并到当前分支

假如咱们如今正在dev分支上开发,忽然master分支上的前一个版本出现了bug,须要紧急修复咱们须要进行以下操做

复制代码
dev(开发)

当要紧急修复bug了
    a. [dev]将 dev 中如今正在开发的功能提交到dev
        git add .
        git commit -m 'xxx'
        
    b. 切换回主分支
        git checkout master 
    
    c. 建立并切换到bug分支
        git branch bug 
        git checkout bug 
        在bug分支上进行修复....
        git add .
        git commit -m 'xxx'
        
    d. git checkout master 将修复好的bug分支合并到主分支
        git merge bug 
        
        git branch -d bug  删除bug分支
复制代码

git merge 时也可能会出现冲突,解决冲突的方式上述stash相同,即:找到冲突文件,手动修改冲突并提交,此处再也不敖述

git rebase

git rebase也是用来合并的,只是和git merge有一点小区别,git merge合并的提交记录仍是两条线,而git rebase会将提交记录合并到一条主线

git rebase  合并+将提交记录合并到一条主线=> 提交记录整洁

若是产生冲突:
    解决完冲突后
    git rebase --skip

远程git仓库

上面咱们使用git都是将全部的内容存在本地,若是咱们既在公司写代码,回了家也要写呢,这时咱们就须要一个远程的仓库,将咱们的代码保存在这个远程仓库中

GitHub,一个基于Git实现的代码托管的平台,能够将内容以及版本记录在远程也保存一份,这样就不用U盘咯(相似于云盘)。PS: 相似GitHub的产品还有许多,如:GitLab、Bitbucket、码云等

基于GitHub实现代码托管,须要一下步骤:

  • 注册GitHub
  • 建立仓库,建立完仓库后会有一个URL代指该仓库,如:

  • git能够是用该URL进行向远程推送版本信息或获取版本信息

这样咱们就能够在家和在公司都进行开发了,具体步骤

复制代码
a. 注册帐户 + 建立项目 + 拷贝地址 https://gitee.com/wupeiqi/xianglong.git

b. 家,本地代码推送远程
        cd 项目目录
        git remote add origin https://gitee.com/wupeiqi/xianglong.git   给远程地址建立一个别名origin,这个别名能够任意写
        
        git push origin master    将本地内容推送到远程的master分支
        git push origin dev       将本地内容推送到远程的dev分支
        
        继续写代码
        git add . 
        git commit -m '提交记录'
        git push origin dev 
c. 第一次公司
    下载代码
        git clone https://gitee.com/wupeiqi/xianglong.git    适合在一个空目录执行,这句命令就至关于下面的好几个命令
        或
        建立目录 
        cd 目录 
        git init 
        git remote add origin https://gitee.com/wupeiqi/xianglong.git
        git pull origin master
        
        
    建立dev分支
        git checkout dev 
        git pull origin dev 
        
        
        继续写代码
        git add . 
        git commit -m '提交记录'
        git push origin dev 
d. 回家 
    拉代码:
        git pull origin dev 
        
    继续写:
        
        继续写代码
        git add . 
        git commit -m '提交记录'
        git push origin dev 
复制代码

久而久之,将Git和GitHub结合使用作到避免电脑损坏形成数据丢失以及多地开发的问题,上文执行过程当中执行 【git pull origin 分支】命令等同于【git fetch origin 分支】+ 【git merge origin/分支】,而且在执行过程当中可能会出现冲突,缘由是因为本地代码和获取的最新代码有重合部分,那么就须要本身手动解决冲忽然后再继续开发

协同开发

以前咱们都是一我的在作开发,如今业务变复杂了,须要多人协同开发了,该怎么办呢

多人协同开发:每一个人建立一个分支
master 
dev 
    - kouxinlong
    - heng 

咱们能够在dev下每人再建立一个分支,每一个人在本身的分支中开发,开发完一个功能后再合并到dev分支,固然在合并以前咱们也能够进行检查,能够再dev再建一个review分支

复制代码
公司是否作代码的review?谁来作?怎么作?
master 
dev 
    - review(组长作代码review)
    - kouxinlong
    - heng 
通常:小功能合并;1/2/3
复制代码

review完没有问题的代码再合并到dev分支上

github中如何和别人一块儿开发

  • 合做者,将其余用户添加到仓库合做者中以后,该用户就具备向当前仓库提交代码。
  • 组织,建立一个组织,而后再该组织下能够建立多个项目,组内成员能够向组内全部项目提交代码。PS:也能够对某个项目指定合做者

协同开发命令和以上步骤相似,此处就再也不从新写代码,而是使用文件描述三人协同开发整个过程。

  • 建立程序
    • 用户A建立程序,提交到GitHub
    • 用户B克隆项目
    • 用户C克隆项目
  • 开发功能
    • 用户A开发功能1
    • 用户B开发功能2
    • 用户C开发功能3
  • 提交
    • 用户A提交功能1,并push(A用户手速快,先提交。)
    • 用户B提交功能2,没法push,由于GitHub上已经有其余人提交的新代码。
      解决方法:从GitHub上获取最新代码并合并到本地,提交本身开发的功能2。
    • 用户C提交功能3,没法push,没法提交,由于GitHub上已经有其余人提交的新代码。
      解决方法:从GitHub上获取最新代码并合并到本地,提交本身开发的功能3。
  • 获取最新代码
    • 用户A获取最新代码
    • 用户B获取最新代码
    • 用户C获取最新代码

给别人的代码提意见 

从上面咱们知道要想修改别人的代码须要成为别人的合做者,可是有些牛逼的代码是不会让你成为合做者的,那么咱们要怎么作呢

找到想搞的项目,fork一下,而后这个项目就在本身仓库出现了

从本身仓库获取代码并进行编辑提交

建立并提交一个pull request,而后等待原做者是否赞成这个pull request,若是赞成那么在做者的源代码中就推出现我提交的功能

.gitignore 文件

建立 .gitignore 文件,编写git忽略哪些文件

复制代码
以斜杠“/”开头表示目录;

以星号“*”通配多个字符;

以问号“?”通配单个字符

以方括号“[]”包含单个字符的匹配列表;

以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;
复制代码

当咱们在github上建立项目时能够根据语言自动生成ignore文件

相关文章
相关标签/搜索