Git版本控制

GIT介绍

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

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

Git本身完全可以做到版本控制,但其所有内容以及版本记录只能保存在本机,如果想要将文件内容以及版本记录同时保存在远程,则需要结合GitHub来使用。使用场景:

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

其他:

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

GIT安装

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

GIT基本使用

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

打开GIT工具

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

初始化后,会在当前目录自动创建 .git 文件夹,该文件是Git中最重要的文件夹,因为Git相关文件以及版本都将保存在该文件夹中,有了它,妈妈再也不用担心我好多文件来记录版本了,通过Git命令可以将所有版本保存在 .git 文件中

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分支
View Code

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文件

posted @ 2018-05-07 16:47  无名指zZ  阅读(198)  评论(0)    收藏  举报