Git的正确使用姿势与最佳实践|青训营笔记

107 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记。

1、 学习目标

  • 学习基本的git命令,并了解基本原理,在遇到相关问题时,能自行排查并解决
  • 了解研发流程中的基本概念和规范
  • 学会正确使用git

2、 Git

Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。

2.1、 分布式版本控制

分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库。

基本原理:

  • 每个库都存有完整的提交历史,可以直接在本地进行代码提交
  • 每次提交记录的都是完整的文件快照,而不是记录增量
  • 通过Push等操作来完成和远端代码的同步

优点:

  • 分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体
  • 分支管理功能强大,方便团队合作,多人协同开发
  • 校验和机制保证完整性

缺点:

  • 相对SVN复杂,学习成本更高
  • 对于大文件的支持不好

image.png

2.2、 Git基本使用

Git仓库:

image.png

工作区&暂存区:

image.png

Git操作: image.png

创建一个版本库:

git init

增加内容跟踪信息:

git add

提交内容到版本库:

git commit

管理分支:

git branch

创建分支

下面的命令将创建我自己的工作分支,名叫 dev_xxx,并且将以后的工作转移到这个分支上开展。

$ git branch dev_xxx
$ git checkout dev_xxx

更简单和常用的方法是直接通过 checkout 命令来一次性创建并转移到新建分支上,命令如下:

$ git checkout -b dev_xxx

删除分支

要删除版本库中的某个分支,使用 git branch -d 命令就可以了,例如:

$ git branch -d branch-name

查看分支运行下面的命令可以得到你当前工作目录的分支列表:

$ git branch

合并分支

合并两个分支:

git merge

既然我们为项目创建了不同的分支,那么我们就要经常地将自己或者是别人在一个分支上的工作合并到其他的分支上去。现在我们看看怎么将 dev_xxx 分支上的工作合并到 master 分支中。现在转移我们当前的工作分支到 master,并且将 dev_xxx 分支上的工作合并进来。

$ git checkout master

$ git merge

上面的命令会将 robin 分支的改动 merge 到 master,并生成一个新的 commit 节点,这个 commit 的注释信息为 "Merge from dev_xxx"

可以通过下面的命令来抓取远程版本库:

$ git fetch

2.3、 Git进阶

stash

描述

官方解释:当您想记录工作目录和索引的当前状态,但又想返回一个干净的工作目录时,请使用git stash。该命令将保存本地修改,并恢复工作目录以匹配头部提交。

stash 命令能够将还未 commit 的代码存起来,让你的工作目录变得干净

$ git stash

想恢复代码也只需要

$ git stash apply

完整相关命令:

# 保存当前未commit的代码  $git stash 

# 保存当前未commit的代码并添加备注  $git stash save "备注的内容" 

# 列出stash的所有记录  $git stash list

# 删除stash的所有记录  $git stash clear

# 应用最近一次的stash  $git stash apply 

# 应用最近一次的stash,随后删除该记录  $git stash pop

# 删除最近的一次stash  $git stash drop

reset --soft

描述

完全不接触索引文件或工作树。这使您的所有更改的文件更改为“要提交的更改”。

回退你已提交的 commit,并将 commit 的修改内容放回到暂存区。

一般我们在使用 reset 命令时,git reset --hard会被提及的比较多,它能让 commit 记录强制回溯到某一个节点。而git reset --soft的作用正如其名,--soft(柔软的) 除了回溯节点外,还会保留节点的修改内容。

# 恢复最近一次 commit git reset --soft HEAD^ reset --soft相当于后悔药,给你重新改过的机会。对于上面的场景,就可以再次修改重新提交,保持干净的 commit 记录。

以上说的是还未 push 的commit。对于已经 push 的 commit,也可以使用该命令,不过再次 push 时,由于远程分支和本地分支有差异,需要强制推送git push -f来覆盖被 reset 的 commit。

还有一点需要注意,在reset --soft指定 commit 号时,会将该 commit 到最近一次 commit 的所有修改内容全部恢复,而不是只针对该 commit。

revert

描述

给定一个或多个现有提交,恢复相关提交引入的更改,并记录一些这些更改的新提交。这就要求你的工作树是干净的(没有来自头部的修改)。

将现有的提交还原,恢复提交的内容,并生成一条还原记录。

git revert [commit号] revert 掉自己提交的 commit。

总结

  • stash:存储临时代码。
  • reset --soft:软回溯,回退 commit 的同时保留修改内容。
  • revert:撤销 commit 的修改内容。

2.4、 Git功能特性:

从一般开发者的角度来看,git有以下功能:

1、从服务器上克隆完整的Git仓库(包括代码和版本信息)到单机上。

2、在自己的机器上根据不同的开发目的,创建分支,修改代码。

3、在单机上自己创建的分支上提交代码。

4、在单机上合并分支。

5、把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。

6、生成补丁(patch),把补丁发送给主开发者。

tstmp_20220615171410.webp

从主开发者的角度看,git有以下功能:

1、查看邮件或者通过其它方式查看一般开发者的提交状态。

2、打上补丁,解决冲突。

3、向公共服务器提交结果,通知所有开发人员。