目 录
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文档,反复认真看完它就能如你所愿了。
内容持续更新中…