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、总结

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

posted @ 2020-10-06 19:41  起什么昵称好呢  阅读(294)  评论(0)    收藏  举报