zoukankan      html  css  js  c++  java
  • git基本操作长期维护

    ###############    初识git    ##############

    """
    git初识:
    1,git是什么?git是一个帮助用户版本控制的软件,
    2,git和github,没有关系
    3,早期都是使用svn,现在基本都是使用git来做,
    4,git每一个版本不是完全复制的,而且只是记录改动的部分,这样可以节省空间,
    
    git还是应该应该使用一个故事场景来学习,这样更加的印象深刻,否则全是理论就容易忘记
    你写了代码,怎么使用git把代码管理起来?
    1,要下载一个Windows版本,进入git官网下载
    2,然后进入项目的根目录,右键,点击git bash here,还有git gui,不使用桌面版,都是用命令,
    3,执行命令:git init,这样就是让git帮你管理起来这个文件夹了,会在项目的根目录创建一个.git文件夹,
    以后当前的版本都会保存到这个git文件里面去,
    4,执行命令:git status,会出现红色的文件夹,这意味着,这些文件夹还没有被git管理起来,
    
    5,执行命令:git add manage.py ,会发现这个manage.py文件被管理了,
    现在你再去git status,其他文件夹还是红色的还没有管理,manage.py文件已经不是红色了,
    执行命令:git add .   ,这就是管理所有的文件,就会全变绿了,
    但是现在没有真正的被提交,还需要下一步,
    
    6,执行命令:git commit -m '创建第一个版本',这就是提交了,后面是版本的提交注释,这是复制了一份到git文件夹里面了,
    执行命令:git config --global user.email "1910583523@qq.com"
    执行命令:git config --global user.name "andy",第一次提交,这是告诉git,是谁提交的,方便追溯,
    执行命令:git status,这个时候就没有东西了,就是都提交了,都把文件管理起来了,
    注意:提交版本的描述信息,尽量写的详细,否则别人回滚的时候,不确定是不是要回滚,
    
    7,修改文件,执行命令,git status,就会发现这个文件变红了,这是因为文件变动了,
    执行命令:git add . ,
    执行命令:git commit -m '创建第二个版本',必须要执行这两个命令,然后就会发现这个文件都管理了,git status 就没有文件了,
    
    8,执行命令:git log,就会把所有的提交日志显示出来,会有commit id,还有提交人和邮箱,时间,提交注释,
    
    9,假设现在上线了,然后发现第二次提交的内容没有审核通过,就需要回滚,
    执行命令:git reset --hard 需要回滚的版本号,这样就回滚了,
    
    10,假设现在发现第二次提交的内容审核通过了,就可以把第二次的提交了,
    执行命令:git reflog,这是查看所有的版本,
    执行命令:git reset --hard 需要回滚的版本号,这样就再次回滚到了第二个版本了,
    
    11,如果是修改了之后还没有git add,git status,这个时候文件是红色的了,但是我现在想要取消这个修改,
    执行命令, git checkout +文件名 ,这就是取消修改了,
    
    上面的这种管理还是在本地管理的,
    """

    ###############    git版本控制----stash,branch,    ##############

    """
    场景:
    你的项目上线了,现在开发第二个版本,这个时候线上第一个版本出问题了,现在必须马上修改,如何操作?
    这个时候第二个版本已经开发了很多了,现在git status已经有很多的红色文件了,怎么办?
    第二个版本的功能肯定不能推上去,而第一个版本有bug要修改,怎么办?
    
    操作:
    1,执行命令:git stash,这是找到所有红色的文件,也就是被修改的文件,把它们拿走,临时存到一个地方了,
    这样git status,就没有红色文件了,并且你开发的内容也不见了,被存到了另一个地方了,
    
    2,然后修改bug,然后提交,这个bug就解决了,然后你git add .   git commit ...
    我需要继续开发,怎么开发?
    
    3,执行命令:git stash pop,这样就回来了,并且我们开发的内容回来,而且我们修改的bug也已经修改了,就可以继续开发了,
    
    会出现的问题:
    你在没有删除日韩的之后,stash了,这个时候保存的是有日韩的,然后删除了之后,pop的时候出现了合并,
    合并的时候自动帮我们检测了,来做这个事情,这就是一个自动合并的功能,这种是能合并的,但是有些情况是合并不了的,
    
    冲突:
    假设你修改bug的时候,如果你不是删除日韩,然后新增了一个在线,这个时候提交修改的内容,
    然后回来git stash pop,这个时候就会报错了,冲突了,
    CONFLICT (content): Merge conflict in api/tests.py
    
    所以pop的时候有两种情况,一种是可以自动合并的,一种是有冲突的,
    
    什么时候自动合并?什么时候有冲突了呢?
    两个用户修改了同一个文件的同一块区域,git会报告内容冲突。
    我们常见的都是这种,后面的解决办法也主要针对这种冲突。
    
    这种冲突了怎么办?
    就要手动解决冲突,没有好的解决方法,但是如果有两千个冲突怎么办?
    冲突要会看,==========,这是一个分割线,上面是之前的,下面是你后面写的,
    然后手动解决了冲突,就可以提交代码了,commit,
    
    记住:如果你正在写代码,然后线上有bug,你要去修改,你就需要git stash(这个只会保存红色的文件),
    然后修改之后回来的时候git stash pop,这个时候可能会有冲突,
    有了冲突不要着急,如果有两千个,也不要着急,有一个软件,可以把两千个都找到,
    
    总结:git stash的用法:
    1,git stash,这是放入一个缓存中,
    2,git stash pop,这是把第一个暂存的拿出来,
    3,git stash list,所有的暂存的记录,默认是拿回来第一个,
    4,git stash apply 编号,将指定编号的记录重新拿到工作区(可能会有冲突,)
    5,git stash drop 编号,删除指定编号的记录,
    常用的就是前两个,
    
    #############################################################
    
    上面是方式一,解决方法,
    这种不太好,公司里面常用另一个方法,就是branch的东西,
    下面讲解方式二,
    
    场景:
    现在开发一个功能,然后开发到一半的时候,需要马上上一个功能,这个时候怎么办?
    
    我们使用分支的方式,
    1,执行命令:git branch dev,这是创建了一个分支,而且是copy了一份代码,
    这个时候这个分支和master分支是一样的,以后在代码开发的功能在dev分支做,
    执行命令:git branch,这是查看分支,
    执行命令:git checkout dev,这是切换分支,
    
    2,这样你就有两套代码了,然后你就可以在dev开发新的功能,在dev提交的代码是不会影响到master,
    然后你切换到master,你会发现代码是没有变化的,也就是dev的代码没有影响到master
    
    3,现在dev的功能开发到了一半,然后需要马上上线一个功能:日韩,可以在master分支中增加一个日韩,
    然后直接提交了,但是一般我们不直接在master分支提交代码,因为风险太大了,
    所以规定就是不能在master分支修改
    
    4,最好的方案是创建一个分支,
    执行命令:git checkout -b rh,然后这个分支是和master分支一样的,在这个分支修改bug,新增紧急的功能,新增之后,比较代码
    这个时候有三套代码了,1个是master,1个是dev有新开发的功能,1个是rh,这有我们新增的功能,
    
    5,现在要合并代码了,
    rh分支和mater分支,先回到master,
    执行命令:git merge rh,这一步就是把代码合并到master了,
    然后在master分支就有rh的提交日志log了,
    然后删除这个分支,
    执行命令:git branch -d rh,这样就把rh分支删除了,
    所以面试问你如果有线上bug怎么办?就是创建一个分支,然后修改,提交,合并,删除新建的分支,
    
    6,然后现在我开始开发了,切换到dev分支,git checkout dev,
    然后可以继续开发了, 但是这个分支是没有修改的bug的,这个要记住,你可以现在合并,也可以后面合并,现在你只是写你的功能就行了,
    但是一般是后面合并,因为是协同开发,你改了bug,其他人可能不知道,
    
    7,然后现在继续开发,新的功能开发完了, 然后在dev分支提交,
    现在需要上线新功能,就要把dev和master分支合并了,
    切换到master分支,
    执行命令:git merge dev,这个时候报错了,因为有的代码dev分支没有,而dev分支有的master分支没有,怎么办?
    
    8,这个时候没有冲突,但是弹出需要一个合并记录,然后输入你的这次合并的注释,然后保存退出,就可以了,合并成功了,
    这个时候看master的log是所有的都有的,
    
    9,但是如果是修改的内容是同一行,会冲突,冲突了就要手动修改了,
    
    公司里面修改bug,必须要创建bug分支,处理之后合并master分支,master永远保持正确的代码,然后删除bug分支,
    stash就是个人使用的,
    
    """

     ###############    git版本控制之github代码管理    ##############

    """
    
    git版本控制之github代码管理,
    
    1,github一个代码托管的网站,最有名的就是github,这是全球最大的,中国用码云,
    做代码托管,你放的代码所有人都能看到,但是你要别人不能看要交钱,github被微软收购了,
    也可以自己创建一个代码托管的网站:gitlab,这是公司自己搭建的,命令都一样用,公司会给你一个账号
    github就像是一个云,和git结合的很好,
    
    2,现在你需要注册一个git账号,登陆之后如果你有项目都显示在左边,
    
    3,一开始是不能提交代码的,你需要新建一个代码仓库,这个仓库名字最好和本地的项目名称一致,
    创建的时候主要是仓库名称和描述,
    步骤:
    在本地的git上,
    git remote add origin https://github.com/liqian08161992/luffy.git   这是给后面的地址起一个别名,叫做origin,以后就往这个地址推送代码了,
    这就是建立了关联关系了,这个关联关系在.git文件夹下的config文件里面呢,
    git push -u origin master,这是推送代码到线上
    
    4,但是我们开发都在dev分支,所以也要把dev分支推送到dev,
    切换到dev分支,
    执行代码:git push origin dev
    
    5,有了代码托管之后,你在公司开发的代码,不用拿电脑,回到家就可以写代码了,怎么办?
    现在到了家之后,首先第一步需要把代码下载下来,怎么下载?
    新建一个文件夹,然后在文件夹内部,右键打开git bash here
    执行命令:git clone https://github.com/liqian08161992/luffy.git
    然后把代码克隆下来,这是默认只复制master分支,没有dev分支,
    在本地再新建一个dev分支,git branch dev,
    切换到dev分支,
    执行命令:git pull origin dev,这就是把dev代码拉下来了,
    
    6,在家里开始写代码,开发一个功能,比如会员功能,
    然后git add .
    git commit -m '会员功能开发了三分之一',这是提交了本地,
    git push origin dev,这是把代码推送到了服务器,这一步一定要有,
    
    7,第二天到公司之后,打开目录,然后拉下来代码
    执行命令:git pull origin dev然后代码就拉下来了,
    然后修改了之后,再次提交,并且push到github
    现在就多了push和pull,这是推送到远程仓库了,
    
    #################################################################
    
    git忘记提交代码引发的问题:
    
    1,在公司开发的代码,比如开发了一个1.py,还有add,commit,但是没有push,
    2,到了家里之后,pull的时候就没有代码拉下来的,
    怎么办?
    你可以接着开发,写第二个文件,2.py,然后add,commit,push,
    3,第二天到了公司,公司有一个1.py,现在怎么做???
    现在要先把代码拉下来,可能会冲突,也可能会合并,
    然后继续开发,3.py,然后add,commit,push,
    
    4,这个时候到了家里,
    执行命令:git fetch origin dev,这个也是拉代码,但是没有1.py,3.py,因为这个时候还没有到本地,是从远程到了本地的工作区,
    执行命令:git merge origin/dev,现在要从工作区拿回来,origin/dev这是固定搭配,
    
    总结:
    git remote add origin github地址
    git clone  github地址
    git push origin dev
    -------这一句相当于两句
    -------git fetch origin dev
    -------git merge origin/dev,这种会出现分叉,你可以把这一句命令改成git rebase origin/dev就不会分叉了,
    git push origin master
    -------这一句相当于两句
    -------git fetch origin master
    -------git merge origin/master
    
    5,从git GUI页面可以查看所有的提交记录,这是一个树形的,
    如果你忘记提交,可能会有分叉,
    
    面试题,git rebase的作用?
    在家忘记提交,在公司,你如果使用 git push origin dev
    或者git fetch origin dev和git merge origin/dev,会产生分叉的记录,
    为了保持提交记录的整洁,你可以把这一句命令改成ggit fetch origin dev和git rebase origin/dev就不会分叉了
    这是干净的记录,
    
    
    """

     ###############    git多人协同开发    ##############

    """
    git多人协同开发:
    多人协同开发:
    1,首先是允许他人操作程序,
    
    方式一:合作者模式
    在github上,你可以克隆公开的所有的代码,但是你是不能提交的,如果你想要提交,就要在github里面,
    进入项目,在项目下有一个settings里面,有一个Collaborators,合作者,然后添加github账号,
    然后对方会有收到一个邮件,然后点击就进入了,这是邮箱确认,然后拉下来代码,就可以进行提交代码,协同开发了,
    
    方式二,创建组织模式
    在github上面有一个加号,点击new organizations,这就是创建一个组,然后这个组,可以开发很多的项目,
    填写组织名称,邮箱,免费,邀请组员加入组织,
    然后组织里面有设置,有权限的设置,默认是读read,可以写write,
    
    
    这就是进入公司之后,需要老板把你拉进来,然后协同开发,
    问题:需要几个分支?
    不同的人开发不同的功能,比如打车,配送,然后两个人开发,
    假设A提交到了代码dev分支,然后B回去拉代码下来,会启动不起来,因为别人的代码没有开发完,你拉下来你跑不起来的,
    
    所以如果有两个人开发,就需要四个分支了,master分支,dev分支,然后两个人各一个分支,
    然后两个人从dev拉下来代码到各自的分支,然后把各自的代码开发完了,
    两个人先合并,或者两个人都合并到dev,所以各自有各自的分支,
    
    到了公司拉下来dev分支代码之后,创建自己的分支,你就管你自己的分支就可以了,
    代码提交到自己的分支,这个时候github上面就有各自的分支了,
    
    场景:各自提交到各自的分支
    1,touch 打车.py
    2,git add .
    3,git commit -m '打车开发一半'
    4,git push origin liqian ##这一步推送之后,github就有自己的分支了,
    也可以没有个人分支,就在自己的本地保存,但是有了个人的分支,每天提交,组长就会检查他的代码进度了,
    
    
    场景:两个人都开发完了,合并到dev,
    1,A现在切换到dev分支,
    git checkout dev
    git merge A 这是把我的分支合并到dev分支,
    git push origin dev,这是推送到远程,
    2,B现在切换到dev分支,
    git checkout dev
    git merge B 这是把B分支合并到dev分支,
    git push origin dev,这是推送到远程,这个时候会报错的,
    因为现在的dev 分支已经有比你现在的dev分支更加新的代码了,提示想要把代码拉下来,
    error :git pull  before pushing again,
    所以一旦你看到了这个错误,你就要意识到,你需要先拉下来,然后才可以push,
    git pull origin dev,
    这个时候可能会有冲突的,可能会产生很多的冲突,只要相同地方的代码就会有冲突,
    如果产生了1000个冲突,怎么办?这个地方就是合并冲突,就只能一个一个解决了,这个时候只需要合并,没有冲突
    然后你拉下来之后就可以push代码了,
    git push origin dev,
    协同开发就会出现这样的问题!
    
    问题:这个流程有问题,因为每一个人都想要第一个提交,因为第一个提交没有冲突,
    但是如果很多呢,一般来讲公司会做出规定,因为会给你规定你就修改这几个文件,这样冲突会比较少,
    但是再怎么规定,也是会产生冲突的,怎么办?
    如果产生了冲突,会导致公司内部不和谐,所以公司在合并的时候,
    1,所有的人都要在,
    2,合并间隔的时间不能太长,如果两周合并一次,冲突就很多,三两天合并一次还可以,冲突少,解决方便,
    其实这个时间没有什么硬性规定,一般是一两天,一个小功能开发完了,没有什么bug了,就可以合并了,
    如果一个人的代码有bug,不能合并,就其他人先合并,
    
    这就是两个非常重要的规则,
    
    如果一个新人写的代码,你的老板就会先看一遍,你今天提交了代码,然后第二天发现代码不见了,你就要心慌了,
    因为你的代码太烂了,被老板删了,或者重写了,很多人都有过这个经历,这就是老板review代码,
    这是组长要做的,或者带新人的老人来做,老板一般没有时间做,
    
    面试题:怎么review?
    可以创建一个review的分支,然后把新人的代码不要提交到dev,先提交到review分支,然后都过一遍,
    很多时候不报错,但是也会有问题,就要人工审核,
    
    """

     ###############    git版本控制之fork,和其他    ##############

    """
    git版本控制之fork,
    
    程序员开发了功能之后,想要干什么?可能想要接私活,过了两年你可能想要接私活,你可以去做培训,参加一些研讨,
    你可以看看github上面的源码,提高一下自己,找几个朋友做一个开源的项目,可以是技术类的,可以开发一个python中的模块,
    然后给别人来用,你就是一个开源项目的创始人了,你的简历里面就是可以写你是一个开源项目的创始人,写上地址,你就厉害了,
    
    发起一个项目,每周末去咖啡厅写代码,好多公司都在用,持续维护一定会特别棒,你拿到优秀的代码去读,
    你就可以发现bug,一定可以发现bug,如果你能发现django的bug你就厉害了,django的源码就在GitHub上,
    假设你发现了django的源码的bug,你怎么通知他们,你把django代码拉下来之后,你是不能提交改动的,
    比如你点击fork,你就把这个代码copy到自己的仓库了,fork的地方就+1了,fork的次数越多,你的代码越受到欢迎,
    你fork了之后,你就可以修改了,不会影响到原主人的代码,
    
    这个时候发现了django代码的bug,你怎么通知他们?
    new pull request,创建一个create new request,你就可以提交了,这就给对方发送过去了,
    然后对方需要同意,但是对方需要检查是不是恶意的,只要对方同意了,就会有我修改的代码了,
    
    面试题:如果你要在github上给别人的代码添加功能,
    先fork,
    然后pull request,同意了就添加了我修改的代码了,
    
    ##################################################
    
    其他:
    1,不用反复输入用户名和密码:
    
    第一种方式:https的方式:通过地址里面添加用户名和密码来解决这个问题:
    git remote add origin https://用户名:密码@github.com/liqian08161992/luffy.git
    但是这种不太好,这种把用户名和密码暴露了,
    
    第二种方式:使用ssh的方式,
    使用git,进入项目根目录,然后输入:ssh-keygen.exe
    一直回车,就会保存了,地址: (/c/Users/thinkpad/.ssh/id_rsa):
    进入这个目录,/c/Users/thinkpad/.ssh
    你会看到两个文件,id_rsa  id_rsa.pub ,一个私钥,一个公钥,
    然后你复制公钥,放到上面,你就可以不用加用户名密码了,
    
    2,如果你不需要git管理项目中的一些文件了,怎么办?
    你在项目根据目录下面,新建一个文件,vim .gitignore,这个文件需要push上去,
    打开这个文件,然后加入
    *.sql
    *.pyc (这是py文件的编译文件,)
    然后保存退出,你以后修改了这种文件,git status的时候就不会检测到这个文件了,git不管了,
    
    
    3,django在github上面有不同的版本,
    我们怎么创建版本?
    在本地执行命令,git tag -a v1.0 -m "初次创建第一个模板"
    在执行命令,git push origin --tags,这样你在github上面就有一个版本了,
    
    """

      ###############    git工作流程    ##############

    """
    工作git使用流程:
    
    项目经理:
    项目之初,项目经理搭建项目的框架,
    建完框架之后,项目经理把项目框架代码放到服务器,
    
    
    普通员工:
    在自己的电脑上生成ssh公钥,然后把公钥交给项目经理,然后项目经理给你添加到服务器上,
    项目经理给你每一个组员一个克隆地址,然后你把代码克隆到本地,
    你可以在本地创建一个分支,然后每天在这个分支开发, 
    每一个员工把自己的完成的代码,发布到远程的dev分支上,
    一般项目中都会有两个分支,一个master分支,一个dev分支,
    master分支保存要发布的代码,
    dev分支保存开发过程中的代码,所有的组员开发完自己的代码都要发到这个dev上
    你不能每次开发一点都发布到dev上去,因为别人要下载这个项目,如果你没开发完,你就发上去了,别人下载了,可能会跑不起来的,
    项目经理给你任务,预计几天完成,到时间了, 会问你有没有完,完了就可以推代码了,
    
    
    """
  • 相关阅读:
    Python股票分析系列——系列介绍和获取股票数据.p1
    快速相关
    特别长序列的快速卷积
    长序列的快速卷积
    快速卷积
    素因子快速傅里叶变换
    用一个N点复序列的FFT同时计算两个N点实序列离散傅里叶变换
    实序列快速傅里叶变换(二)
    实序列快速傅里叶变换(一)
    java 对于手机号码、邮箱、银行卡号脱敏一条龙服务
  • 原文地址:https://www.cnblogs.com/andy0816/p/11884499.html
Copyright © 2011-2022 走看看