zoukankan      html  css  js  c++  java
  • Git &GitHub

    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分支
    复制代码

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

  • 相关阅读:
    生产者消费者问题 一个生产者 两个消费者 4个缓冲区 生产10个产品
    三个线程交替数数 数到100
    c++ 字符串去重
    Java中一个方法只被一个线程调用一次
    GEF开发eclipse插件,多页编辑器实现delete功能
    python-arp 被动信息收集
    ssrf
    TCP
    xxe
    越权
  • 原文地址:https://www.cnblogs.com/QQ279366/p/8963547.html
Copyright © 2011-2022 走看看