Git 常用操作和工作流程
1、前言
在转行到软件一行之前,就听本专业的同学提到Git在实践中的重要性。孟宁老师带我们学习了Git的基本用法。故我整理了相关知识点,包括了git本地库的基本命令、git本地库和远程库的交互、以及多人协作的实例,来展现git和github的常见用法。本文的顺序即是我的学习路线。
本文使用git终端命令行Git Bash来展示相关命令。使用Github展示本地库和远程库的交互。
本文主要参考自:https://mp.weixin.qq.com/s/Km5KuXPETvG0wCGHrvj9Vg 。
2、关于版本控制工具
版本控制工具应该具备的功能有:协同修改、数据备份、版本管理、权限控制、分支管理。目前常见的版本控制工具有两种,一种是集中式的版本控制工具,例如 CVS,SVN,VSS,还有一种是分布式的版本控制工具,例如Git,Bazaar等。
本文所用的Git,相比较其他版本控制工具,有诸多优点。如,Git中大部分操作可以在本地完成,尽可能增加数据而不是删除和修改数据,分支操作非常快捷流畅,与Linux命令兼容等。
3、本地库相关命令
3.1 本地库操作的基本逻辑

3.2 本地仓库的初始化
3.2.1 初始化仓库
命令: git init
效果:
注意:首先在需要创建本地库的文件夹,进入文件夹,执行指令 git init。此时如果查看文件夹,如下图,会发现多了一个隐藏的文件夹 .git,这个目录中存放的是本地库相关的目录和文件,注意不可随意删除。

3.2.2 设置签名
命令:
git config username [用户名]
git config email [用户邮箱]
git config --global username
git config --global email
效果:

注意:
设置签名的目的是为了区分不同的开发人员。命令有两种,一种是仓库级别的,仅在本仓库可用。另一种是操作系统级别的,设置了--global参数,表明本操作系统的用户均可使用。此信息的保存位置在./.git/config文件夹中。上例中,我使用了全局的签名设置。
3.3 本地库的基本操作
3.3.1 查看工作区和暂存区的状态
命令: git status
效果:

注意:上图表明,目前我们在master分支上,工作区没有内容可以添加“add”,暂存区没有内容可以提交“commit”。
3.3.2 创建一个新文件,使用vim编辑器
命令: vim 文件名
效果:
![]()
注意:
上述代码回车后会进入vim编辑器的窗口,如下图所示。我们在编辑器中插入一段文本后,按下ESC进入命令模式,再按下 :wq 强制保存退出到git命令行界面。

见下图:此时我们再次使用 git status 看提交状态,发现文件变为红色,命令行提示我们应该使用 add 命令将修改后的、工作区的文件添加到暂存区。

3.3.3 添加文件
命令: git add[File Name]
效果:

注意:如上图,此时再用 git status 查看提交情况,提示我们用 commit 命令提交文件到本地库。
3.3.4 提交文件
命令: git commit -m "commit message" [filename]
效果:
注意:提交完毕后,再次查询 git status ,显示没有可以提交的内容了。至此,本次改变由工作区 add 到暂存区,再从暂存区 commit 到本地库,完成一次修改。
3.3.5 查看提交的历史记录
命令(四种):
git log git log --pretty = oneline 在一行中显示记录 git log -- oneline git reflog 所有的提交的记录,包括指针返回历史版本的记录
效果: 我在vim中打开text1,在末端添加了一行“666”(如下图所示)。并且提交 commit到本地库。然后执行 git log :



注意:查询之后有两个版本的提交。每个版本左侧的数字其实是哈希值,每次提交产生的哈希值都是独一无二的。蓝色的HEAD表示一个指针,指向主分支(master)上当前的版本。注意这两种查询方式略有不同,前一种完整显示哈希值(索引值);后一种显示部分索引值,并且会完整显示每一次回退的记录。
3.3.6 版本回退
命令: git reset --hard [局部索引值]
效果:

注意:
- 回退和前进的本质是移动HEAD指针,指针指向哪个版本,就前进、后退到哪个版本。
- 上述操作中,我用reset命令,将HEAD指针指向text1未增加新行之前的局部索引值,从而实现了版本后退。我用 git log 查询后发现只剩下一条提交记录,说明回退成功。用 cat 命令打开此文件,文件中没有增加新行,再次确认了回退成功。
- 这里的 git reset 命令有三个参数,分别是 --soft,--mixed,--hard 。--soft 仅仅在本地库移动HEAD指针,--mixed在本地库移动HEAD指针并且重置暂存区;--hard在本地库移动HEAD指针,并且重置了暂存区和工作区。在此不做演示。
- 假如我删除了一个文件,并且把状态提交到了本地库,那么可以通过移动指针,指向删除之前的版本,注意在git中的,所有操作是一个线性的过程。
3.4 分支操作
3.4.1 查看分支、创建分支、切换分支
命令:
git branch -v
git branch [新分支名]
git checkout[分支名]
效果:
注意:
- 首先我查看了当前的分支,发现只有一个master分支;
- 接着创建hot_fix分支;
- 再次查询分支,现在是两条分支;
- 使用命令 git checkout[分支名] 切换到hot_fix分支上。
3.4.2 合并分支
命令: git merge [分支名]
效果:如下图:我在hot_fix分支上,用vim打开text1.txt,修改了其中的内容,并且提交,此时,hot_fix分支比master分支领先一个版本。如果我期待将修改好的分支与主分支合并,可使用 git merge [分支名] 。


注意:
- 查看当前分支,发现在branch上,首先切换到master分支上。
- 使用git merge命令合并hot_fix分支。
- 查看文件,确定合并成功。
4、远程库相关操作
在这里我在github上有一个远程仓库,模拟pull和push的操作。
4.1 远程仓库的初始化
在github上新建一个远程仓库.

4.2 clone项目到本地

使用命令: git clone [HTTP地址] ,还有其他方式例如使用SSH,再次不做赘述。

进入仓库文件夹,查看分支,发现只有一个master分支:

命令 git remote -v 可以查看远程地址名,其中,origin是远程地址的别名:

4.3 使用push推送到远程库
在本地我创建了一个分支hot_fix,并且切换到hot_fix,使用了命令 git branch [分支名] , git checkout [分支名]

在此分支上,我在clone下来的唯一的文档里新增加一行文本,用vim打开如下:

修改完成之后,我将此修改 add 到暂存库, commit 到本地库:

回到主分支,将修改在本地合并:
使用命令: git push origin master 将本地修改推送到远程仓库。
打开github上的文档,发现推送成功。
4.4 使用pull 拉远程库的更改
我在github上直接增加了一个文档,用于假设团队合作中,远程库的主分支被修改的情况。

使用 git pull 命令将远程库拉到本地。查看本地文件夹,多了新文件,说明成功。

4、团队合作的交叉合并
在第三部分已经演示了在本地分支修改并且与主分支合并的情况。假如给上述案例增加难度,在本地分支进行更改的时候,如果远程库的主分支提交了新的记录,此时我们是不能合并的。我们要先用上述的 git pull 指令拉取远程库的状态,再与本地合并。注意 git pull 相当于 git fetch && git merge origin/main 。
5、关于Git Rebase
还是上述的远程库,模拟一下Git Rebase的过程。
首先,我在pull下的本地分支上,提交了两次修改,以下是两次commit信息:

接下来执行指令: git rebase -i HEAD~2 ,追溯到最近两次提交记录。
命令行会打开一个文件,如下图所示,注意上方有两个索引,分别对应最近两次提交:

此时我想放弃第一次提交,于是将第一条记录的pick改成drop,保存退出,回到命令行:

由于第二次提交基于第一次提交的版本生成,所以不出意外会报错:

注意命令行提示我们修改报错的文档,所以我们打开文档修改,文档已经用标记标明了要修改的地方:

删除多余标记,修改到满意为止。修改完成后,关闭文件。此时,注意要提交到暂存区。执行 git add 。
最后,我们执行 git rebase --continue 完成两次提交的合并。当然也可以使用 git rebase --abort 放弃rebase。执行成功结果如下:

5、总结
通过这节课的学习,我知道了如何初始化本地库,进行本地库的基本操作;如何创建远程库,远程库和本地库是如何交互的。并且,我发现阅读命令行的提示可以很好地解决实践中遇到的大部分问题。

浙公网安备 33010602011771号