代码管理工具git的使用
1. git概述
git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
2. git工作流程图
工作流程图如图所示,黄色部分为工作区,index为暂存区,Repository为本地仓库,Remote为远程仓库。
中文对照图如下图所示。
工作区:项目所在操作目录,实际操作项目的区域
暂存区: 用于记录工作区的工作(修改)内容
仓库区: 用于备份工作区的内容
远程仓库: 远程主机上的GIT仓库
注意: 在本地仓库中,git总是希望工作区的内容与仓库区保持一致,而且只有仓库区的内容才能和其他远程仓库交互。
3. git下载与安装
官网下载:https://git-scm.com/download/win根据自己的电脑操作系统位数下载。
这里也附上百度网盘下载地址:
链接:https://pan.baidu.com/s/1p_gsUpYbDZ-Qlczc7XFOng 提取码:773a
下载好后,进行安装。关于安装可以参考文中最后的参考链接。安装好后:
在命令窗口输入git --version及右键显示如下图所示(表明安装好了)。
4. 初始配置
配置提交者用户名与邮箱名
git config --global user.name "your_username"
git config --global user.email "your_email"
使用git config --list命令可以查看配置信息:
配置好后,会生成一个.gitconfig文件,里面就是我们配置的name与Email。
注意:上面的配置中--global参数将把配置应用到当前用户的全局范围中,配置多少个,也只是后面的配置覆盖前面的配置,在.gitconfig文件中只会有一个用户名与email。而不加--global参数则只会将配置应用到当前仓库的本地范围中。如果想让每个仓库用户名都不同,则在该仓库目录下使用不带--gloal参数的命令配置即可。
5. 基本命令
5.1初始化仓库
使用cd命令进入到你项目的目录下,使用命令git init命令将生成一个git本地仓库(目录),该仓库可以使用git管理。这里我在pycharm中新建了一个项目叫hello_git。
原始hello_git项目内容如下:
使用git init后,会生成一个.git的隐藏文件夹,如果没有看到,点击查看,把显示隐藏文件勾上就能看到了。这个.git文件夹使我们的本地仓库。
5.2 查看本地仓库状态
git status
说明: 初始化仓库后默认工作在master分支,当工作区与仓库区不一致时会有提示。
5.3 将工作文件添加到暂存区
使用git add 文件1 ,文件2将文件1,文件2添加到暂存区。如果想全部(不包含隐藏文件)添加可以使用add .或者使用add *。再次使用git status查看状态,全部为绿色。
添加到暂存区后,会在.git文件夹中生成一个index文件,这个就是暂存区。
5.4 取消文件暂存记录
使用git rm --cached 文件名 取消文件暂存。
5.5 设置忽略文件
在GIT项目中可以在项目根目录添加.gitignore文件的方式,规定相应的忽略规则,用来管理当前项目中的文件的忽略行为。.gitignore 文件是可以提交到公有仓库中,这就为该项目下的所有开发者都共享一套定义好的忽略规则。在.gitignore 文件中,遵循相应的语法,在每一行指定一个忽略规则。
.gitignore忽略规则简单说明:
file 表示忽略file文件
*.a 表示忽略所有 .a 结尾的文件
!lib.a 表示但lib.a除外
build/ 表示忽略 build/目录下的所有文件,过滤整个build文件夹;
创建一个.gitignore文件(注意文件名只能是这个,不能用别的名字)
编辑.gitignore文件,添加忽略的文件。
再次查看git状态。发现main.py与hello.txt消失了。表明我们无法add这些文件到暂存区了,一般这类文件不重要,不需要提交,只给自己看的,比如使用git add *全部add到暂存区时,设置.gitignore后,就会忽略这些文件。
5.6 将暂存区文件同步到本地仓库
语法如下:
git commit [file] -m [message]
说明: -m表示添加一些同步信息,表达同步内容,不加file表示同步所有暂存记录的文件
[message]:是提交信息的内容。你需要用引号将消息内容包裹起来,以确保整个消息被正确解析。
例如:将暂存区所有记录同步到仓库区
git commit -m 'add files'
再次使用git status查看状态,发现绿色部分没有了,表明已经提交到本地仓库了。可以在.git文件夹中查看文件COMMIT_EDITMSG属性,发现时间是当前时间,他就应该使我们本地仓库存储提交文件的地方了。另外还有logs文件夹内容也发生了变化。其中一个文件如下:
5.7 查看日志记录
git log
git log --pretty=oneline
Git log命令用于显示提交历史记录。它会按照时间顺序列出所有的提交,最新的提交会位于最上面。图中黄色长串部分是哈希值,下面是作者(最前面创建的用户名与邮箱)与日期时间。HEAD->master是一个提示,表示当前处于master分支。HEAD是一个指针,指向当前提交的分支master。
还可以使用git log命令的一些选项和参数来修改和过滤提交历史记录的显示方式,例如--oneline、--graph、--author等。
下面的命令查看了提交历史,并以单行显示每个提交的信息。
5.8 暂存区恢复到工作区
语法:git checkout [commit] -- [file]
[commit]是指定的提交,可以是提交的哈希值、分支名或标签名。[file] 是要恢复或检出的文件路径。不写[commit]时,表示恢复到最新的保存值。
恢复test.py文件后,工作区的test.py将更新为暂存区的最近一次add的test.py。
如果使用git mv 目录1 目录2,则将目录1移动到目录2。使用git rm文件名可以删除文件。
6. 版本控制
6.1回退到上一个commit节点
git reset --hard HEAD^
说明: 一个^表示回退1个版本,依次类推。当版本回退之后工作区会自动和当前commit版本保持一致。
用于将当前分支的 HEAD 指向上一次提交(即上一个提交)的状态,并重置工作目录和暂存区,丢弃之前的所有更改(无论是否已经add到暂存区,都将丢弃,可以考虑回退之前使用git stash命令封存当前更改,关于stash后面会讲到)。
注意,在windows中cmd.exe)会按照配置进行分页显示(通常是每次显示一屏内容),以便在输出较长时可以按页浏览。当命令执行后,如果输出内容超过一页时,会出现 "More?" 提示,表示还有更多内容需要显示,等待用户输入命令来翻页或退出。使用管道将命令输出传递给 more 命令,以便一次性显示所有内容。如下图:
6.2 退回到指定的commit_id节点
git reset --hard [commit_id]
[commit_id]可以是完整的哈希值或部分哈希值。
6.3 查看所有操作记录
git reflog
注意:最上面的为最新记录,可以利用commit_id去往任何操作位置。
6.4 标签的创建及操作
标签在项目的重要commit位置添加快照,保存当时的工作状态,一般用于版本的迭代。
git tag [tag_name] [commit_id] -m [message]
该命令用于在指定的提交上创建一个新的标签,并为该标签添加一个描述信息。
说明: commit_id可以不写则默认标签表示最新的commit_id位置,message也可以不写,但是最好添加。
查看标签:
git tag
去往某个标签节点
git reset --hard [tag]
删除标签
git tag -d [tag]
7. 工作区保存及其他操作
7.1保存工作区
git stash save [message]
说明: 将工作区未提交的修改封存,让工作区回到修改前的状态。
这里新建了一个stash.py文件。红色表示未add到暂存区。这里使用git add明林将该文件add到暂存区。
再次查看pycharm,这个stash.py文件没有了。
配置秘钥到gitee后,为什么clone还需要输入用户名与密码
7.2 查看工作区列表
git stash list
说明:最新保存的工作区在最上面
7.3应用某个工作区
git stash apply [stash@{n}]
此时在pycharm中stash.py文件又出现了。
7.4 删除工作区
git stash drop [stash@{n}] 删除某一个工作区
git stash clear 删除所有保存的工作区
8. 分支管理
分支即每个人在原有代码(分支)的基础上建立自己的工作环境,完成单独开发,之后再向主分支统一合并工作内容。使用分支的好处是各自开发互不干扰,防止误操作对其他开发者的影响。
8.1分支的查看
git branch
说明: 前面带 * 的分支表示当前工作分支
8.2 创建分支
git branch [branch_name]
说明: 基于a分支创建b分支,此时b分支会拥有a分支全部内容。在创建b分支时最好保持a分支"干净"状态。创建分支并不会自动切换到新分支,仍然会保持在当前的分支上。
8.3 切换工作分支
git checkout [branch]
注意:如果使用git checkout -b [branch_name] 可以同时完成创建分支和切换分支的工作
8.4 合并分支
git merge [branch]
注意:分支的合并一般都是子分支向父分支中合并
8.5 删除分支
git branch -d [branch] 删除分支
git branch -D [branch] 删除没有被合并的分支
下面给出了分支结构的操作图。
8.6 分支冲突问题
当分支合并时,原来的父分支发生了变化,在合并过程中就会产生冲突问题,这是合并分支过程中最为棘手的问题。
冲突情形1:原来的分支增加了新文件或者原有文件发生了变化
此时合并可能会出现:”请输入一个提交信息以解释此合并的必要性...”,此时,随便输入就额可以了。
冲突情形2:子分支和父分支修改了相同的文件。此时,需要修改后,add,commit操作后合并。
以上git命令操作没有涉及到远程仓库操作,接下来介绍gitee,使用命令及pycharm可视化操作对代码进行管理。
9. github与gitee的使用
github与gitee操作差不多,这里github不容易访问,暂时介绍gitee的使用。
9.1 gitee介绍
码云(Gitee)是 OSCHINA 推出的代码托管协作开发平台,支持 Git 和 SVN,提供免费的私有仓库托管。官网是https://gitee.com/。使用前先注册,另外gitee可以关联github,可以fork github中的项目。
9.2 在gitee中创建仓库
按如图所示操作,新建仓库操作。
点击创建后,如下图所示。记住这里有HTTPS与SSH,后面会用到。
9.3 pycharm中配置git路径
这里配置前面安装的git路径(也可以在plugins中安装使用gitee插件)。
9.4 pycharm中commit到本地仓库
点击commit后,stash.py代码被提交到了本地仓库。
9.5 pycharm push到远程gitee仓库
点击push,或者选择自己想要的文件push。会出现一个选框,需要填入gitee登录的账号与密码,忘记截图了,这里提醒一下。
最后提交成功了(如下图所示),上面提交过程中遇到过问题(好像是push被拒绝了,怎么解决忘了),然后在gitee中查看:
9.4 命令提交代码
push的前提是先commit到本地仓库。
# 添加远程仓库 URL
git remote add origin https://gitee.com/wancy_2017/2023_7_19.git
这是后面添加的,所以显示已存在。
# 推送本地 master 分支到远程仓库
git push -u origin master
刷新网页。
git pull操作,这里我在网页中修改了command_push.py里面的内容。不变的话pull会显示Already up to date。
使用ssh的url也是可以的(但是如果配置ssh秘钥后,只能使用ssh的url地址了了)。
9.5 搭建私钥公钥实现免密认证
这里给个图算了,我没有弄这个,windows应该是记住密码了,在linux中每次pull、push都需要输入账号与密码。网上很多ssh的加密操作教程。
找到控制面板windows凭据中能找到确实是gitee的账号与密码。
注意使用ssh秘钥,在gitee配置公钥后,使用git命令从远程仓库pull clone时,使用的url不再是https那个了,而是SSH那个url。
10. 功能与特点
分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库。
从一般开发者的角度来看,git有以下功能:
1、从服务器上克隆完整的Git仓库(包括代码和版本信息)到单机上。
2、在自己的机器上根据不同的开发目的,创建分支,修改代码。
3、在单机上自己创建的分支上提交代码。
4、在单机上合并分支。
5、把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。
6、生成补丁(patch),把补丁发送给主开发者。
7、看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
8、一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。
从主开发者的角度(假设主开发者不用开发代码)看,git有以下功能:
1、查看邮件或者通过其它方式查看一般开发者的提交状态。
2、打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。
3、向公共服务器提交结果,然后通知所有开发人员。
小结:除了git外,还有SVN(Subversion,SVN是集中式的)版本控制系统,也是一个开源的版本控制系统。本文使用的环境系统是windows系统,会记住密码。可能与linux存在少许不同之处。尽量在项目中降低耦合度,不同的分支只编写自己的模块。如果必须修改原来父级分支的文件内容,那么做好分工,不要让多个分支都修改同一个文件。
参考资料:
https://baike.baidu.com/item/GIT/12647237?fr=ge_ala
https://blog.csdn.net/nanxun201314/article/details/127719569
https://www.cnblogs.com/xueweisuoyong/p/11914045.html(git的安装)
https://blog.csdn.net/weixin_61485030/article/details/131114418(git的安装)
不足或错误之处欢迎指正与评论,觉得有用,请点个赞!