> 技术文档 > 一文搞懂git操作_git 操作

一文搞懂git操作_git 操作


目录

前言

初步设置git

创建git仓库

向git仓库中添加文件

提交git仓库中的文件

git状态查看

git版本回退

git管理修改

git撤销修改

git删除文件

远程仓库关联

远程仓库推送

远程仓库克隆

git分支

分支创建

查看分支

分支合并

删除分支

分支管理策略

git分支推送

git仓库抓取

fetch

pull

总结

路径分割符“/”

前言

一些关于本文的说明:

  • 使用工具:git bash
  • 使用软件:gitlab和github(gitlab与github都是使用git进行管理)
  • 本文参考“廖雪峰”老师的git教程,教程链接:简介 - Git教程 - 廖雪峰的官方网站

初步设置git

git的安装在这里就不再赘述,如果您不会安装,请在“前言”部分浏览“廖雪峰”老师的教程安装。

当您安装好git后,请务必执行下面两条命令来设置:

git config --global user.name \"name\"git config --global user.email \"email\"
  • \"name\":填写你的名字(方便别人知道是谁提交的)
  • “email”:填写你的邮箱
  • --global:这个参数表示这台机器上的所有Git仓库都会使用这个配置

创建git仓库

git仓库是git的精华所在,git仓库里所有文件的修改、删除都会被git记录

切换到一个文件下(不论是否空白),执行下面命令创建一个git仓库:

git init

此时该文件夹下会生成一个“.git”文件,不过它是隐藏的,如果您是windows系统,可以点击显示隐藏文件,如果是Linux系统,可以输入“ls -a”来显示

向git仓库中添加文件

git的管理策略是:“git只会记录您添加到仓库中的文件,哪怕该文件在仓库目录中

使用下面这条命令添加文件

git add files_name
  • files_name:文件名

下面让我们创建一个文件并添加到仓库中:

// touch创建一个新文件touch test.txt// 向仓库中添加一个新文件git add test.txt

添加这一串字符串,并查看文件是否被git成功检测到

// 使用status查看状态git status

可以看到“test.txt”文件修改被成功检测到

下面我们再创建一个文件,但是不添加到仓库中:

touch test1.txt

随后给这个文件添加一串字符串

// 继续使用status命令查看git是否记录到修改git status

可以看git并没有检测到test1.txt的修改,只检测到test1.txt文件的创建(但并没有添加到仓库中)

提交git仓库中的文件

// 使用commit提交,带-m参数git commit -m \"description\"// 或不带-m参数git commit
  • description:由您自定义,一般描述本次提交做了什么修改

不带-m参数提交时,git bash会默认打开一个vim窗口,此时将会在vim窗口中编辑description

git状态查看

// 显示git仓库状态git status// 显示commit历史记录git log

使用git log时:

  • commit ea25d12.....:这一串表示commit号,可以用来回退版本
  • Author:提交人
  • Date:日期

git版本回退

git rset --hard 版本

在git中,用“HEAD”表示当前版本,上一个版本就是“HEAD^”,上上个版本就是“HEAD^^”,但是如果版本太多“^”也太多,容易数不过来,为此可以使用“HEAD~X”来回退。

例如下面这个例子:

// 回退到上一个版本git reset --hard HEAD// 或git reset --hard HEAD~1// 回退到上100个版本git reset --hard HEAD~100

当然我们也可以用commit版本号来指定回退到某个版本

// 使用commit版本号回退,版本号没必要写全,写前几位即可git reset --hard ea25d1
  • --hard:回退到上个版本的已提交状态
  • --soft:回退到上个版本的未提交状态
  • --mixed:回退到上个版本已添加但未提交的状态

git管理修改

现在有下面一系列操作:

  1. 在test1.txt中添加一串字符串
  2. git add test.txt
  3. 在test1.txt再添加一串字符串
  4. git commit -m \"添加字符串\"

最后结果如何呢?

1.在test1.txt中添加一串字符串

2.git add test.txt

3.在test1.txt再添加一串字符串

4.git commit -m \"添加字符串\"

  • 您会发现,您明明commit了,为什么第二次的修改没有被commit?
  • 原因在于:git只会将您add的那一刻的状态添加到暂存区
  • 解决方法:添加字符串 -> git add -> 添加字符串 -> git add -> git commit

git撤销修改

// 使用checkout撤销工作区修改git checkout -- file

checkout撤销修改有两种情况:

  • file自修改后还没有被放到暂存区,撤销修改,返回到file被添加到暂存区前的状态
  • file已经被添加到暂存区,又作了修改,撤销修改,返回到file被添加到暂存区时的状态

git删除文件

当我们删除某个文件时:

git提示我们有一个文件被删除了,如果想要确认删除执行:

// 确认删除git rm file

删除也是一次修改,因此仍然需要commit

  • 当您删除文件后,可以使用git rm file来确认删除
  • 也可以使用 git add file,来添加这个状态
  • 上述两种方法都可以,本质就是确认修改

远程仓库关联

当您在github/gitlab中创建一个仓库后,您可以使用remote命令关联远程仓库

// 关联远程仓库git remote add [origin] [SSH/HTTP]
  • [origin]:远程仓库名字,由您指定
  • [SSH/HTTP]:SSH或HTTP连接

如果您不想关联这个远程仓库后,可以使用rm命令删除关联远程仓库

// 使用remote删除关联远程仓库git remote rm origin

远程仓库推送

您可以使用push命令来将本地提交推送到远程仓库中

git push origin master
  • master:远程仓库分支

远程仓库克隆

当您接触一个新仓库想要克隆下来,第一次克隆请务必使用clone

// 使用git clone克隆仓库git clone [SSH/HTTP]
  • [SSH/HTTP]:SSH或HTTP连接

当您已经克隆一个仓库之后,之后可以使用pull

// 使用git pull拉取代码git pull origin

git pull相当于

git fetch origin main # 拉取远程main的最新更新到本地origin/maingit merge origin/main # 将origin/main合并到当前本地分支

git分支

每次提交,git都把它们串成一条时间线,这条时间线就是一个分支。

当您没有创建分支时,它只有一条线,这个分支叫“主分支”(master/main)。

HEAD指向mastermaster指向提交,因此HEAD指向当前分支

每次提交,master分支都会向前移动一步,这样随着你不断提交,master分支也越来越长

当我们创建新的分支,例如dev时,git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次之后,dev指针往前移动一步,而master指针不变

假如我们在dev上的工作完成了,就可以把dev合并到master上(最简单的方法就是把master指针移动到dev指针处)

分支创建

您可以使用“checkout”命令创建分支:

// 创建dev分支git checkout dev// 切换到dev分支git checkout dev// 创建dev分支并切换到dev分支(方法一)git checkout -b dev// 创建dev分支并切换到dev分支(方法二)git switch -c dev

查看分支

// 查看所有分支git branch
  • 当前分支前面会标有一个*

分支合并

当您想要将dev分支的工作成功合并到master分支上,您可以使用:

// 合并dev分支到master分支上git checkout mastergit merge dev
  • 这是一个快速合并
  • 本质是:将master分支指针移动到dev分支指针 

删除分支

当您想要删除分支,可以使用-d命令

// 删除dev分支git branch -d dev

分支管理策略

合并分支时,git会优先使用“快速模式”,这样删除分支后,会丢掉分支信息。

如果禁用“快速模式”,git就会在merge时生成一个新的commit,这样就可以从分支历史上看出分支信息

使用“--no-ff”参数,表示禁用“快速模式

git merge --no-ff -m \"merge with no fast forward\" dev
  • 因为本次合并要创建一个新的commit,所以加上-m参数

合并后,使用git log查看分支历史:

 

  • 分支历史就像这样

git分支推送

当您从远程仓库克隆时,git会自动帮您把本地master(main)分支与远程的master分支对应

您可以使用push命令将本地修改推送到远程服务器

// 推送远程分支git push origin master
  • origin:由您指定的服务器名
  • master:由您指定的本地git分支

当您第一次使用push命令时,强烈建议您带上-u参数,这个代表本地与远程服务器的分支关联,当您使用的本地分支是“dev”时,而远程服务器没有dev,那么远程服务器会自动创建一条“dev”分支

// 使用-u参数git push -u origin dev

如果您不想构建“本地 -> 远程”的关联关系,可以使用“本地分支:远程分支”的方法来指定推送:

// 指定本地的dev分支推送到远程origin的mastergit push origin dev:master

git仓库抓取

当您想要获取远程仓库的更新您可以使用“fetch”或“pull

fetch

fetch属于“安全获取”,具体包括下面四项:

  • 新提交记录:远程各分支上比本地对应分支多出的提交
  • 新分支:远程仓库中新建的分支
  • 标签更新:远程仓库中新创建的标签或对已有标签的修改
  • 分支删除信息:远程仓库中被删除的分支

例如远程仓库origin有下面四点变动,但是你的本地仓库还没有同步:

  1. mian分支新增了两个提交
  2. 同事新建了feature/pay分支并推送了三个提交
  3. 仓库管理员增加了v2.1标签
  4. 旧分支feature/old删除

此时执行git fetch,本地会:

  1. 下载main分支的两个新提交,更新本地的origin/main引用
  2. 记录feature/pay分支的存在,创建origin/feature/pay引用,并下载三个提交
  3. 下载v2.1标签到本地
  4. 标记origin/feature/old为已删除

git fetch只会下载并记录这些更新到本地的“远程跟踪分支”,但不会修改你的大工作区文件,也不会合并到你当前正在工作的本地分支

如果要将这些更新应用到本地分支,需要手动执行git mergegit rebase

pull

pull命令会自动帮您合并分支,相当于“fetch + merge”两个动作,一条命令帮您完成

// pull拉取远程master分支并自动合并到当前分支git pull origin master// pull拉取当前分支与远程仓库关联分支的更新git pull

 git merge origin/master

总结

  • git fetch:相当于查看远程仓库更新了什么
  • git pull:查看并合并远程仓库的更新

路径分割符“/”

在git,“/”主要用于“分隔分支名称中的层级关系

具体用法:

  • 远程仓库名与分支名的分隔:origin/master -> origin是远程仓库名称,master是远程仓库origin下的master分支
  • 使用 / 组织分支结构,让分支名更具可读性(git会将整个字符串视为一个分支名,不影响功能) -> feature/login