赞
踩
git的使用是在工作中必备的技能,本系列重写自己曾经学习git的过程,按照从创建git仓库开始操作,赋每一步的演示图,让小白跟着文章操作,一步一步入门
四个工作区:
git本地有三个工作域:工作区(working directory), 暂存区(stage/index), 资源库(repository)。如 果再算上远程服务器上的git仓库(remote directory)就可以分为四个工作域。其关系如下:
1. 在工作目录中添加,修改文件
2. 将需要进行版本管理的文件放入暂存区
3. 将暂存区的文件提交到git仓库
Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态 变为Staged.
Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文 件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可 进入暂存staged状态, 使用git checkout 则丢弃修改过,返回到unmodify状态, 这个git checkout即 从库中取出文件, 覆盖当前修改
Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存,文件状态为Modified
首先确保自己安装了git工具
linux下使用:
sudo apt install git 管理员状态
创建本地仓库
首先创建一个新目录,使用git init将当前目录变为一个可以通过git管理的仓库
git init
初始化后会生成git的配置文件目录,普通的"ls"命令是看不到的,我们需要使用ls -a查看隐藏目录
演示如图:
注意事项: 第一次使用git命令提交代码之前,需要先设置用户名及邮箱,之后就不需要了:
- git config --global user.name "你的用户名"
-
- git config --global user.email "你的邮箱"
这里我配置过了,这里就不演示了
下来将新创建的文件,代码什么的添加到暂存区
- 使用git add filename 添加文件到暂存区
-
- filename就是你要添加的文件名
首先我在这里写一段代码,仅仅只是写了个主函数,后面我会不断完善这个文件,上传各个版本。此时main.c提交到暂存区中
此时我们查看一下仓库的状态
使用git status 查看仓库状态
显示我们暂未提交到本地仓库,位于分支master上(master是主分支),分支后面会讲
接下来我们正式将刚刚的main.c提交到本地仓库中
使用 git commit -m "版本描述信息" 提交版本到仓库
此时我们才是真正提交成功了。
我们使用命令去查看一下刚刚的提交信息
使用git log查看提交的历史记录
head是指向的意思,表示这次提交到哪儿,head->master代表这次提交到master主仓库,如果是head->分支仓库则代表提交到分支仓库
我们可以使用命令去重写上一次提交的注释
git commit --amend
上一次的注释中我们写的是“创建主函数”,我想修改为“创建main.c函数”,终端执行上述语句就会进入此页面
进入编辑页面修改注释,修改完成之后根据下面的提示,我们选择ctrl o写入,就会得到下面界面
再按下回车,我们就写入成功了,回退到起始界面
此时我们ctrl x离开退出,git log查看日志,但其实你一退出后git commit --amend命令下面就会显示修改之后的注释,此时就成功变成了“创建main.c”
接下来我们在更改一个版本(提交跟上述过程一样)的代码演示下面的命令:
我们此时在文件中添加个一个add求和的函数,查看日志会发现,此时head指向最新一个版本
下来使用命令查看仓库所有已提交的操作日志
git reflog 查看对仓库的操作日志
head前面的序号就是log查看里那一串长序号的前面几位(这几位就已经够区分不同版本了),我们后面也可以根据这短短的序号去查看所需版本的文件
如果我们想查看以前版本的文件怎么办呢?此时我们的文件是处在添加了add函数的时候,如果我们想回到最初创建main函数的时候,就需要使用回退版本的命令了,下面进行演示:
此时我们的代码长这样:
- 使用git reset --hard HEAD^ 回退版本
-
- ^代表上一个版本的意思,HEAD代表当前仓库的指向,当前HEAD指向master,就代表回滚到master上一次提交的版本
-
- 那么git reset --hard HEAD^^就是回退两个版本^^^就是三个版本,一次类推
-
- 那么还有一种简便方法
- git reset --hard HEAD~3
-
- 后面的~3,代表以当前版本为基数,回滚多少次。HEAD~3代表回滚master前三个版本
-
-
- 还有一种方式,我们用版本号去回退,前面讲git log或者git reflog的时候都能看到
- 版本他独有的版本号,也讲了可以用他去回退版本
- git reset --hard 版本号
有三种模式
--soft 、--mixed以及--hard是三个恢复等级。
此时我们会发现代码回归到上个版本的样子了
此时你git log会发现head就跑到这个版本了
如果我们想再回到之前那个add的最新版本怎么办?我们会发现git log已经查看不到add版本了。
上面我们讲了git reflog这个是查看对版本仓库的操作,我们提交版本,回退等等操作都属于对仓库的操作。我们使用git reflog查看一下历史操作
会发现里面有我们所有的操作历史,同样有所对应的版本号,我们就可以用版本号去回退到我们想要的版本了,add的版本号为773e37a,(之前git log的时候会发现是很长一串773e37a...),不过这里前几位就可以唯一标识了,我们就可以用他去回退版本
示例操作如下:
查看文件,成功回到add时期版本
当然我们回退上一步,回退任何版本都可以用版本号来操作
那么如果我们不小心将工作区的文件删除了怎么办呢?或者说在这一版上写了一部分代码,但是突然不想要了,觉得删代码麻烦
那么可以我们从版本库中把此时最新的一版拿出来(我们删之前或者修改之前的),或者说是放弃此时对于工作区的修改的操作
- git checkout filename 放弃对工作区代码的修改
- filename就是修改或者删的那个文件
我们会发现文件又回来了~
接下来比如我们修改了一部分代码,但是还未add,我们想知道修改了哪一部分怎么办?(代码量很多,自己忘记了)
如上,我们新增了一句 int a=10;
使用git diff HEAD 比较当前内容与最后一次提交的版本的差异,如下在main.c中添加了一行内容,显示 添加的一行前面有‘+’号标识。如果内容相同则该命令不显示输出结果。HEAD也可以省略默认就是与最近一次比较。如果是和上上个版本比较那就是HEAD ^,依次同理HEAD就是当前版本要清楚
一般都是把现在写的代码和当前版本去比较
那么此时如果 我将上面这一次的改动提交到了暂存区,但是我后面发现我没有写完或者不想要了,想撤销怎么办呢?
我先提交了,查看一下状态显示我是暂时放进了暂存区
那么撤销工作的命令就是:
使用git reset HEAD filename 从暂存区撤销
此时我们刚刚提交到暂存区的操作就被撤销了
有时候我们可能会删除一个文件,就是原来版本中有这个文件使我们需要的,不过后面我们写了更好的一版,这个文件不需要了(从版本仓库中删去),我们就要删除他。
下面我进行操作演示:
需要用到
用git rm filename 删除一个文件
新增添一文件max.c进入,提交之后,此时之后我们现在就会有两个文件了
如果我们用普通的rm 文件去删除(只是本地工作区删掉了),后续用git checkout max.c又可以恢复max.c文件
如果直接rm删除文件,只是删除工作区的文件,只是与版本库不一样了,git status 会提示你。
恢复工作区文件:git checkout -- 文件名
那么我们如果想以后都不用了,就是从版本仓库中把他删去,用下面命令
使用git rm filename 删除一个文件, 此时提交到暂存区,需要commit后才在版本库中删除
此时max.c文件在版本库中被删掉
下面来聊聊分支相关的操作,就像上面的master一样 ,看图说话
那么有一个切换分支的东西,就是比如上图,我们创建了新分支dev,想要在上面实现一些代码。那么就需要把head指针去指向新分支(head是指向的意思,表示这次提交到哪儿),那么之后写的代码都是在这个新分支上面。
切换分支是非常常用的!
查看当前都有哪些分支
查看分支: git branch
此时我们只有master这一个分支
创建一个新分支
创建分支: git branch 分支名
此时head还是指向master的
切换分支
切换分支: git checkout 分支名
此时发现head指向了dev分支,我们下面如果写代码提交,那么都会弄到这个分支上面
此时我们提交代码,编写一个fun函数,就会出现在dev分支上
此时我们切换到master分支,就会发现fun函数不在
如果我们现在再在master分支上面对这个main函数进行修改,新添一个max函数
还有一个快捷的方式去创建新的分支并切换
创建并切换到该分支: git checkout -b 分支名
假如现在我们想把dev分支上的代码和master上的合并,该怎么办呢?
git merge 分支名
- 合并某个分支到当前分支: git merge 分支名 ,合并时可能产生冲突,需要解决冲突。
- 有时需要禁止快速合并,可执行:git merge --no-ff -m '描述' 分支名
此时在主分支master上,合并发现有冲突,为啥嘞?
我们打开代码看看
假如我们两个都想要,那么手动修改一下,提交此版本。这就是我们的最终版
如果我们现在想删除一个分支怎么办呢?
首先我们先新建一个新分支gk,切换到别的分支,然后去删除这个gk分支
删除分支,不能删除当前所处分支,切换到其它分支再删除: git branch -d 分支名
好用的常用操作:
历史记录一行显示
git log --pretty=oneline
以图表形式显示分支:
git log --graph
有时候我们在工作的时候比如修改了一部分代码,但是还未完成,因此没有提交,这时候需要我们转到另一个分支上去做一些操作,如果我们不保存这些未完成的代码,如果切换分支过后,原分支这些修改未提交的代码就会不见了。因此我们需要保存此时工作区的状态
保护现场 git stash,当前工作区有代码修改了,是不能切换到其他分支,可以先保存现场,再切换
git stash
我们先不保存修改代码看看是什么样的。我们现在处在master分支,对于main.c做一些修改,未提交,然后切换到dev分支
他会提示我们要么提交代码要么去保存
我们去保存一下现在的工作现场,去查看保存之后的代码会发现,代码显示的是你未修改之前的状态,你修改的那部分,他给你保存在了别的地方(就是我刚刚修改的调用add函数的代码)
此时就保存了现场,成功切换分支
那么当我们在dev分支上一顿操作结束之后,我们需要回到master去处理刚刚没弄完的代码怎么整呢?
首先我们先切回master,你查看你的代码文件发现并没有刚刚修改的那部分,那是因为,保存现场之后git把那部分代码存到别的地方去了,此时我们需要先看看我们都保存了哪些现场,再根据需要去恢复那部分保存的现场代码
列出所有保存的现场信息
git stash list
我们看到现在就保存了一个现场,现在就需要取出现场,去恢复代码了
取出某次的现场信息,继续工作 :
- git stash pop默认是最近一次
-
- git stash pop "stash@{1}" 加上编号,取不同的现场信息
如果有多个现场,也可以加上编号"stash@{1}"指定获取某一个。不同分支的现场,应该回到对应分支再获取,否则会自动合并现场到当前分支的工作区。 此时回到最初调用了add函数的状态
这样的话git基础的本地操作流程就说完了
可以用github和gitee去尝试链接一下
这一部分一定是工作之后最经常用的,具体操作演示这里就不多说了,网上有太多的教程了
这里把每天都要用的命令列在这里
- . 克隆项目:git clone 项目地址
- . 提交分支到远程仓库:git push origin 分支名
- . 提交分支到远程仓库,并跟踪分支 :git push -u origin 分支名
- . 拉取远程服务器上的分支更新到本地 :git pull origin 分支名
到此这一版本的git学习就到这里了,我都是按照当初我学习的步骤演示了一遍,小白看完文章跟着操作,一定会对git有一定的了解的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。