代码备份管理 —— Git工具


Git 版本工具

记得刚接触程序开发的时候,也不知道有Git这样的工具,都是每完成一个功能模块的调试就备份一个工程副本,完成十个就有十个副本,每个副本之间的差异找起来非常费劲,时间一长,改了什么地方也记不得了。这是一个问题,那肯定有解决问题的办法。

如果你是一个程序员,那必须要管理代码版本,用Git工具一定是不错的选择。
如果你不是一个程序员,也是可以用Git,因为它能管理任意文件的版本,不过极少人这么做,因为有了云端出现。

通常大项目的软件不可能由一个人独立完成开发的,而是团队分工,协同开发,最后得到一个完整的软件。团队开发中每个人在各自的电脑上开发自己负责那部分,开发期间每个阶段的功能也需要合并在一起进行测试,直到最后发布。那用什么方式来合并呢?选择Git工具就对了,每个开发者应该固定有不能删除的两个分支(主分支master和dev分支),然后有可增删的功能分支,在功能分支上开发,然后合并到dev分支进行测试,最后合并到主分支进行发布。

Git工具是采用分布式管理版本的,所有用户的电脑都是一个服务器(本地仓库),用户修改和获取代码都是提交到自己的服务器中,不需要网络就可以进行工作,只有需要与远程仓库同步(推送或拉取操作),才需要网络,同步后的每个电脑都保存了所有版本,只要还有一个电脑正常,备份的版本就不会丢失。
在这里插入图片描述

工作区:存放开发者经常修改的实际代码文件。
暂存区:代码提交到本地版本库之前的临时存放区域,存放的是文件列表,而不是文件。
本地版本库:存放历史提交的不同版本的代码。

Git的安装是非常简单的,在官网下载安装包(不大,几十个MB),默认安装即可。

安装后查看一下是否安装成功,在 cmd 命令窗口运行git --version命令。

git --version

在这里插入图片描述

或者右击桌面空白处,可以看到Git工具。
在这里插入图片描述

提示:
1、每条git命令使用方法可以用命令 " git 命令 --help ",回车即可打开该命令的使用说明,每条命令的使用格式都很多,边用边学,用不到的先不学。
2、按Tab建可以补全命令,提高输入效率。
3、在命令窗口右击,option > text > select 可以调整字体大小。
4、按Insert键可以粘贴剪切板的内容

比如查看init命令的使用。

git init --help
或 git --help init

在这里插入图片描述

常用git命令:
1.clone(克隆): 从远程仓库中将代码复制到本地仓库
2.checkout (复制出):从本地仓库中复制出一个子分支,然后进行修订
3.add(添加): 在提交前先将代码提交到暂存区
4.commit(提交): 提交到本地仓库。保存提交的各个历史版本
5.fetch (抓取) : 从远程仓库抓取文件到本地仓库,但不进行任何的合并动作。
6.pull (拉取) : 从远程库拉取文件到本地库,自动进行合并,并放到工作区,相当于fetch+merge
7.push(推送) : 合并代码到远程仓库

常用非git命令:
1、cd 目录名/ ——切换到某个目录
2、ls ——列出当前目录所有文件
3、rm 文件名 ——删除指定文件
4、touch 文件名 ——新建文件
5、cd 两个点 ——退回上一层目录

一、备份在本地仓库

在写代码的时候,实现了某个功能,增加了某个测试功能,修复了某个bug,都需要备份成单独的版本,方便对比版本之间的差异来分析问题,也可以恢复到旧代码,这些常用的基本操作Git可以帮你轻松实现。而不需要像传统方式那样,使用一个个文件夹备份不同版本,这样做的话,迟早会抓狂。

让Git来帮你管理代码版本,最基本的思路是这样的:
1、把工程文件夹初始化为git仓库,这样一来文件夹里的所有文件就能被Git跟踪管理了,如果有一些文件或文件夹不需要git跟踪,那么在工程文件夹下增加一个 .gitingore文件来处理。
2、文件夹的文件内容有改动后,添加到暂存区,提交到本地仓库。
3、推送到远程仓库。

对代码文件管理前,先进行Git全局设置

git config --global user.name “用户名”
git config --global user.email “邮箱地址”
查看设置结果
git config --list

git config --global user.name "gl"
git config --global user.email "992651107@qq.com"

git config --list

结合简单的实例来演示基本命令的作用。

1、建一个空文件夹,用来放你的代码文件。进入文件夹,右击选择Git Bash Here。
在这里插入图片描述
2、在当前文件夹下创建Git仓库,该文件夹的内容就能够被Git去管理了。Git本地仓库是属性为隐藏的文件夹。

创建Git本地仓库的git命令

git init

在这里插入图片描述
3、新建代码文件main.c。
在这里插入图片描述

#include <stdio.h>
int main()
{
	int i = 2;
	long d = 0;
	d = i * 65536;
	printf("d = %ld\r\n",d);
	return 0;
}

4、查看文件夹里文件的变更情况。Untracked files表示文件未被跟踪(标记红色),因为还差一步。

查看文件夹状态的git命令

git status

在这里插入图片描述
5、怎么让Git去跟踪文件?把文件添加到仓库的暂存区就可以了。再次查看文件夹状态,看到被添加的文件已被跟踪了(标记绿色)。

把文件添加到暂存区的git命令

git add 文件 //添加指定文件到暂存区
git add . //添加所有文件到暂存区
git add -u //只添加变更的文件到暂存区

在这里插入图片描述
在文件添加到暂存区之前,可以新建一个 .gitignore文件,在文件中添加不需要跟踪的文件夹或文件名

touch .gitignore

.gitignore文件内容规则如下:

*.log #忽略所有 .log 文件
*.txt #忽略所有 .txt 文件
!mytext.txt #但跟踪特定的 mytext.txt 文件
node_modules/ #忽略整个 node_modules 文件夹
!obj / *.hex #不忽略文件夹下的hex文件

查看被加入版本管理跟踪追踪的文件列表

git ls-files

如果跟踪列表有更新,则先删除列表,再添加文件到暂存区

git rm -r --cached .

6、还差最后一步就能备份版本。就是提交文件到仓库,自动生成版本ID号。

提交暂存区的所有文件到仓库的git命令

git commit -m "版本信息描述"

在这里插入图片描述
7、查看提交的历史版本,如果版本较多,按向下键继续查看,按Q键退出查看。

查看提交的历史版本信息的git命令

git log //查看当前分支的所有提交记录
git reflog //查看所有分支的所有记录

在这里插入图片描述
8、对代码文件做一些修改,再提交到仓库。

#include <stdio.h>
int main()
{
	int i = 2;
	long d = 0;
	d = i * 65536;
	printf("d = %ld\r\n",d);
	printf("size: i(%d)--d(%d)\r\n",sizeof(i),sizeof(d));
	return 0;
}

每次做了修改,习惯先查看状态,再添加和提交。
在这里插入图片描述
9、查看版本之间的所有差异。先查看提交的历史版本信息。再对比具体差异。

git diff 版本号n 版本号m   //版本号顺序不同,结果就不同

历史信息中 HEAD@{编号} 的编号越大,表示版本越早。

git diff 版本0 版本1,结果是版本1相比版本0,删掉了一行代码(标记红色)。

在这里插入图片描述

git diff 版本1 版本0,结果是版本0相比版本1,增加了一行代码(标记绿色)。

在这里插入图片描述
10、将变更信息生成补丁文件 file.patch。

方法1:git diff 版本n 版本m > file.patch

将指定的两个版本差异保存到一个patch文件。
在这里插入图片描述
在这里插入图片描述

方法2:git format-patch 版本n 版本m

将每个版本的差异保存到单独的patch文件。
在这里插入图片描述
在这里插入图片描述

二、与远程仓库同步

本地仓库只是在自己的电脑上,其他人并不能看到,只有推送到远程仓库才能被别人看到。

远程仓库可以是创建在GitHub、GitCode或GitLab等等代码托管平台网站上。

前期工作:
1、在网站上注册账号,登录账号,添加SSH密钥。
2、创建仓库,就有仓库的URL地址(分为HTTPS和SSH两种)。

添加SSH密钥步骤:
1、在Git GUI Here中生成key
2、把key拷贝粘贴到托管平台账号的SSH密钥上即可

2.1 推送现有Git仓库到远程

推送到已存在的远程仓库的步骤:
1、首次推送,则先使用 git remote add 关联到远程仓库。

git remote add <远程仓库源名> <远程仓库源地址> 
比如 git remote add origin git@192.168.50.24:xxx..git //使用该方式推送需要输入密码,如果不想输入密码,可以更换成HTTPS方式
设置成HTTPS方式
git remote set-url origin http://192.168.50.24/WUCP/xxx.git  //这样在推送时就不需要再输入密码了

2、查看被关联的远程仓库,origin表示远程仓库源名。

git remote -v

在这里插入图片描述
3、推送本地版本库到远程仓库。推送的是被commit的版本。

git push <远程仓库源名> <本地仓库的分支名>
比如 git push origin master

4、删除关联的远程仓库

git remote rm origin URL

2.2 创建一个新仓库

克隆远程仓库到本地,URL就是已经存在的远程仓库源。
1、使用 git clone URL地址 进行克隆,如下。

git clone https://gitlab.com/gitlab-org/gitlab.git
或 
git clone git@gitlab.com:gitlab-org/gitlab.git

克隆成功后,可以看到出现远程仓库文件夹,文件夹里自动创建了一个git仓库。后续使用 git push origin master 直接同步到远程仓库即可。

git clone git@192.168.50.29:WUCP/codes.git //克隆远程仓库,本地目录会创建文件夹codes(本地仓库目录)
cd codes //进入仓库目录,其目录下才有 .git文件夹

把需要推送的文件(也可以是文件夹形式)拷贝到codes里,就可以推送到远程仓库codes。

三、分支的妙用

3.1 在子分支上调试,不影响目标分支

本地仓库被创建后,其默认只有一条分支,分支名是master,也是主分支。

查看所有分支的命令: git branch
查看所有分支详情的命令: git branch -v

git branch //查看所有分支
git branch -v //查看本地仓库所有分支详情
git branch -r //查看远程仓库所有分支情况

在这里插入图片描述
除了主分支,还可以创建子分支。主分支和子分支分别用来干吗?
在这里插入图片描述

master分支:该分支用来保存经过测试的稳定代码,用来在发布新版本的时候使用,正常情况下是不能修改的。

子分支:开发新的功能或修复bug。分支中的代码在创建时与当前分支的内容完全相同。不影响主线,主线可以继续做它的事。
发挥的作用:在你的代码未完整之前,又想提交到git管理,你可以创建分支,别人看不到,也不影响别人,你开发的代码就提交到自己的分支上,等功能完善后,一次合并到主分支上,适用于多任务并行开发的情况

分支好比平行宇宙,永远没有交点,一个你在学散文,另一个你在学英语,互不影响,但在某个时间点执行合并后,你既会散文也会英语了。

当前所在分支是散文
git merge 英语  //将英语分支合并到散文分支

在当前分支创建一个新的子分支,子分支的命名应该是有意义的,可以表达改分支的用途,比如包含父分支和用途,masterReCharge,即父分支是master,用途是调试复充:

git branch develop //创建新的子分支,其代码跟当前分支的一样

git checkout develop //切换到刚才创建的子分支,切换分支的同时,工作区的代码也跟着切换到对应分支的代码

子分支同样可以推送到远程仓库,这样在远程仓库自动多了同样的分支

git push origin develop

举例子分支的使用场景:
1、仓库被创建后,只有master主分支,通常它是用来放正式发布的版本。
2、不应该在正式发布的版本上修改代码,那么就需要在master分支上创建新的子分支develop。
3、在子分支develop上修改代码,可以在每确定一个功能后合并到master分支上进行正式发布。
4、有时候可能需要一些专用测试版本,那么可以在master或develop上创建子分支test。
5、在子分支test存放发布的测试版本,所以还需要在test分支上再新建子分支进行代码修改和验证。

GX-38014@GSPC22002102 MINGW64 /d/GitRepository/gs-1410 (pdtest)
$ git branch -v
  develop 4606d3f 发布为DV2,CRC为BF84
  master  4606d3f 发布为DV2,CRC为BF84
* pdtest  328f00e 增加入仓或关盖3秒后触发读取耳机序列号(用于产测的程序)
  test    328f00e 增加入仓或关盖3秒后触发读取耳机序列号(用于产测的程序)

3.2 在提交历史的某个版本上修改后提交

开发过程中提交多个测试版本,最后认为前面的某个版本才是稳定的,想在那个版本上继续修改。

当需要在提交历史的某个版本上修改后提交,步骤如下:

一、找到要修改的版本

使用 git log 命令查看提交历史,找到你想要修改的那个版本的提交哈希值或者版本号。

二、创建新分支

根据要修改的版本创建一个新的分支,假设要修改的版本哈希值是 abc123 ,可以使用以下命令:

git checkout -b new-branch abc123 

这将创建一个名为 new-branch 的新分支,并切换到这个分支,且该分支指向的版本就是你要修改的那个版本。

三、进行修改

在新分支上进行你需要的修改,可以修改文件内容、添加新文件或者删除文件等操作。

四、提交修改

1.使用 git add 命令将修改的文件添加到暂存区,例如:
git add. (将所有修改的文件添加到暂存区)
2.使用 git commit 命令提交修改,并添加有意义的提交信息:
git commit -m “描述你的修改内容”

五、将修改合并到主分支

1.如果你希望将修改后的内容合并到主分支或其他分支,可以先切换到目标分支,比如主分支 master :
git checkout master
2.然后使用 git merge 命令将新分支的修改合并过来:
git merge new-branch


四、其它实用命令

查看仓库工作树状态

当你准备做下一步操作(比如切换分支等)时,一般要查看工作树(包括工作区和暂存区)状态是不是干净的,只有干净才能做下一步。

git status 可以查看工作区的哪些文件被改动了,暂存区有哪些文件未提交,工作树是不是干净的

在这里插入图片描述

撤销工作区文件的更改

比如你对文件做了改动,但不打算保存,想把它撤回修改前的状态。

git checkout -- APP/case.c //撤销某个目录下的指定文件的更改
git checkout .  //在git add . 前执行这条命令意味着放弃工作区中所有未暂存的修改,如果还需要保留这些修改,可以暂存到一个子分支上

在这里插入图片描述

撤回已添加到暂存区的文件

就是被add到暂存区,但未commit的文件。

git reset .

在这里插入图片描述

撤回已提交到本地仓库的文件

其实被commit的文件已经生成提交记录了,这些文件是撤不回来的,只能删除掉(工作区相同的更改也被删掉了),但记录是删不掉的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

撤回已推送到远处仓库的文件

当你想撤回已更新到远程仓库的文件,可以按照以下操作。

git revert 版本号  //先删除记录中的文件
git add .
git commit -m "描述"
git push -u origin master  //再推送一次即可

删除远处仓库的一些已跟踪的文件

git rm -r --cached .   //删除所有跟踪列表
再次推送就以 .gitignore文件最新内容为准进行忽略不跟踪的文件

将工作区的内容恢复到提交历史记录的某个版本

git reset --hard id  // id是历史记录的版本号,用 git reflog 可以查看

查看某个文件被修改的所有记录

先用 “ find -name 文件名” 来查看该文件的路径

$ find -name UM_DISC.c
./APP/UM_DISC.c

再用 “gitk --all 文件路径” 打开修改记录

$ gitk --all ./APP/UM_DISC.h

使用可视化界面查看所有分支提交记录

使用“ gitk --all& ”打开可视化窗口查看每次提交都修改了哪些文件及具体内容

gitk --all& //用图形可视化方式查看提交记录情况。此图形化窗口必须被关闭后,在命令窗口的命令才能往下执行

查看当前分支的提交或合并记录

git log //只列出本分支所有提交历史记录

git log --merges  //查看当前分支上的合并记录,结果中merge后跟的是合并的分支哈希值

撤销发生冲突的合并

如果合并分支时出现冲突问题,想撤销合并,先"git reset .",在"git checkout ."就可以了

git reset .

git checkout .

总结

看到这里,说明你非常想熟悉掌握 git 工具的使用,那么你可以打开电脑上git安装路径C:\Program Files\Git\mingw64\share\doc\git-doc下的user-manual.html文档,反复认真看完它就能如你所愿了。

内容持续更新中…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值