1.git介绍和安装
1.我们为什么要使用git?
1.1 帮助开发者合并开发的代码
1.2 如果出现冲突代码的合并,会提示后提交代码的开发者,让其解决冲突
1.3 代码版本的管理,比如要找到之前某个版本的代码做对比,那么需要找到之前某个版本的代码
2.svn和git的区别:
git是分布式的,有本地和远程两个版本库,服务端出问题本地也可以做版本管理。SVN是集中式,只有一个远程版本库。
1.1 git,gitee,github,gitlab
git:版本管理软件,装在操作系统上,有很多命令
gitee:远程仓库:开源代码,私有代码,有个网站,可以看到有哪些开源代码,通过网站做一些配置。gitee是国内最大的开源远程仓库,模仿国外的github。国内一些小公司使用gitee作为代码仓库。
github:远程仓库:开源代码,国际上的开源代码仓库。
gitlab:公司内部的远程仓库
2.git使用流程
2.1 软件安装
官方网站:https://git-scm.com/
按照流程下载即可。当我们下载成功之后,打开cmd窗口输入git可以返回以下内容:
2.2 git工作流程
git中存在三个区:
工作区:存放文件的地方
暂存区:工作区的变更,提交到暂存区
版本库:暂存区的内容提交到版本库
存储的顺序为: 工作区>>>暂存区>>>版本库
3.git常用命令
1.文件夹想被git管理,文件夹作为仓库。首先打开要被管理的目录,然后鼠标右键,点击 Git Bash Here
在命令行输入:git init,此时目录下出现了一个.git的文件夹,说明该目录已经被git管理
注:也可以在上一级敲:git init zkz,该命令指在该目录下新建一个zkz目录,并且被git管理。
2.查看文件状态: git status(只能看到工作区和暂存区)。
文件状态有以下三种颜色,分别代表不同的含义:
红色:工作区发生变化,但是没有提交到暂存区。该目录下任何文件的变化都会被监测到(新创建文件也算变化),查看文件状态时变成红色。
以下图片说明a.txt刚创建或者是修改了内容,还未存储到暂存区:
绿色:已经提交到暂存区,未提交到版本库
无色:所有内容均已提交到版本库
3.把工作区的内容存储到暂存区:
git add 文件名:将指定文件从工作区存储到暂存区
git add . :将该目录下所有在工作区的文件存储到暂存区
4.设置作者:作者分为全局作者和局部作者。全局是针对于当前操作系统,局部针对于当前仓库。当全局和具体作者同时存在时,优先使用局部作者。
设置全局作者:
git config --global user.email "邮箱"
git config --global user.name "姓名"
5.将暂存区的文件存储到版本库(工作区的文件无法被存储到版本库):
git commit -m '注释'(注释必须要编写)
6.查看版本库信息:
git log:信息较为复杂
git reflog:信息较为精简
7.其他撤回的命令可以参考下图:
将暂存区的内容撤回到工作区(由绿变红):git reset HEAD
将工作区的变更撤回:git checkout .
8.现在我们做如下操作:首先新建一个文件aaa.mp4,然后将它存储到暂存区,再存储到版本库。分别执行命令:
git add
git commit -m '将aaa.mp4提交到版本库'
此时aaa.mp4已经存在于版本库中:
这时我们将aaa.mp4删除,再次查看状态,发现aaa.mp4也有变化:
如果我们想恢复这个文件,需要将aaa.mp4删除的这条记录添加到暂存区,在添加到版本库。然后再回撤到提交aaa.mp4的这个状态。在删除后一次执行以下命令:
git add.
git commit -m '删除了文件aaa.mp4'
git log
得到了以下版本库信息:
"""
commit 114c9dc15d882140ceabf610bf31b14157de62f7 (HEAD -> master)
Author: max [email protected]
Date: Wed Mar 1 20:57:59 2023 +0800
删除了文件aaa.mp4
commit a90c9593d6b7d4643eaae87281c1db081c43c88f
Author: max [email protected]
Date: Wed Mar 1 20:50:08 2023 +0800
将aaa.mp4提交到版本库
commit b92b4791aea2d47b91c8a78c120bcbccf6b0ef36
Author: max [email protected]
Date: Wed Mar 1 20:18:02 2023 +0800
提交了b.txt
commit cbc548e8981ab2e68df7e247837d3e95a793a9ae
Author: max [email protected]
Date: Wed Mar 1 20:11:46 2023 +0800
将a.txt提交到版本库
"""
这是我们回退到删除之前的状态,也就是提交视频后的状态:
git reset --hard a90c9593d6b7d4643eaae87281c1db081c43c88f
就可以将删除的文件恢复。
4.git忽略文件
咱们项目中,有些文件,或文件夹不想被git管理,比如:node_models、.idea、xx.pyc(python 的编译文件)
使用步骤:
1.在仓库目录下.git 所在目录下新建.gitignore
2.在里面写忽略文件:node_models、.idea
3.写的就会被忽略
4.已经被管理过的不会被忽略
忽略文件写法:
文件或文件夹名:代表所有目录下的同名文件或文件夹都被过滤
/文件或文件夹名:代表仓库根目录下的文件或文件夹被过滤
例如:
a.txt:项目中所有a.txt文件和文件夹都会被过滤
/a.txt:项目中只有根目录下a.txt文件和文件夹会被过滤
/b/a.txt:项目中只有根目录下的b文件夹下的a.txt文件和文件夹会被过滤
x:名字中有一个x的都会被过滤(*代表0~n个任意字符)
空文件夹不会被提交,空包会被提交,包可以被提交(包中有一个init空文件)
5.git多分支
为什么要有分支?
1.多个开发者都是在一个分支上进行开发,不出意外,该分支一定叫dev(协同开发)
2.如果出现一个特殊任务(敏感任务),与正常业务关系不紧密,甚至可能大的影响正常的dev分支开发,可以依赖dev开一个子分支,进行开发,开发完毕后合并到dev分支,再删除该分支即可
3.所有的开发任务都可以在dev分支上进行(除非公司硬性要求不能直接在dev分支开发,只能在dev子分支开发,测试通过后才能合并给dev)
5.1 分支操作
分支查看:git branch
分支创建:git branch 分支名
分支切换:git checkout 分支名
分支删除:git branch -d 分支名
5.2 分支合并
产生的过程:我有一个master分支,之前我在这个分支上面提交了几个版本1和版本2。这时我又创建了一个分支叫dev分支。此时我又在dev分支上面提交了版本3和版本4。那么我在master分支上是无法看到版本3和版本4的。如果此时我将两个版本合并,这个过程叫做分分支合并。版本5就是合并之后的版本。
首先创建一个dev分支,切换到该分支并在该分支下创建一个dev.txt,同步到版本库(之前没有创建分支dev时我们做的操作也可以看到,因为dev分支是在之前的版本复制过来的,而在dev分支上做的操作在分支master上就看不到了)
这时我们切换到分支master,发现在dev分支下创建的dev.txt不见了。并不是被删除了而是被git管理起来了。这就是不同分支之下管理不同的版本信息
这时我们想将dev分支合并到master分支,合并后dev和master内容就完全一样了(假设在dev分支操作期间master分支未进行任何操作),需要按照以下步骤:
1.首先切换到分支master分支下(被合并的分支):git checkout master
2.将dev合并到master,执行合并命令:git merge dev
此时已经处在分支master中,并且该分支下已经有了文件dev.txt:
但是,分之合并还存在一个很大的问题,如果在分支dev改动期间,分支master也进行了改动,那么分支合并会出现冲突(后续讲解)。
在公司实际业务中可能是以下两种情况:
1.主分支master分支,实际更新代码在dev分支上进行,审核通过后合并到master分支上去,还可能有一个bug分支,有问题在bug分支上修改,之后合并到master分支。
2.有的公司除了master分支,dev分支还有一个个人分支,在个人分之上做改动,之后合并到dev分支。
6.git远程仓库
之前我们所做的内容是在本地合并分支,在实际工作中我们可能需要将本地的代码提交到远程仓库,例如gitee、github、gitlab等。
gitlab的搭建过程:https://zhuanlan.zhihu.com/p/413217715
接下来以gitee作为远程仓库讲解。例如我们想把路飞项目提交到gitee远程仓库,按照如下步骤:
首先提交到本地版本库
1.在luffy_api输入命令:git init(输入之后该目录就被luffy_api管理,目录下也会出现一个.git的文件夹)
2.设置忽略文件:在luffy_api目录下新建文件.gitignore,在该文件下写被忽略的文件。用pycharm编写会有提示,没有被忽略的文件或目录都是红色的,忽略掉的文件或目录都是无色的(有的版本是黄色):
3.接下来我们直接在pycharm命令行输入命令将变更数据添加到版本库:
git add .
git commit -m '第一次提交'
"""
补充:如果提交到版本库信息之后还没有添加忽略信息,这是只要有文件变化该文件就会变红色。如果该文件不重要,正确而做法是将该文件删除,然后将该操作提交到版本库信息。该文件就不会被管理了。
"""
通过以上三步成功将文件提交到本地版本库,接下来是远程仓库
1.在gitee上新建仓库:
"""
初始化仓库:如果选中里面会默认建一个.gitignore文件,选择语言会默认设置忽略的文件,我们要保证库是空的,默认不选。
设置和选择分支模型默认不选
"""
2.设置用户和邮箱:
git config --global user.name "max"
git config --global user.email "[email protected]"
设置的用户名和密码在目录C:\Users\27571下的.gitconfig文件中:
3.按照网站提示的步骤操作:
网站提示:
cd existing_git_repo
# 添加一个远程仓库地址名叫orgin,地址是https://gitee.com/maxzkz/luffy_api.git
git remote add origin https://gitee.com/maxzkz/luffy_api.git
# 把本地当前所在的分支,推送到origin对应的远程master上
git push -u origin master
依次执行以下操作:
git remote add origin https://gitee.com/maxzkz/luffy_api.git
git push -u origin master
然后输入用户名和密码
出现以下提示说明成功推到库中:
此后可以不用输入用户名和密码就可以正常登陆。如果忘记密码,查看和修改地方在:
控制面板\用户帐户\凭据管理器\编辑普通凭据
6.ssh方式连接远程仓库
在刚才我们提交代码输入了用户名和密码才能提交,使用的是https协议提交代码。他需要输入用户名和密码。我们现在使用ssh连接远程仓库,不再需要使用用户名和密码,使用公钥和私钥来提交代码,这种方式在公司内使用较多,此后再提交代码不需要再输入用户名和密码,而是一路绿灯。
使用步骤:
1.生成公钥私钥:(生成公钥私钥指导:https://gitee.com/help/articles/4181)
在cmd窗口输入:ssh-keygen -t ed25519 -C "[email protected]"
2.可以看到生成的公钥私钥保存在C:\Users\27571/.ssh/id_ed25519目录下,后缀名带有.pub的是公钥,不带的是私钥。因为加密和解密的密文不同,所以这是一个非对称加密方式。公钥可以泄露给别人,私钥不可以。
然后我们需要将公钥复制,粘贴在gitee的配置上面,然后输入密码验证,提交。此后就可以不用输入密码提交代码。
3.之前origin对应的地址是https协议,现在需要更改为ssh协议。需要首先将之前的协议删除,在增加ssh协议。受限制性删除代码:
git remote remove origin
git remote add origin [email protected]:maxzkz/luffy_api.git
[email protected]:maxzkz/luffy_api.git需要从以下位置找到,复制到代码上:
此后我们直接执行代码,就可以将本地的代码同步到gitee库中:
git push origin master
总结:从代码修改到后同步到gitee,需要依次执行以下代码(使用ssh协议):
1.git add . # 将文件从工作区提交到本地暂存区
2.git commit -m '注释' # 将文件从本地暂存区提交到本地版本库
# 可以随时使用git status查看状态
3.git push orgin master # 将代码提交到gitee库中
如何成为公司自建git服务器的开发者:
1)生成自己电脑的公钥(公钥生成一次就可以了),把它提交给项目管理者
2)项目管理者添加你公钥,加入开发者,提供给你项目克隆地址
3)克隆开发项目,进行开发
7.协同开发
我创建的仓库,对仓库有各种权限。但是在一个开发小组里要实现协同开发,别人要对我的代码进行协同开发,就要能看到我的代码并且能下载。
我们首先要邀请开发者,开发者有拉取代码、修改、提交的权利:
当我们作为开发者(不是开发者没有权利拉取代码),要拉去别人的代码,需要按照以下步骤:
1.首先找到开发者的库,点击克隆/下载,复制创建者的ssh地址:
2.然后找到我们想要将该代码保存的目录,在该文件夹内右击鼠标,点击Git Bash Here,在该路径下输入命令,代码就可以拉取下来:
git clone '刚才复制的ssh地址'
3.我们对代码修改完毕之后,再次在该目录下鼠标右击Git Bash Here,然后依次执行以下命令,就可以将代码提交到开发者的库中:
git add .
git commit remote '修改了requirements'
git reflog
git push origin master
# 随时使用git status查看状态
在公司实际开发步骤:
自己注册,或者hr会给我一个gitlab账号和密码,自己去账号里配置ssh
领导会给我一个仓库地址,他已经把我添加成开发者
将代码clone下来
使用pycharm打开,配置环境,代码运行,写代码
本地提交,push到gitlab上
8.冲突解决
出现冲突的原因:
1.多人在统一分支开发
2.分支合并之后出现冲突
多人在统一分支开发:
多人在统一分支开发出现冲突情况:当我们对一个文件修改完成之后,想把它push到远端,但是之前如果另一个人已经在同一分支上修改过代码(如果我从克隆到拉取代码的期间,同事都没有push过代码,那我拉取代码时就不会有变化,我push代码时也不会有报错,只有同一分支上别人也修改过代码之后我提交才会报错),会直接报错,因为我们拉取的代码版本不是最新的。此时我们需要先在pycharm命令行(在指定库之内)把最新的代码拉取下来,进行修改:
执行拉取命令,之后才能更改,拉取代码之后我的代码也会实时更新:
git pull origin master
修改之后,再次提交,可以提交成功,并且远端会实时更新:
git push origin master
解决方式:同时之间协商解决保留谁的代码
避免冲突的方式:勤拉取代码
分支合并之后出现冲突:
建立两个分支,一个master分支,一个dev分支。首先切换到master分支,当我们在master分支中打印一句代码,同步到版本库。但是当我们切换到dev分支之后,该行代码会消失:
这是我们在dev分支中同样的位置也打印一句代码。然后同步到版本库。这时我们切换到分支master,然后执行分之合并代码:
git merge dev
这时虽然还没提交到远端,但是已经可以演示出冲突效果:
协商之后修改代码,提交到远端即可。
9.线上合并分支
在线上新建一个分支dev,这时我们在后端执行git branch是看不到远端创建的dev分支的。我们需要执行一个命令将远端的分支拉取下来,在切换到dev分支,才能看到远端新建的分支dev
git pull origin dev
git checkout dev
git branch
接下来我们在新增的dev分支新增加一句,同步到版本库,然后在同步到远端。这时我们切换到dev分支可以看到这句话,在master分支看不到:
现在我们想在线上将dev分支合并到master分支,选中pull request,所以在公司新建一个合并分支项目也叫pr或者rr。在合并过程中需要搞明白是谁合并入谁,我们这里是dev合并入master:
10.远程仓库回滚
步骤:
本地版本回退:
git reset --hard 版本号
强行推到远端
git push origin master -f
回滚谨慎使用!!!
11.为开源项目贡献代码
当我们在github或gitee看到好的开源项目,发现有bug或者为他增加新功能,可以为作者贡献代码,下面在网上随机找一篇代码演示:
1.执行Fork:该命令会把代码复制一份到我们的库中:
2.用pycharm将项目克隆(和之前的命令克隆完全一样,后面会讲解)并且打开:
3.修改代码,然后现将代码提交到本地版本库,再提交到本地我的远端:
4.然后新建request,将我修改后的文件合并到他的代码,这个过程要注意分支的选择,如果作者统一我也会成为作者代码的贡献者:
12.pycharm操作git
说明:想要在pycharm中操作git必须要在settings.py中的git中关联到git.exe文件。如果软件没有自动关联需要手动设置:
1.将修改代码从工作区添加到暂存区,如果点文件夹,文件夹内所有有调整的文件都会被添加到暂存区:
2.从暂存区同步到版本库:
3.上传之前从平台上拉取代码(不会有冲突,因为这个分支上只有我一个人在操作,我操作期间并没有其他人提交过新版本):
4.将代码上传到远端:
5.也可以直接执行commit and push,直接一步同步到远端:
6.分支操作:
7.添加或更改仓库:
8.查看之前的版本和现在的区别: