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文件,里面就是我们配置的nameEmail

注意:上面的配置中–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.pyhello.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将更新为暂存区的最近一次addtest.py

  如果使用git mv 目录1 目录2,则将目录1移动到目录2。使用git rm文件名可以删除文件。

6. 版本控制

  6.1回退到上一个commit节点

  git reset –hard HEAD^

  说明: 一个^表示回退1个版本,依次类推。当版本回退之后工作区会自动和当前commit版本保持一致。

  用于将当前分支的 HEAD 指向上一次提交(即上一个提交)的状态,并重置工作目录和暂存区,丢弃之前的所有更改(无论是否已经add到暂存区,都将丢弃,可以考虑回退之前使用git stash命令封存当前更改,关于stash后面会讲到)

  注意,在windowscmd.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}]

  此时在pycharmstash.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. githubgitee的使用

  githubgitee操作差不多,这里github不容易访问,暂时介绍gitee的使用。

  9.1 gitee介绍

  码云(Gitee)OSCHINA 推出的代码托管协作开发平台,支持 Git SVN,提供免费的私有仓库托管。官网是https://gitee.com/。使用前先注册,另外gitee可以关联github,可以fork github中的项目。

  9.2gitee中创建仓库

  按如图所示操作,新建仓库操作。

  点击创建后,如下图所示。记住这里有HTTPSSSH,后面会用到。

  9.3 pycharm中配置git路径

  这里配置前面安装的git路径(也可以在plugins中安装使用gitee插件)。

  9.4 pycharmcommit到本地仓库

  点击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

  使用sshurl也是可以的(但是如果配置ssh秘钥后,只能使用ssh的url地址了了)。

  9.5搭建私钥公钥实现免密认证

  这里给个图算了,我没有弄这个,windows应该是记住密码了,在linux中每次pullpush都需要输入账号与密码。网上很多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的安装)

  不足或错误之处欢迎指正与评论,觉得有用,请点个赞!