首页 > 自考资讯 > 高考百科

这才是真正的GitGit 全功能揭秘(gitvan)

小条 2024-09-30

作者:xqkuang,PCG前端开发工程师

Git 历史和现状

Git 是Linux 作者Linus 的另一部作品。 2002 年,他还在使用Bitkeeper 进行Linux 内核版本控制,但因为它是受版权保护的软件而受到质疑,随后Andrew Tridgell 对Bitkeeper 和BitMover 进行了逆向工程,Linux 又从开发者手中重新获得了Bitkeeper 的免费使用权。 Linus 一怒之下写了10 天的Git。

这个名字的意思是“自私的混蛋”

如今,Git 是大多数开发者的选择,而由Tom Preston-Werner、Chris Wanstrath 和PJ Hyett 于2007 年10 月推出的Github 已成为全球最大的开发者网站,我们工厂就是其中之一,做出了巨大的贡献。

8e85dbf251754cb1b94a82b109239256~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1728306492&x-signature=rhyuNYTLbB9YgcYqyMNHCkjuc5M%3D 另外,一向自造轮子的微软也计划将300G的Windows源代码移至Git进行管理。这有效地增加了Git巨大的处理能力。代码存储库性能。

7e9494862fa641e9ac2dbf58737d60cf~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1728306492&x-signature=FSzD3eaK0b78iuoebTXaTajCBn4%3D 还有一件事:Docker 的二进制镜像管理也是基于git 的。

集中式版本管理和分布式版本管理

Git和SVN是版本工具,设计理念不同。 SVN集中代码管理,更加稳定安全,而根据需求,分布式Git是从Linux操作系统发展而来,适合开源项目。您可以随时远程将您的代码合并到本地代码,从而获得更强大的功能和完整的操作流程,也可以应用于商业软件开发。

1ec821d800ca44a583005ea9414ae57a~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1728306492&x-signature=Lve8RoAmvRuxnEjOUiXsC6ojK3Q%3D

Git 和 SVN 代码历史的不同

SVN 中的代码历史记录相对简单,因为它是集中式的,每个人的代码都直接发送到特定的存储库。因此,版本ID号通常是顺序递增的数字类型。在这种情况下,没有别的事情了。可以在两个数字之间插入回归。

9dd4330c9c2d4be38a43bab841a3947e~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1728306492&x-signature=Eo3jpOPyhhpJlLDSQIvqCok9XN4%3DGit 看起来更复杂。该版本ID 号是40 位数字的哈希值,但通常可以缩短为7 位数字。这是因为Git 的原子单元是代码更改的历史。补丁、分支、标签、远程(稍后详细介绍这些概念)等只是可以随意拆分和合并的分支的集合。

我更喜欢将分支、标签和遥控器想象成不同的平行世界。它们要么因某些机会而分裂并导致不同的历史,要么因某些机会而重新结合并变得更加强大。

6c99b22e7a344159a97aedc3a84d1e15~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1728306492&x-signature=0EGqMKEJvSRHHPPklz4OPziNu7E%3DGit基本命令

557d87cc30194573bcfa7ae8e65a4a6c~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1728306492&x-signature=yj3GPuFs3QB2k7ZH5xwOQ5tfIJg%3DGit根据场景可以分为以下几种场景:

工作空间:当前工作空间,修改后的初始状态。暂存:进行更改后,将它们添加到缓存中以准备提交。本地存储库:本地代码存储库。仅对您自己的代码有效。这也是与svn的区别之一。 svn commit 后会直接发送到远程服务器,而git commit 后只会发送到本地代码库。 Remote Repository:远程代码库。将本地代码库同步到远程代码库,以便其他开发人员可以共享您的结果。具体流程看图。这里简单介绍一下一些常用命令。

PS:的rebase和cherry-pick命令图中没有显示,但这两个命令也很强大,有时间的话关注一下。

补丁 diff

如前所述,补丁是Git/SVN 代码版本控制中的基本概念,在实践中,添加的行以+ 符号开头,删除的行以- 符号开头,并且将进行行更改。即先-,后+。

使用Git,您可以使用git diff 或Linux/Mac/Conemu,或者使用diff -Naur 来生成类似于下图的文件比较结果。

这是整个代码管理的基本概念,所有的分支、标签、远程都源自这个基础。

ce055d8e67ba46bcbb1cc09e13b85de6~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1728306492&x-signature=nFSY5Q8X4KLNb7D%2FLmI36%2FRaK2k%3D

基本流程

1. 克隆代码到本地开发环境 - Clone

$ git clone [REPOSITORY_URL] 对应于用于将远程代码克隆到本地的svn checkout 命令。 ssh/scp 协议非常灵活。尽管以前很流行,但https/http 协议现在变得越来越流行。

2. 更新代码 - Status/Commit/Log

我们已经介绍了四个Git 场景,其中前两个必须通过。

如果您查看$ git status 命令,您将看到代码刚刚创建并具有“未跟踪文件(工作区)”状态。当您运行“添加”时,如果文件处于阶段,它将处于“更改提交(阶段)”状态。一旦修改,就会进入“Changes not staged for commit”状态。执行提交后,您可以将其从Stage 传输到本地存储库。

通过查看$ git log 检查您的代码提交。

3. Branch 和 Tag

如前所述,分支和标签都可以被认为是补丁的连续集合,克隆存储库后,有一个名为master 的主线分支。标签用于指示已发布的版本。它们仅在名称上有所不同,但在功能(实现)上没有重大区别。

与SVN 不同,SVN 分支和标签复制主干的整个代码库。因为Git 只是将补丁引用重新应用到当前代码,所以Git 中的分支/标签非常轻量级,并且可以根据需要经常切换。稍后我们讨论Git 流程时会讨论如何使用分支来管理代码功能的开发。

3.1 新建分支的两种办法

$ git checkout -b [BRANCH_NAME] # 切换到当前版本,创建新分支$ git Branch [BRANCH_NAME] # 直接创建新分支

3.2 切换分支

$ git checkout [BRANCH_NAME]

3.3 合并分支的两种办法

$ git merge [ BRANCH_NAME] # 添加另一个分支分支中的代码将在当前分支之后命中。 $ git rebase [BRANCH_NAME] # 比较代码。将修改后的代码从该分支重新设置到另一个分支。通常不建议使用它,因为在对下游分支进行变基后从分支合并时会导致问题。合并分支的提交将会丢失,但对于一些有历史恐惧症的人来说,这是一个保持http://git.code.oa.com/xxx 中合并分支“xxx”的提交干净的神器。 yyy 看起来像这样:这也是很麻烦的。

不建议将推送到远程存储库的提交变基。一旦rebase后,其他用户会拉出很多冲突,正常情况下基本无法修复,所以最好还是用merge比较安全。

PS: rebase 的另一个强大功能是能够使用--interactive 参数修改以前的补丁。然而,一旦你做出了改变,你可以推送--force,其他人可以恢复它并竞争,但诀窍是改变Github Pull 请求中所需的技能(见下文)。

3.4 删除分支

$ git Branch -d [BRANCH_NAME] # 已经合并到master $ git Branch -D [BRANCH_NAME] # 该分支还没有合并到master,将被强制删除PS: 分支已被删除即使如此,仍然可以使用git reflogs 将其恢复。

3.5 取消修改

git stash # 取消所有更改。它的强大之处在于你可以亲眼看到它。 git restart —soft [REV] # 您还可以保存更改并从本地存储库恢复。回滚历史记录git Replace —hard [REV] # 您还可以放弃更改并从本地存储库恢复。推送您的代码可以使其与其他命令一起使用。这很简单。

$ git Push [REMOTE] [BRANCH]默认情况下远程推送到原点。事实上,你不能添加这个。指定的分支将被推送到远程。在推送本地功能分支时,我们建议在推送后添加--set-upstream 参数。

严重警告:切勿在主线master 分支上运行--force。

推送本地代码到远程仓库

$ git pull # 将代码更新到工作区。 $ git fetch # 将代码更新到本地存储库。在某些情况下,合并需要您将代码合并回工作区。

获取远程分支更新

克隆后,默认创建了一个名为origin的远程仓库,但如果要添加其他远程仓库,必须使用以下命令:

$ git Remote add [REMOTE_NAME] [URL] # 添加原始存储库$ git fetch [REMOTE_NAME] # 获取远程存储库的更新$ git Branch -a # 显示包含远程存储库的所有分支$ git Push [REMOTE_NAME] [BRANCH_NAME] # 推送移动Remote Warehouse

远程仓库

Github 是一套源自Git Remote 的机制,旨在鼓励大家参与开源项目。目前加入一个典型的开源项目的流程是先注册Github账号,然后fork开源。这是一个有趣的项目。将其复制到您的命名空间中,拆分分支并进行更改,将其提交到您的Github 存储库,然后启动拉取请求以让项目的维护者合并代码(拉取请求是,此过程涉及项目的维护者对代码进行审查和评论)代码并根据维护者的要求进行更改(这里经常使用变基),然后她将代码合并到项目中。

具体过程和Gitlab的合并请求原理一模一样。

PS:的示例照片从PPT第22页开始

Github Pull Request Gitlab Merge Request

Git Flow 旨在实现基于Git 分支的简单功能模块开发流程,然后使用一组命令行工具将分支拆分为上游和下游级别。用于维护。

master分支- 与在线版本一致,如果在线遇到问题很容易修复。开发分支- 功能开发的基线分支。当所有功能开发完成后,它们会合并到该分支中,进行测试,上线,并合并到master中。 feature/* 功能开发分支- 从开发中分离出来,必须随时与开发更新合并回来,以与上游分支保持一致。功能开发完成后,您可以将其合并到您的开发中。通过与上游分支保持一致,您可以避免意外删除其他人的代码。所有代码冲突必须在下游分支中修复,并在测试完成后才能合并到上游分支中。 hotfix/* hotfix 分支- 主要用于在线bug 修复,但修复必须同时合并到master 和development 分支中。ede3ed7ec472450e8fb641d22dcb995e~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1728306492&x-signature=1k3Yurx8OoIquADEj4UK2O5hwUw%3Dgit flow 提供了一组命令行工具来轻松合并这些代码。

$ git flow init # 初始化git flow 分支模型$ git flow feature start [NAME] # 启动功能分支$ git flow featurefinish [NAME] # 将功能分支合并到开发$ git flow hotfix start [ NAME] # 启动一个功能分支修复修补程序分支$ git flow hotfixfinish [NAME] # 将补丁合并到开发和master $ git flow release [NAME] # 发布并标记新版本我觉得Git flow 需要空间。如果下次还有机会的话。

Git flow

如果您有兴趣,请继续阅读其他相关内容。这是非常有趣的内容。

git svn - Git 使用svn 作为代码后端,您可以使用Giit 在SVN 中对代码进行版本控制。 git reflogs - 参考记录。您不必担心意外删除提交,只要它已提交即可。它可以通过重置或选择来恢复。 git Cherry pick - Cherry pick(提交),从另一个分支单独挑选补丁。 git bare 存储库- 构建Git 服务器git 子模块- 子模块。大项目可以分为子模块,子模块版本可以随时更新和跟踪。 git hooks - 钩子。当git对仓库进行某些操作时,目前Github上的一些第三方持续集成服务就是基于此实现的。 git 签名- 签名。在提交时使用gpg 对您的补丁进行签名,以证明该补丁实际上是您提交的。请参阅Github 文档。 Source Tree - Source Tree 是一个简单方便的跨平台Git 图形界面,我目前主要用于阅读基本补丁。这比命令行更舒服。感谢您的阅读,下次有机会我会再写。

版权声明:本文转载于网络,版权归作者所有。如有侵权,请联系本站编辑删除。

猜你喜欢