前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >测开必备|Git操作

测开必备|Git操作

作者头像
互联网金融打杂
发布2022-08-01 14:58:00
2680
发布2022-08-01 14:58:00
举报

一、版本控制

1.1 什么是“版本控制”?

版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 在本书所展示的例子中,我们对保存着软件源代码的文件作版本控制,但实际上,你可以对任何类型的文件进行版本控制。

1.2 版本控制的演进

1.2.1 本地版本控制系统

最简单的方法就是每个版本所在的目录标记修改时间等信息,但是有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。 面对这种问题,大多都是采用某种简单的数据库来记录文件的历次更新差异。工作原理是在硬盘上保存补丁集(文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容。

image.png
image.png

1.2.2 集中化的版本控制系统

如何让在不同系统上的开发者协同工作? 集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。 这类系统诸如 CVS、Subversion等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。

image.png
image.png

这么做最显而易见的缺点是中央服务器的单点故障。 如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。 如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照。 本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。

1.2.3 分布式版本控制系统

针对上述问题,分布式版本控制系统(Distributed Version Control System,简称 DVCS), 在这类系统中,像 Git、Mercurial以及 Darcs 等,客户端并不只提取最新版本的文件快照, 而是把代码仓库完整地镜像下来,包括完整的历史记录。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

image.png
image.png

二、三大区域

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫 stage。一般存放在.git目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是 Git 的版本库。
image.png
image.png
  • git init - 初始化仓库。
  • git add . - 添加文件到暂存区。
  • git commit - 将暂存区内容添加到仓库中
  • git pull - 下载远程代码
  • git push - 推送到远程仓库
  • git reset - 回退版本

三、分支管理

分支是为了将修改记录的整体流程分叉保存。分叉后的分支不受其他分支的影响,所以在同一个数据库里可以同时进行多个修改。

image.png
image.png

1. 分支操作

查看分支: git branch

创建分支: git branch <name>

切换分支: git checkout <name> 或者 git switch <name>

创建+切换分支: git checkout -b <name> 或者 git switch -c <name>

合并某分支到当前分支: git merge <name>

删除分支: git branch -d <name>

提交

2. 分支管理策略

master 分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活; 那在哪干活呢?干活都在 dev 分支上,也就是说, dev 分支是不稳定的,到某个时候,比如1.0版本发布时,再把 dev 分支合并到 master 上,在 master 分支发布1.0版本;你和你的小伙伴们每个人都在dev 分支上干活,每个人都有自己的分支,时不时地往 dev 分支上合并就可以了。 所以,团队合作的分支看起来就像这样:

image.png
image.png

四、标签管理

1. 标签概念

发布一个版本时,我们通常先在版本库中打一个标签(tag),这样就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。

所以,标签也是版本库的一个快照。

Git 的标签虽然是版本库的快照,但其实它就是指向某个 commit 的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。

Git有commit,为什么还要引入tag? "请把上周一的那个版本打包发布,commit号是6a5819e…" "一串乱七八糟的数字不好找!" 如果换一个办法: "请把上周一的那个版本打包发布,版本号是v1.2" "好的,按照tag v1.2查找commit就行!" 所以,tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。

同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签。人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做。

下面来学习如何列出所有可用的标签,如何新建标签,以及各种不同类型标签之间的差别。

2. 创建标签

代码语言:javascript
复制
[root@Git git]# git tag v1.0

3. 查看已有标签

代码语言:javascript
复制
[root@Git git]# git tag
v1.0
[root@Git git]# git tag v1.1
[root@Git git]# git tag
v1.0
v1.1

4. 删除标签

代码语言:javascript
复制
[root@Git git]# git tag -d v1.1
Deleted tag ‘v1.1’ (was 91388f0)
[root@Git git]# git tag
v1.0

5. 查看此版本所修改的内容

代码语言:javascript
复制
[root@Git git]# git show v1.0
commit 91388f0883903ac9014e006611944f6688170ef4
Author: "syaving" <"819044347@qq.com">
Date: Fri Dec 16 02:32:05 2016 +0800
commit dir
diff –git a/readme b/readme
index 7a3d711..bfecb47 100644
— a/readme
+++ b/readme
@@ -1,2 +1,3 @@
text
hello git
+use commit
[root@Git git]# git log –oneline
91388f0 commit dir
e435fe8 add readme
2525062 add readme

五、修改提交

1. 撤销修改

代码语言:javascript
复制
git checkout -- file

e.g: git checkout -- readme.txt

解释:把 readme.txt 文件在工作区的修改全部撤销,这里有两种情况:

  1. 一种是 readme.txt 自修改后还没有被放到暂存区,撤销修改就回到和版本库一模一样的状态;
  2. 一种是 readme.txt 已经添加到暂存区后,本地又作了修改,撤销修改就回到添加到暂存区后的状态。 总之,就是让这个文件回到最近一次 git commit 或 git add 时的状态。

2. 删除文件

代码语言:javascript
复制
git rm --cached file  # 本地保留cached
git commit -m "remove file"

⚠️ 此操作会删除版本库文件。

代码语言:javascript
复制
git rm -f README.md # 本地不保留cached
git commit -m "remove README.md"
image.png
image.png

⚠️ git rm 不是 git add的反操作。

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

代码语言:javascript
复制
git checkout -- test.txt 

git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

3. 版本回滚

方法1 git revert

image.png
image.png
代码语言:javascript
复制
1、找到你误提交之前的版本号

2、git revert -n 版本号  #这里可能会出现冲突,那么需要手动修改冲突的文件。

3、git commit -m xxxx 提交

4、git push 推送到远程   or强推 git push origin HEAD --force

方法2 git reset

image.png
image.png
代码语言:javascript
复制
git log
git reset --hard 目标版本号
git push -f  此时如果用“git push”会报错,因为本地库HEAD指向的版本比远程库的要旧

4. 常规开发流程

一般而言,我们在开发一个feature的时候,会从当前master拉取最新的代码到本地,然后在此代码基础上开发新feature代码,代码开发好以后,经过测试,会讲此feature的代码合并(merge)到master。

image.png
image.png

假设开发者当前在自己的分支dev,那么一个完整的pull->push流程操作如下:

代码语言:javascript
复制
1. 将master的代码更新到开发分支(dev)
git checkout master 
git pull 
git checkout dev
git merge master 
git push -u origin dev
2. 当开发分支(dev)上的代码测试通过,要合并到master分支
代码语言:javascript
复制
git checkout master
git pull
git merge dev
git push -u origin master

5. 恢复误撤销的版本

image.png
image.png

恢复V2版本的撤销

代码语言:javascript
复制
1. git reset --hard V4
2. git push -f  
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、版本控制
    • 1.1 什么是“版本控制”?
      • 1.2 版本控制的演进
        • 1.2.1 本地版本控制系统
        • 1.2.2 集中化的版本控制系统
        • 1.2.3 分布式版本控制系统
        • 1. 分支操作
        • 2. 分支管理策略
        • 1. 标签概念
        • 2. 创建标签
        • 3. 查看已有标签
        • 4. 删除标签
        • 5. 查看此版本所修改的内容
        • 1. 撤销修改
        • 2. 删除文件
        • 3. 版本回滚
        • 4. 常规开发流程
        • 5. 恢复误撤销的版本
    • 二、三大区域
    • 三、分支管理
    • 四、标签管理
    • 五、修改提交
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档