Git教程1-生存篇 - Go语言中文社区

Git教程1-生存篇


前言

作为一个嵌入式工程师,一直都想掌握git这个版本管理神器,网上的许多git教程,有的特别冗长有几十个页面,有的又过于简单就是介绍介绍功能,感觉就是介绍一遍git的功能,是在玩git而不是让git实用起来。本教程立足于如何让一个嵌入式工程师掌握git,能够方便快捷地实用git,我也在正在逐步学习,会不定期更新教程。

首先git有许多图形化工具,但是前期请实用命令行,一个是命令行的功能更丰富,适应性强,一个是如果不清楚哪个按钮会执行什么样的命令的话,乱点是极有可能导致整个版本错乱的。

Git 工具链

Git工具链主要是提供了git命令的可执行文件,windows下还提供了一个shell,可以方便滴使用一些简单的linux命令。无论是使用命令行工具还是图像化操作界面,都需要先安装Git工具链,linux发行版一般自带,windows需要安装。
下载地址

Git服务器

Git是分本地(Local)和服务器(Git Server)的,如果你能翻墙,强烈推荐Github(允许5个私有项目,edu邮箱注册更多);如果你能翻墙,并且需要建立较多的私有项目,推荐Bitbukcet(教育网空间更大);如果你不能翻墙,咳咳,乖乖用Gitee(码云)吧;如果你是实验室学生或者公司团队,你可以搭建一个内部的git服务器,强烈推荐Gitlab,乌克兰不仅盛产美女也盛产程序员,恩恩,Gitlab的搭建过程非常简单,详情见 Git教程之局域网服务器搭建教程(Gitlab) ;还有一个骚操作,可以自动同步的云盘(google/dropbox等)是极好的个人git服务器,把git目录推上去即可。

前面都是介绍(废话),现在开始正式教程。这个教程我们采用案例的流程来学习git,并在中间穿插基础知识,不适合老鸟。。。。首先假设你是一个嵌入式工程师。。。

场景假设

道具准备

  • 一个已有的工程(比如stm32),注意备份,别误操作玩坏了
  • 一个git服务器账号,anyway,假设是github
  • 一台装好git工具链能上网的电脑,假设这是一只win10

剧情

这是我常遇到的游戏路线,选择你喜欢的玩耍,有补充的可以留言。

  1. 建仓:新建远程仓库和本地仓库,把已有的代码添加到仓库,提交并上传到远程仓库
  2. 拷仓:另一个小伙伴(另一个电脑,或者另一个目录)需要下载这个仓库,修改了部分内容,提交并上传
  3. 改仓:原来的小伙伴先修改了内容,如何更新仓库,啊,pull不下来
  4. 移仓:老板说github被微软收购了,信仰崩塌,让我把仓库移到gitee上
  5. 查仓:咦,我的程序跑不了了,我上上个版本能用的来着(对比,查看修改内容)

具体步骤

建仓

  1. 在本地新建一个空文件夹,这里取名gitDemo,进入空文件夹后右击空白处选择“git bash here”

在这里插入图片描述

  1. 会弹出一个命令行窗口,这个命令行窗口可以执行git指令及许多linux指令。首先设置用户信息,用户昵称和邮箱,这个信息会记录在提交的版本中,请认真填写:
git config --global user.name "xiaoming"
git config --global user.email "xiaoming@gmail.com"
  1. 然后我们需要初始化git文件夹(只有空文件夹才可以初始化git):
git init
  1. 这个会在目录下生成一个.git文件夹,用来保存版本控制的信息,不要随便乱改哦。然后我们原来嵌入式工程里的文件拷贝到这个文件夹里(没有的小伙伴可以随便新建几个文件)。然后查看一下版本状态:
git status

在这里插入图片描述
红色的字代表这个文件还没有被“暂存”,git对本地文件的管理分三个空间:workspace(工作空间,就是你当前直接看到的、编辑目录),stage/index(暂存空间,文件提交前要先放在暂存空间),respository(版本库,这里存放着你曾经提交的所有版本信息),当前目录的文件根据被更新的层级相应的会处于unstaged/untracked(未暂存),staged(未提交),commited(已提交)三种状态。现在就处于unstaged/untrucked状态。
在这里插入图片描述

  1. 接着我们需要暂存这个文件:
git add .

git add 是暂存/跟踪(第一次叫跟踪,以后叫暂存,第一次就是不一样),常见的用法有

% 暂存指定的目录
git add /User
% 暂存指定拓展名的文件
git add *.c
% 暂存当前目录的所有文件
git add .
% 暂存已跟踪的文件,即有过第一次add的文件
git add -u
  1. 然后我们再次使用“git status”查看文件的状态:

在这里插入图片描述
会发现原来那些红色的文件名变绿了,咦,我怎么把.obj文件也加进来了,这种编译生成的文件又大有没有记录价值,怎么办?

  1. 我们可以使用git rm --cached命令来移除暂存区不需要的文件:
% 这个命令支持和add一样的文件筛选表达式如/Prj,*.jpg,.等
git rm --cached "*.obj"

注意路径表达式要加双引号,否正有可能识别成指令。接着我们使用git status来重新查看文件状态,会发现obj文件已经变回unstaged状态。

在这里插入图片描述

但是,每次都这样add再移除是不是太麻烦了,作为程序员的我们当然不能这样解决问题。

  1. 使用.gitignore文件来筛选要跟踪的文件。windoes下面不能直接新建‘.’开头的文件,所以需要用shell指令来新建。
% 新建gitignore文件
touch .gitignore

然后去工程目录下面直接拿文本编辑器修改这个文件,建议用notepad++之类有语法高亮的编辑器,当然像我这种会vim的童鞋可以直接在shell下面编辑,嘻嘻。在里面加入你需要屏蔽的目录或者文件:

*.pdb
*.manifest
/Prj
!/Prj/Objects/*.axf

注意一行一条,gitignore的规则有很多,不过我常用的就几条:

# 屏蔽一个目录或文件,这个路径是从gitignore文件所在目录为根目录算起
/Prj
# 屏蔽一类文件
*.o
# 屏蔽所有目录下的某个子目录,如/obj, /Sensor/obj...
**/obj
# 保留某个目录或某个文件,比如只想留下可执行文件
!/Prj/Objects/*.axf
  1. 然后我们先使用git rm --cached移除所有暂存文件,然后添加gitignore文件,再添加其他文件。
% 移除所有暂存文件, -r表示以递归地形式删除
git rm -r --cached '.'
% 加入gitignore
git add .gitignore
% 再次添加所有文件
git add .
% 查看现在的状态
git status

这样我们以后每次修改完文档只需要使用git add .就可以暂存所需要的文件了

  1. 然后我们需要把暂存区的内容提交本地的版本库
% ‘-m’ 后面带就是版本介绍信息,要好好写方便以后查看
git commit -m "firstVarsion"

如果你在提交之后发现,我们刚才写的版本信息有一个单词拼错了,后来我又想加入一个新文件如readme(加到工程目录下,下一个任务需要),但是又不想产生一个新的版本,这时可以使用下面的命令:

% 使用这个指令后,会弹出文本编辑器,修改完保存退出即可
git commit --amend

如果你安装git时选择的默认文本编辑器是vim,那么恭喜你,这个时候会进去vim编辑器,这个编辑器嘛,咳咳,不了解的可能怎么退出都不知道。这里介绍几个vim的生存指令,首先建议在英文模式下编辑,i进入编辑模式(下面会出现‘插入’字眼),按ecs退出编辑模式并进入命令模式,在命令模式下输入”:wq“即可保存并退出。

这样我们就完成了本地版本库的建立和管理,以后的在本地的工作流程就是编辑,add,commit。

  1. 平时查看本地的版本库使用git log指令:

在这里插入图片描述

  1. 一般我们需要把本地的版本库提交到git服务器,方便大家的交流(拷贝),以及在多个终端(电脑)上进行修改。这里以github举例,首先去注册一个账号并验证邮箱。

在这里插入图片描述

  1. 然后登入github,新建一个仓库,这里取名gitDemo

在这里插入图片描述

  1. 建好后进入仓库,把仓库地址复制出来,记得选择http模式

在这里插入图片描述

  1. 接着在我们刚才的本地的gitDemo的git bash(终端)里加入这个远程库
% origin是远程仓库别名别名,你爱取啥取啥
git remote add origin 地址
  1. 然后把本地仓库提交到远程仓库
% 第一次提交
git push -u origin master
% 以后的提交
git push

其中-u是指定默认仓库,第一次提交需要使用,origin是仓库别名,master是分支。分支的概念在以后讨论,大致是一套代码可以有多个版本,主版本叫master,其他分支,你爱取啥取啥。

  1. 正常输入后会弹出github的登入界面,输入账号密码即可。

在这里插入图片描述

什么?不想每次push输入账号密码?嗯,可以使用以下指令记住密码,使用后再进行一次成功的登入(push pull都可以)即可成功记住密码。

git config credential.helper store

push成功后会终端会出现以下提示

在这里插入图片描述

如果出现“error setting certificate verify locations”,这是证书错误,使用以下命令解决:

git config --system http.sslverify false

第一条剧情到了这里就完结了,这是最长的一条,毕竟主线,码字好累。

拷仓

  1. 克隆,在另一台电脑(在另一个文件夹里也可以),新建一个空的文件夹gitDemo2,进入这个文件夹,右击git bash here打开命令行终端。键入以下指令:
git clone 地址

这个git clone指令是用来拷贝已有的远程仓库。这个地址是建仓中在github上新建的仓库的http地址(13步复制得到的地址)然后在弹出的对话框里输入账户密码(同一台电脑有可能已经记住密码了),确定后就可以看到刚才push上去的项目被拷贝下来了。

  1. 然后我们来修改reame.txt文件,

在这里插入图片描述

  1. 接下来的步骤与上一个场景中的一样,先add添加到暂存区,再commit到本地版本库,成一个新的版本,最后push到远程库
# 查看修改了哪些部分
git diff
# 添加修改的部分
git add .
# 提交到本地版本库,注意前后单引号都是英文符号才可以
git commit -m '第二个地方的修改'
git push

git diff这个指令是用来查看版本之间的差异的,具体功能在后面的章节介绍。
在这里插入图片描述

这样就完成了在另一个地方的修改、提交、推送,日常常用这两套技能就差不多了。

改仓

接下来我们来处理一个常见的问题。正常个人使用的时候,我们是不会在两个地方同时对工程进行修改,所以在每个地方修改工程都是先pull再push,这样是不会出问题的。但是,如果有多个人协作工程的时候就会遇到版本冲突的问题。如,

  1. 我们回到第一台电脑(第一个地方),先修改readme文件,然后再执行
git pull

git pull 指令是把远程库的内容更新到本地库,同时在不冲突的情况下更新工作空间,需要注意的是,这个指令不会修改本地仓库的head指针,即本地仓库目前默认的版本原来是哪个版本现在还是哪个版本。git pull还有以下常用功能:

# 更新当前默认的远程仓库的当前分支
git pull
# 更新指定远程仓库的默认分支,远程仓库名(orgin)
git pull orgin
# 更新指定远程仓库的指定远程分支到本地指定分支,远程仓库名(orgin),远程分支名(next),本地分支名(master)
git pull orgin next:master

然后我们会发现出现错误,因为远程的readme和本地的readme冲突了。

在这里插入图片描述

  1. 有以下几种方法解决这个问题
  • 放弃第一个版本,让它回到修改前的状态,这是很常见的修改方法
# 先切回修改前的状态
git checkout .
# 重新pull
git pull
  • 把工作空间暂存到一个快照,pull下来后,再处理冲突
# 暂存第一个版本的内容到快照空间
git stash
# 更新版本
git pull
# 弹出快照内容
git stash pop

在这里插入图片描述
git stash 是git快照工具,可以把工作空间通过压栈和弹栈的方法临时管理工作空间的内容,常用的指令如下

# 把当前的工作空间保存快照
git stash
# 现实已保存的快照列表
git stash list
# 把指定的快照恢复到工作空间(会保留冲突),加上--index代表同时恢复暂存空间;stash表示要恢复到的快照版本,省略代表最近的快照
git stash pop [--index] [<stash>]
# 删除已有的快照
git stash clear
  1. 然后我们需要处理冲突,使用编辑器打开readme文件,然后把它修改到需要的版本,然后再次提交,推送即可完成冲突的处理。这里我们手动处理冲突,更复杂的冲突可以使用diffmerge等可视化工具来辅助完成,这些内容以后再介绍。带有冲突的文件,会有以下的字符:

在这里插入图片描述

移仓

原来使用github当git服务器,用着发现好慢,而且还有这样那样的限制,如果实验室有能力的话可以自己搭一个git服务器,这个时候就需要把仓库移过去。这里以实验室自己搭的gitlab举例。

  1. 注册gitlab账号,然后新建仓库“gitDemo”,复制仓库的http地址

在这里插入图片描述

  1. 在本地的gitDemo文件夹里右击打开git bash终端,添加这个地址
# gitlab是别名,可以自己取;后面的是gitlab仓库的地址
git remote add gitlab 'http://git.xxxx.cn/xxx/gitdemo.git'

git remote是远程库管理指令,我常用的有:

% 查看远程仓库列表
git remote -v
% 添加远程仓库
git remote add 别名 地址
% 从列表删除远程仓库
git remote rm 别名
% 重命名列表中的远程仓库别名
git remote rename 原别名 新别名
  1. 然后我们先查看远程仓库,会发现多一个条记录。接着,我们使用push指令修改默认的远程服务器。
% 查看远程仓库列表
git remote -v
% 设置默认远程仓库并推送, gitlab是远程仓库别名,master是要推送的分支
git push -u gitlab master

在这里插入图片描述

如果是gitlab的话现在可以从网上的客户端看到远程的仓库已经更新了。

  1. 有需要的话可以删除原来github的远程仓库,
    这样仓库的转移就完成了。

查仓

这个任务,我们主要学习如何比较各个版本的差异。
首先让我们“制造”一些差异,我们先修改readme文件,在最后面添加一行“暂存的内容”,保存后使用git add readme功能把内容提交到暂存区,然后再次修改readme文件,把最后一行改成“工作空间的内容”,最后保存。

  1. 使用git diff指令查看各个空间的差异,省略文件路径会显示所有修改的文件,可以使用git log查看版本id。
# 工作空间和暂存区的差异
git diff 文件路径
# 工作空间和本地默认版本库(head)的差异
git diff HEAD 文件路径
# 暂存区和本地默认版本库(head)的差异
git diff --cached 文件路径
# 两个版本库之间的差异
git diff [<commit-id>] [<commit-id>] 文件路径
# 工作空间与指定版本之间的差异
git diff [<commit-id>] 文件路径
# 工作空间与快照空间之间的差异
git diff stash@{0} -- 文件路径

在这里插入图片描述

  1. 在知道了如何比较两个版本之后,我们需要读懂版本比较时的标识符,详细信息如下图所示:

gitDiff

  1. 运行git diff命令后,会进入一个命令操作状态,掌握一些简单的操作命令是需要的。
    在上一步所示的界面里需要使用一些指令来操作:
命令 功能 描述
q 退出 回到git命令行
h 帮助 显示此模式支持的命令
j或↑ 下一行 光标移动命令
k或↓ 上一行 光标移动命令
f 下滚一屏 光标移动命令
b 上滚一屏 光标移动命令
= 显示进度 显示当前光标在文档中的位置
/表达式 搜索字符串 支持正则表达式
:e 打开文件 若文件不存在会报错

一些其他的经验

  • 删除和重命名文件请实用git指令,而不是简单地实用文档浏览器操作,不然极易导致版本库崩溃,尤其是删a.c,过了一一会儿又新建a.c。。。
  • 先学习git命令行操作,命令行操作,命令行操作,重要的事情说三遍!!!
  • 如何保存账号密码
    在gui bash里面键入以下命令后,再有一次成功的登入系统就会记住密码,如果希望全局设置这个属性可以加上–global选项
git config credential.helper store
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/linxiaobo110/article/details/89638165
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢