############### 初识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上去,因为别人要下载这个项目,如果你没开发完,你就发上去了,别人下载了,可能会跑不起来的, 项目经理给你任务,预计几天完成,到时间了, 会问你有没有完,完了就可以推代码了, """