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


"""
原文地址:https://www.cnblogs.com/andy0816/p/11884499.html