作者: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 已成为全球最大的开发者网站,我们工厂就是其中之一,做出了巨大的贡献。
另外,一向自造轮子的微软也计划将300G的Windows源代码移至Git进行管理。这有效地增加了Git巨大的处理能力。代码存储库性能。
还有一件事:Docker 的二进制镜像管理也是基于git 的。
集中式版本管理和分布式版本管理
Git和SVN是版本工具,设计理念不同。 SVN集中代码管理,更加稳定安全,而根据需求,分布式Git是从Linux操作系统发展而来,适合开源项目。您可以随时远程将您的代码合并到本地代码,从而获得更强大的功能和完整的操作流程,也可以应用于商业软件开发。
Git 和 SVN 代码历史的不同
SVN 中的代码历史记录相对简单,因为它是集中式的,每个人的代码都直接发送到特定的存储库。因此,版本ID号通常是顺序递增的数字类型。在这种情况下,没有别的事情了。可以在两个数字之间插入回归。
Git 看起来更复杂。该版本ID 号是40 位数字的哈希值,但通常可以缩短为7 位数字。这是因为Git 的原子单元是代码更改的历史。补丁、分支、标签、远程(稍后详细介绍这些概念)等只是可以随意拆分和合并的分支的集合。
我更喜欢将分支、标签和遥控器想象成不同的平行世界。它们要么因某些机会而分裂并导致不同的历史,要么因某些机会而重新结合并变得更加强大。
Git基本命令
Git根据场景可以分为以下几种场景:
工作空间:当前工作空间,修改后的初始状态。暂存:进行更改后,将它们添加到缓存中以准备提交。本地存储库:本地代码存储库。仅对您自己的代码有效。这也是与svn的区别之一。 svn commit 后会直接发送到远程服务器,而git commit 后只会发送到本地代码库。 Remote Repository:远程代码库。将本地代码库同步到远程代码库,以便其他开发人员可以共享您的结果。具体流程看图。这里简单介绍一下一些常用命令。
PS:的rebase和cherry-pick命令图中没有显示,但这两个命令也很强大,有时间的话关注一下。
补丁 diff
如前所述,补丁是Git/SVN 代码版本控制中的基本概念,在实践中,添加的行以+ 符号开头,删除的行以- 符号开头,并且将进行行更改。即先-,后+。
使用Git,您可以使用git diff 或Linux/Mac/Conemu,或者使用diff -Naur 来生成类似于下图的文件比较结果。
这是整个代码管理的基本概念,所有的分支、标签、远程都源自这个基础。
基本流程
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 分支中。git 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 图形界面,我目前主要用于阅读基本补丁。这比命令行更舒服。感谢您的阅读,下次有机会我会再写。
版权声明:本文转载于网络,版权归作者所有。如有侵权,请联系本站编辑删除。
