一、什么是git、gitlab、github
git是一种版本控制系统,或者说是一种工具软件,用于对代码的存储和版本控制;
gitlab是一种远程代码仓库,或叫代码托管中心。它是基于git实现的,一般用于公司内部局域网环境下的团队开发代码管理和控制;
gitHub与gitlab的作用是一样的,只不过它是面向与互联网的代码仓库,目前也是全球最大的代码托管平台,任何人都可以注册账号来使用它,不过部分功能是收费的,比如说私有代码仓库,目前的收费标准是 7刀每月。
另外还有外网托管中心码云(gitee),免费的,对于项目的数量有要求的,目前是1000个,而且站点在国内,速度比github快。
二、git 的结构
工作区:写代码的地方
暂存区:打算要提交但是未提交,临时存储代码的地方
本地库:存储本地历史版本
工作区 git add —>暂存区 git commit —>本地库
三、代码托管中心(远程库)
团队内部协作,由于多人合作项目,需要将每个人的代码综合到一起,远程库就是存储合并所有开发人员的代码。
本地库 git push —>远程库
远程库 git clone -->本地库
远程库 git pull -->本地库
跨团队协作开发,多个远程库,先将远程库 A fork 到远程可以 B ,远程库B 代码写完后 pull request ,经过审核到 合并 (merge)到远程库A。
下面会有具体的操作案例。
四、git 的安装
-
Git官网下载安装包
-
安装过程与常规软件安装一致,默认设置就好。
此处设置如何使用环境变量:选项 说明 use Git from Git Bsh only 此选项不会修改系统的环境变量,但是只能在Git 命令行(Bash UI)下执行git命令。建议使用此选项 Git from the command line and also from 3rd-party software 此选项支持在window cmd 窗口执行git 命令 Use Git an option Unix tools from the Command Prompt 使用可选的Unix 工具,对系统环境变量有覆盖风险,不建议使用 -
安装成功后,在桌面右击,就可以看到git 的两个快捷工具,其中 git bash here 就是打开 git 命令行的
五、git 命令行操作之基操
-
本地库初始化
本地库初始化就是新建一个本地库。在我们需要进行版本控制的文件夹内,通过 git init 命令进行初始化。命令:git init
效果:初始化完成后在文件目录中会生成一个 .git 文件夹
-
设置签名
设置签名的作用是为了区分不同开发人员的身份。签名需要用户名和email地址。但是这里设置签名的用户名和email与登录远程库(代码托管中心)的账号和密码没有任何关系。命令:git config
效果:项目级别/仓库级别,仅在当前本地库范围内有效命令:git confg --global
效果:系统用户级别,登录当前操作系统的用户范围内有效级别的优先级:就近原则,两者都有时项目级别优先于系统级别,两者都没有时不允许。
设置完签名后,设置的信息会保存在配置文件中。如果设置的是项目级,则在本地库 .git 下的 config 文件, 如果设置的是系统级,则在 用户目录下 .gitconfig 文件。 -
添加提交、查看状态
状态查看:git status
添加到暂存区:git add [文件名]
提交到本地库:git commit -m “提交信息” [文件名]
- on branch master:当前在master分支
- No commits yet:还没有任何提交到本地库
- nothing to commit :暂存区没有可提交的
- create/copy files and use “git add” to track:创建或复制文件 ,使用 git add 命令添加到追踪(版本管控)
新建一个文件test.txt,然后再次执行 git status .
提示含义:有未被提交到暂存区的文件,使用 add 命令提交到暂存区,执行 git add 命令。
提示含义:暂存区有新建的文件,如果想撤回,使用 rm 命令(初始化后第一次提交暂存区后的撤销用rm,后续的撤销用 restore,具体看提示,我看到的是这样,不知道准不准)
将暂存区移除了文件,又回到了未追踪的状态。重新执行add 命令添加到暂存区。执行 commit 命令提交到本地库
提示含义:要求输入提交信息。一般我们记录本地提交的修改。此时进入的是 VMI 编辑模式。可以直接在该模式下添加提交信息,编辑好后 wq 退出。(linux 命令操作)
提交完再次执行 git status 查看,没有什么需要提交的,暂存区也是干净的。
现在我们对文件 test.txt 做修改,刚才是空文件,没有内容。在文件中写一些文字,再查看状态。
提示含义:存在没有暂存的修改,使用 add 命令更新提交到暂存区,或使用 restore 撤销修改。(可能有的版本是 checkout 代替 restore)。也可以直接使用 commit 提交到本地库。我们执行add 操作后再查看状态,表示又提交到了暂存区。
这次使用commit 命令时直接带上提交信息,不在vim编辑器操作
一个文件修改成功,增加一行。查看状态,回到无未提交文件状态。
如果工作区有未提交的,git status 查看有红色提示,如果暂存区有未提交的,git status 查看有绿色提示
-
版本的前进和后退
要对版本进行操作,首先要查看版本。查看版本用 git log 命令
可以看到有3次提交记录。
commit e86ef496263813f6de280673821bbf2e765f6013 :提交版本哈希值
(HEAD -> master):当前版本为master ,HEAD 是 版本指针,我们对版本的前进和后退的实质就是操作这个指针git log 可以加参数,以不同的方式显示历史版本,如 git log -oneline ,在一行显示版本号(缩写的哈希值)和提交信息
git reflog ,在一行显示版本号(缩写的哈希值)、回退到版本的步数(HEAD@{1} 表示1步)、提交信息-
基于索引值的操作(推荐,可以前进也可以后退,根据版本/索引)
命令:git reset --hard [索引/版本号]提示 HEAD 已经在 e86ef49 edit test.txt 这个版本,我们来看一下文件内容,发现已经在 编辑 ASDFGHJK 之前的版本
或者再次查看版本历史,HEAD 指针在 e86ef49
-
使用异或符合 ^(只能前进不能后退)
命令:git reset --hard HEAD^
后退几步 就写几个 ^ -
使用 ~(只能前进不能后退)
命令:git reset --hard HEAD~n
后退几步 n 就是几
-
reset 命令的三个参数:
参数 说明 soft 仅仅在本地库移动指针 mixed 在本地库和暂存区移动指针 hard 在本地库、暂存区和工作区移动指针 -
对提交和撤销做一个操作总结
- 步骤 1:确保工作区、暂存区、本地库 状态一致
- 步骤2:修改工作区,提交到暂存区
- 步骤3:此时我们可以执行 git restore --staged test.txt 命令,撤销对暂存区的提交,状态回到工作区修改状态 ,当然也可以执行 git commit 命令提交到本地库,后面操作。 我们执行 git restore --staged,对暂存区进行撤销。
- 步骤4:撤销暂存区的修改后,我们可以使用 git add 命令重新提交到暂存区(如步骤2),也可以使用 git restore 命令撤销对工作区的修改,我们执行 git restore,撤销对工作区的修改,此时工作区、暂存区状态都还原到修改前。
- 步骤5:重新修改文件,提交到暂存区
- 步骤6:这次我们不提交到本地库,也不撤销暂存区,直接对文件进行修改,然后查看状态,暂存区和工作区均有未提交的修改。暂存区修改的内容是第2行,工作区修改的内容是第三行
- 步骤7:我们可以对暂存区的文件进行撤销,撤销后第2行和第3行内容均回到工作区状态,执行 git restore --staged 命令
- 步骤8:我们可以使用 git add 命令 将第2行和第3行 修改重新提交到暂存区,也可以使用 git restore 命令撤销工作区的修改。此处演示 git restore ,执行之后,修改的文件第2行和第3行在工作区已移除
- 步骤9:回到步骤6后状态
- 步骤10:刚才操作的是将暂存区撤销,这次操作 git add ,将工作区的修改,即第3行,提交到暂存区,这时候第2行和第3行状态又保持到一致了。
- 步骤11 :提交到本地库,在本地库产生了版本号,并且前面的3次新增,1次删除都在此次提交有体现
-
-
比较文件
命令:git diff [文件名]
效果:将工作区的文件和暂存区进行比较命令:git diff [本地库中的历史版本] [文件名]
效果:将工作区的文件和本地库进行比较如果不加参数[文件名],则比较所有文件
对文件作修改,不提交到暂存区,红色提示表示工作区有未提交的修改。 我们使用命令 diff 进行比较操作
六、git 命令行操作之分支管理
-
什么是分支
在版本控制过程中,使用多条线同时推进多个任务 -
分支的好处
- 同时并行推进多个功能开发,提高开发效率
- 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支废弃即可。
-
master 分支是在git 初始化后默认的分支,其实前面我们在git status 命令下已经看到过
-
查看分支
命令:git branch -v
-
创建分支
命令:git branch [分支名]
创建分支是基于当前的分支来创建的,创建后的分支与当前分支内容和版本都是一样的。 -
切换分支
命令:git checkout [分支名]
切换到刚才创建的分支 feature-1 ,发现源分支 master 中的文件 master-aaa.txt 也在分支feature-1中存在,验证了上述说明。 -
修改分支
对分支 feature-1 进行修改,新增文件 feature1-aaa.txt 文件,提交到本地库。修改之后两个分支的版本号就不一样了。
(在提交到本地库之前,新增或修改的文件对 其他分支也是可见的,提交之后只对所属分支可见)
-
合并分支
命令:git merge [分支名]- 合并分支之前,需要将被合并的分支切换为当前分支,如需要将 feature1 分支合并到master 分支,就要切换工作分支到master,合并之后feature1 分支中的文件 feature1-aaa.txt 就合并到 master 分支上了。
- 合并分支之前,需要将被合并的分支切换为当前分支,如需要将 feature1 分支合并到master 分支,就要切换工作分支到master,合并之后feature1 分支中的文件 feature1-aaa.txt 就合并到 master 分支上了。
-
分支冲突
-
当多个分支对同一个文件的相同行进行修改操作,因为git 是以行为单位对文件进行追踪控制,此时如果将这多个分支进行合并,git 就不知道以哪一个分支的修改为主,就会产生冲突。我们将master分支和feature1 分支中的feature1-aaa.txt进行编辑,分别添加内容 master edit 和 feature1 edit ,并提交到本地库。
-
合并feature1 到 master,提示文件 feature1-aaa.txt 自动合并失败,并且分支进入合并状态
-
打开分支的 feature1-aaa.txt 文件 ,看文件内容,两个分支的修改都在一起,中间以 ======分隔开,此时需要我们手动处理。
-
解决冲突
手动编辑文件到希望的状态。在实际的开发工作中,就需要冲突代码的双方程序员沟通。如本次修改为
-
修改完后查看状态,提示有未合并的目录
-
使用 git add 命令解决冲突,git commit 提交本地库。此时提交的 commit 不需要加文件名。
-