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

简介: 本篇笔记完全依照课程流程复现,已尽量确保git操作的连贯性,各位同学可以依照笔记复习全流程操作,或者后续结合目录进行查漏补缺。

课前资料

课程链接:https://live.juejin.cn/4354/yc_Git-posture

课程导学:https://juejin.cn/post/7098182433941651492#heading-36

本篇笔记完全依照课程流程复现,已尽量确保git操作的连贯性,各位同学可以依照笔记复习git操作,或者后续结合目录进行查漏补缺。

一、使用Git

mkdir git-demo
cd git-demo
git init

image-20220524105518886

1.1 Git配置

1.1.1 Git Config

分为本地、用户、系统配置,低级别会被高级别配置覆盖。

1.1.2 Git Remote

# 可以配置不同的源
git remote add origin_ssh git@github.com:git/git.git
git remote add origin_http https://github.com/git/git.git
# 也可以实现fetch和push指向不同的源
# 关于修改配置可以通过直接修改配置文件的方式
vim .git/config
# 免密配置 生成SSH ed25519(但是需要修改配置指定使用哪个公私钥)
ssh-keygen -t ed25519 -C "邮箱"

1.2 代码提交

1.2.1 Git Add(将文件加入暂存区)

新建一个readme.md文件,这是执行git add .之前,执行tree .git命令。

image-20220524114723243

执行git add .之后,再次执行tree .git命令。

image-20220524114642719

image-20220524115211793

1.2.2 Git Commit(真正提交至Git目录当中)

执行git commit -m"add readme",此时objects目录中多了两个文件。

image-20220524115446604

image-20220524115815369

1.3 Git存储的基本概念

1.3.1 Objects(可以回溯tree->blob->得到add的文件内容)

  • Blob 存储文件内容信息
  • Tree 存储目录树信息
  • Commit 存储提交信息
  • Tag 存储附注标签信息
  • Refs(存储对应的Commit Id)

事实上在完成了readme的提交之后,refs目录也发生了变化。

image-20220524120712864

文件中是Commit Id(对应着一个版本的代码)。

image-20220524120740208

尝试新建分支:git checkout -b test

image-20220524122633553

1.3.2 Annotation Tag

refs是有不同的种类的,refs/heads前缀表示的是分支,除此之外还有其他种类的ref,比如refs/tags前缀表示的是标签。

标签一般表示一个稳定的版本,指向的Commit一般不会变更。执行git tag v0.0.1命令,而执行git tag -a v0.02 -m"add feature1"可以额外添加一些注释信息,分别执行一下之后,再次执行tree .git命令查看目录树结构。

image-20220524123927242

1.3.3 追溯历史代码

下面尝试追溯历史版本的代码,先修改一下test分支的readme文件,然后提交。

image-20220524125101017

通过使用git log命令可以获取最新提交版本代码的Commit Id。

image-20220524125324880

使用git cat-file -p命令可以在显示的结果中找到当前commit版本的parentCommit Id

image-20220524125451580

1.3.4 修改历史版本(追溯之后可能会涉及到修改)

git commit --amend命令

通过这个命令可以修改最近一次的commitmessage信息,修改之后的commit id会变化,但是其treeparent指向不会发生变化。

我们执行这个命令,然后尝试为commitmessage增加三个感叹号,Esc + :wq保存退出。

image-20220524131211106

git rebase命令(强大)

通过git rebase -i HEAD~3 可以实现对最近三个commit的修改,比如:

  • 合并commit
  • 修改具体的commit message
  • 删除某个commit

filter --branch

该命令可以指定删除所有提交中的某个文件或者全局修改邮箱地址等操作

1.3.5 悬空Objects

通过git fsck --lost-found命令可以查看当前是否有悬空的Object(没有ref指向的object),通过上述操作,git commit --amend命令使得之前的那个commit id指代的代码版本已经没有作用了。

image-20220524132050845

1.3.6 Git GC

  • GC

通过git gc命令,可以删除一些不需要的object,以及对object进行一些打包压缩来减少仓库的体积

  • Reflog

reflog用于记录操作日志,防止误操作之后数据丢失,通过reflog来找到丢失的数据,手动将日志设置为过期

  • 指定时间

git gc prune=now指的是修剪多久之前的对象,默认是两周前

image-20220524132735598

再次执行tree .git命令查看目录结构有很大变化

image-20220524132911661

1.3.7 完整的Git视图

image-20220524133247367

1.3.8 Git Clone & Pull & Fetch

  • Clone

拉取完整的仓库代码到本地目录,可以指定分支,深度。

  • Fetch(不清楚远端情况)

将远端的某些分支最新代码拉取到本地,不会执行merge操作,会修改refs。remote内的分支信息,如果需要和本地代码合并需要手动操作。

  • Pull(清楚远端情况)

拉取远端分支,并和本地代码进行合并,操作等同于git fetch + git merge,也可以通过git pull --rebase 完成 git fetch + git rebase操作。可能存在冲突,需要解决。

1.3.9 Git Push

常用命令:

一般使用 git push origin master 命令。

冲突问题:

  • 本地的commit 记录和远端 commit 不一致,会产生冲突,如git commit --amend or git rebase命令都有可能导致这个问题。
  • 如果该分支只有自己使用,或者团队内确认可以修改历史,则可以通过git push origin master -f来完成强制推送,一般不推荐主干分支执行该操作,正常都应该解决冲突后再进行推送。

推送规则:

设置一些分支保护规则防止误操作(Branch protection rules)

二、Git研发流程

2.1 集中式工作流

  1. 获取远端master分支代码
  2. 直接在master分支完成修改
  3. 提交前拉取最新master代码和本地代码合并使用(rebase),如果有冲突解决冲突
  4. 提交本地代码到master

2.2 分支管理工作流

2.2.1 Git Flow

分支类型丰富,规范严格

  • Master:主干分支
  • Develop:开发分支
  • Feature:特性分支
  • Release:发布分支
  • Hotfix:热修复分支

2.2.2 Github Flow

只有主干分支和开发分支,规则简单,基于Pull Request 往主干分支中提交代码。

选择团队的合作方式:

  1. owner 创建好仓库之后,其他用户通过Fork的方式创建自己的仓库,并在fork的仓库上进行开发。
  2. owner 创建好仓库之后,统一给团队内成员分配权限,直接在同一个仓库内进行开发。

接下来模拟一下github-flow的工作流模式,先到自己的GitHub中创建一个仓库:github-flow-demo,并克隆到本地。

image-20220524141855845

然后在本地项目中创建一个readme文件后提交到远程仓库。

image-20220524142345488

image-20220524142436461

创建一个feature分支,修改readme文件后提交。

image-20220524143155128

上图中GitHub自动生成了一个向main分支合入的pull request链接,复制后去浏览器打开。

image-20220524143452924

点击Create pull request。

image-20220524143737196

在确认代码没有问题之后,点击Merge pull request。

image-20220524143937472

回到远程仓库的main分支,可以看到我们对readme的修改已经从feature分支合并到main分支上了。

image-20220524144056745

最后回到本地仓库,切换回main分支,拉取远程main分支最新的代码。

image-20220524144405457

image-20220524144510436

  • Branch protection rule(配置分支保护规则)

image-20220524145548114

2.2.3 Gitlab Flow

在主干分支和开发分支的基础上构建环境分支,版本分支,满足不同发布or环境的需要。

原则:upstream first 上游优先

只有上游分支采纳的代码才可以进入到下游分支,一般上游分支就是master。

2.3 代码合并

2.3.1 Fast-Forward

不会产生一个merge节点,合并之后保持一个线性的历史,如果target分支又了更新,则需要通过rebase操作更新source branch 后才可以合入。

image-20220524150459863

2.3.2 Three-Way Merge

三方合并,会产生一个新的merge节点

image-20220524150620951

2.4 如何选择合适的工作流

没有最好,只有最合适,针对小团队合作,推荐使用 Github 工作流即可:

  1. 尽量保证少量多次,最好不要一次性提交上千行代码
  2. 提交Pull Request 后最少需要保证有CR(Code Review)后再合入
  3. 主干分支尽量保持整洁,使用fast-forward 合入方式,合入前进行rebase

关于git rebase可以看看这篇文章:https://blog.csdn.net/qq_24147051/article/details/118050241

小结

梳理了Git的知识,体验很棒。

相关文章
|
7月前
|
存储 开发工具 git
Git的正确使用姿势与最佳事件:团队协作开发和版本控制的最佳实践
Git 是目前最流行的分布式版本控制系统之一,它提供了强大而灵活的工具来管理项目的版本和协作开发。无论您是个人开发者还是团队成员,掌握 Git 的使用方法都是必不可少的。本文将引导您从 Git 的基础知识开始,逐步探索 Git 的进阶功能。
|
29天前
|
Ubuntu 开发工具 git
Git高手必备:掌握这些版本控制最佳实践,让你的代码管理效率翻倍!
【10月更文挑战第25天】使用 Git 进行版本控制是现代软件开发的重要部分。本文详细介绍了 Git 的安装、配置、基本操作、分支管理、冲突解决及常用命令,帮助开发者提高工作效率,确保代码质量和团队协作的顺利进行。通过合理使用 Git,可以有效管理代码变更,支持多人协作,并追踪历史记录。
62 4
|
3月前
|
安全 网络安全 开发工具
深入探索Git:全面解析Git的用法与最佳实践
深入探索Git:全面解析Git的用法与最佳实践
62 2
|
3月前
|
图形学 开发工具 git
Unity与版本控制:游戏开发团队如何利用Git打造高效协作流程,实现代码管理的最佳实践指南
【8月更文挑战第31天】版本控制在软件开发中至关重要,尤其在Unity游戏开发中,能提升团队协作效率并避免错误。本文介绍如何在Unity项目中应用版本控制的最佳实践,包括选择Git、配置项目以排除不必要的文件、组织项目结构、避免冲突、规范提交信息以及使用分支管理开发流程,从而提高代码质量和团队协作效率。
250 1
|
6月前
|
开发工具 git 开发者
使用Git进行版本控制的最佳实践
【6月更文挑战第3天】使用Git进行版本控制的最佳实践包括:初始化配置Git仓库,设置个人信息和默认编辑器;提交信息要简洁明了,使用有意义的标题和描述;分支管理中,为新功能或修复创建分支,定期合并并保持主分支稳定;进行代码审查以保证质量;使用标签标记里程碑;忽略不必要的文件;定期备份仓库并学会恢复操作;不断学习和实践Git的高级用法。遵循这些实践可提升开发效率和代码质量。
|
7月前
|
存储 项目管理 开发工具
Git 版本控制:构建高效协作和开发流程的最佳实践
版本控制是软件开发的核心,促进团队协作与项目管理。通过制定明确的分支命名策略,遵循一致的代码提交规范,如指明提交类型和简短描述,增强了历史记录的可读性,可以清晰地组织和理解项目的结构与进展。
225 0
Git 版本控制:构建高效协作和开发流程的最佳实践
|
7月前
|
存储 XML Shell
Git笔记
Git笔记
45 0
|
7月前
|
开发工具 git
git使用笔记-修改url并与远端库合并
git使用笔记-修改url并与远端库合并
39 1
|
Shell 开发工具 git
[笔记]Git 介绍以及入门基本功能(一)
[笔记]Git 介绍以及入门基本功能
|
7月前
|
程序员 开发工具 git
【程序员英语 代码提交】C++工程师的代码提交艺术:git commit 时 精确表达与最佳实践
【程序员英语 代码提交】C++工程师的代码提交艺术:git commit 时 精确表达与最佳实践
180 1