git使用

git的使用``

1.git的安装

$ git //查看git
$ sudo apt-get install git //安装git

//设置用户名和邮箱

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

2.设置公钥``

$ cat ~/.ssh/id_rsa.pub //查看公钥

复制粘贴公钥在下图里

在这里插入图片描述

3.使用git库

3.1本地已经存在的库,在gitee新建库

$ git init //初始化
$ git remote add test git@gitee.com:dong-how/test.git //链接
$ git push test master //推送

3.2gitee已经存在的项目,在本地创建

$ git clone git@gitee.com:dong-how/cpp.git //克隆
$ git remote add test git@gitee.com:dong-how/test.git //链接

3.3查看git状态

$ git status

4.第一个git实操

4.1第一次提交示例

$ vim readme.txt

在这里插入图片描述

$ git add readme.txt //从工作区放入暂存区
$ git commit -m "commit a readme file" //从暂存区提交到本地分支
$ git push test master //从本地分支上传到gitee的test仓库

4.2git原理之工作区,暂存区

在这里插入图片描述

5.版本回退

5.1查看修改

修改readme文件后还未放到暂存区,使用$ git diff readme.txt 查看修改的内容

在这里插入图片描述

在这里插入图片描述

5.2commit版本回退

当需要修改的代码已经commit了,可以用$ git log 查看
在这里插入图片描述
可以使用$ git reset --hard HEAD^ 回退到HEAD的上一个版本,每回退一个版本就在后面多加一个^
此时再使用$ git log 会发现上一次的HEAD不见了,其实git没有删除上次的commit
使用$ git reflog 可以查看所有的commit记录

在这里插入图片描述
搭配上$ git reset --hard 1a11b 即可回到原来以1a11b开头的commit版本

5.3文件修改

在这里插入图片描述
在readme后面添加了一行change readme,还未add
通过$ git checkout -- readme.txt 可以丢弃工作区的内容,回退到最近一次add或者commit的版本
在这里插入图片描述

如果文件 已经add到暂存区,同样可以通过reset把暂存区的修改撤销掉

$ git reset HEAD readme.txt

此时readme文件中的修改没有被删除,再用一次

$ git checkout -- readme.txt

就可以回到修改之前了

在这里插入图片描述

6.文件删除

在这里插入图片描述
创建一个new文件并进行add和commit,然后从本地删除
此时通过git status查看状态

在这里插入图片描述
现在有两种选择,一种是真的从库中删除,使用

$ git rm new.txt
$ git commit -m "remove a new file"

另一种是恢复在本地删除的文件

$ git checkout -- new.txt

所以checkout命令的功能其实是用版本库里的文件版本替换工作区的版本,不管是修改还是删除都可以通过checkout恢复

7.分支

7.1分支的原理 (参考廖雪峰的官方网站)

在这里插入图片描述
每次提交,master就向前移动一步,HEAD指针也跟着移动
接下来创建新的dev分支

$ git checkout -b dev

这条语句包含创建$ git branch dev和切换$ git checkout dev两个功能
在这里插入图片描述
此时再提交,master就会停在原地不动,dev和HEAD向前移动
在这里插入图片描述
使用$ git branch查看当前分支情况,当前分支前会标注*

在这里插入图片描述
在dev分支修改readme文件后add和commit,然后切换回master

$ git checkout master

此时查看readme文件发现内容没有修改
在这里插入图片描述
是因为刚刚的提交是在dev分支,master并没有移动
所以需要将dev合并到master上

$ git merge dev

在这里插入图片描述
图上可以看出是采用fast-forward方式,即将master指针直接指向dev,这是最快的合并方法,但并不是每次合并都可以使用fast-forwd方式

合并完成后就可以删除dev分支了

$ git branch -d dev

ps:由于恢复文件和切换分支都是用checkout指令,因此在新版git中提供了新的命令switch

$ git switch -c dev //创建并切换到新的分支
$ git switch master //切换到已经存在的分支

7.2分支冲突

当我们同时在两个分支上进行了修改,合并时就会遇到问题

例如我们在feature1分支上修改readme,新增一行this is feature1,并且add和commit

$ git switch -c feature1

在这里插入图片描述
然后我们切换回master,同样在readme后面加一行this is master,同样进行add和commit操作

此时master和feature1分支分别有了各自的提交
在这里插入图片描述
此时如果想要在master上合并feature1分支就会冲突
在这里插入图片描述
使用$ git status 查看状态会提示
在这里插入图片描述
此时再打开readme.txt就会发现git会标记出不同分支的内容
在这里插入图片描述
此时重新修改readme的内容并add和commit,使用带参数的log命令查看分支

$ git log --graph --pretty=oneline --abbrev-commit

在这里插入图片描述
然后删除feature1分支

$ git branch -d feature1

7.3 --no-ff方式

使用fast-forward方式,虽然有最快的速度,但是删除分支后就会丢失分支信息,此时可以用–no-ff方式强制禁用fast-forward,此时在合并时会生成一个新的commit
我们创建一个新的dev分支修改readme,然后切换回master进行合并
在这里插入图片描述
此时通过log可以看到,之前采用的fast-forward方式分支是一条直线,现在是创建了一个新的commit用来合并

7.4 分支策略

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样:
在这里插入图片描述

8.bug分支

如果现在主分支在master,你在dev分支上工作,发现有一个bug要修改,但是dev分支的工作只完成了一半,还不能提交,提交后其他在dev分支工作的人可能就会出错,但又想保留当前工作进度
就可以使用$ git stash 保存当前工作场景

然后我们切换到出bug的分支进行创建一个子分支进行bug修复,例如bug就在dev分支上

$ git switch dev
$ git switch -c bug01`

假设本次的bug是在readme首行加上#ifndef
修改readme文件后加入暂存区并提交
在这里插入图片描述

回到创建bug分支的上层分支进行合并,删除bug01分支

$ git switch dev
$ git merge --no-f -m "recover bug01" bug01
$ git branch -d bug01

使用$ git stash list 查看保存的工作场景

在这里插入图片描述
恢复工作场景有两种方法

如果只有单层stash,可以直接

$ git stash pop

在恢复工作场景的同时会将stash的内容删掉

如果有多层stash,用stash appply恢复,用stash drop删除

$ git stash apply stash@{0}
$ git stash drop stash@{0}

因为dev分支是master分支的子分支,在dev上面修改的bug在master分支上同样需要修改

同样的bug,要在dev上修复,我们只需要把[bug01 9ce606a] recover bug01这个提交所做的修改“复制”到dev分支。注意:我们只想复制[bug01 9ce606a] recover bug01这个提交所做的修改,并不是把整个master分支merge过来。

为了方便操作,Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支:在此之前同样要先保存dev的场景

$ git stash
$ git switch master
$ git cherry-pick 9ce606a
$ git switch dev
$ git stash pop

9.多人协作

在3.2中已经讲过克隆,但是克隆之后在本地只能看到master分支,如果要进行项目开发需要切换到dev分支,因此要先创建本地dev和远程dev的链接

$ git checkout -b dev origin/dev

此时如果两个用户同时在dev分支下创建自己的分支bug和bug2,对同一文件readme进行修改

第一个用户在dev创建分支bug2,修改readme文件后提交,修改到dev分支进行合并并push到远程
在这里插入图片描述
此时如果第二个用户完成了同样的操作,在push到远程仓库时就会出错
在这里插入图片描述
根据git的提示,使用git pull更新本地库,然后重新合并

在这里插入图片描述
在这里插入图片描述
git发现readme被修改过,产生冲突,需要重新编辑readme在本地解决冲突,然后重新push,至此完成工作,删除bug分支
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值