Git是什么?
Git是一个分布式代码管理容器,本地和远程都保持相同的代码。Git仓库主要由三部分组成:本地代码、缓存和提交历史,这是几乎所有操作的本质。不过为了让文章更容易理解,我们就不围绕这部分展开了,有兴趣的可以了解一下。开门见山,直接说Git的常用操作。
Git的一般操作有哪些?
先简单说一下Git的一般操作,可以让我们应对简单的开发需求。
克隆代码
克隆远程代码
git克隆http://git.code.oa.com/QCFE/sqlserver.git
检查本地代码状态
//可以清晰显示本地仓库的状态
//哪些文件已被更改并提交到此计算机
//和一些操作说明。
git状态
同步远程分支更改
//拉动指定分支的变化
git提取原始主文件
//拉取所有分支的变化
git fetch
//拉取所有分支的变化,同步删除远端不存在的分支[推荐]
git fetch -p
同步远程代码更改。
//先获取git,然后执行合并操作
//区别在于git pull执行git合并,git pull -r执行git rebase
git拉原点主
git拉-r原点主
git合并和git rebase的优缺点将在后面详细介绍。
这一部分主要介绍与代码克隆和远程代码更改同步相关的操作。接下来,让我们看看关于本机代码的一些操作。
动作提交
首先,我们应该澄清一个概念:每个提交都是一个完整的代码状态,由一个commitID唯一标记。
在某种程度上,Git维护一个commitID树,它存储不同状态的代码。因此,您对代码所做的任何更改最终都会反映在提交中。
添加提交
//将文件添加到缓存中,并提交给本地仓库
git添加文件
Git commit -m '提交评论'
撤消提交
//提交记录将回滚,但代码不会回滚
git复位b14bb52
//将回滚所有提交的记录和代码
git复位-硬b14bb52
//回滚一些代码文件
git签出-文件
合并提交合并提交本质上是合并处于不同状态的两个代码。
//Git提供了两种合并提交的方式
git合并主文件
git rebase master
那么git rebase和git merge有什么区别呢?合并是在两个分支处理冲突后向主节点添加一个提交。Rebase将提交记录从someFeature分支追加到主分支。值得注意的是,此时他的承诺实际上已经改变。
相对来说,git merge处理冲突更直接,而git rebase可以保证提交记录清晰。合并提交时,通常会发生冲突。您可以全局搜索特殊字符,例如,找到需要处理的代码的位置,然后仔细分析应该保留代码的哪一部分。
在团队中工作时,分支机构是必要的。那么我们应该如何运营分公司呢?
操作分支
所谓的分支实际上是指向commitID的指针。你可以去。git/refs/header。
通常我们建议分支机构至少可以明确标注功能名称,如果能标注用户就更好了,比如奇秀/特色。查看分支
您可以同时看到本地分支和远程分支,并且可以使用上面描述的git fetch -p在第一时间看到最新的分支信息。添加本地分支实际上是创建一个指向commitID的指针。
//git分支qi xiu/功能git结账qi xiu/功能
//从当前分支添加新的分支qixiu/feature
//一般来说,我们应该从主分支或其他稳定分支添加分支
Git checkout -b qixiu/feature //创建新分支
Git结账启秀/功能//切换分支
删除本地分支实际上是删除指向commitID的指针。
//删除本地分支。如果本地有未组合的代码,则不能删除
git分支-d qixiu/功能
//strong制删除本地分支
git分支-D qixiu/特征
添加远程分支通常,我们通过创建一个新的本地分支,然后将其更新到远程分支来添加远程分支
git推送原点启秀/功能
删除远程分支同样,我们也通过更新到远程端来删除远程分支
//相当于git push origin-d qixiu/feure
git推送原点:启秀/功能
做一个简短的总结
以上可能有些零散。以下是常用操作的简要总结:
Git状态//查看本地代码状态
Git添加文件//向缓存添加代码
Git commit -m“提交内容的注释”//向本地仓库提交代码
Git checkout -b branchName //不带-b是正常的切换分支
Git fetch -p //同步远程分支状态
Git pull-r原始分支名称//将远程代码提取到本地,并将代码合并到rebase中
Git将原始branchName //更新本地代码到远程端
以上命令已经能够应付日常操作,稍微复杂一点的场景后面会介绍
基于基础操作,在实际项目中应该如何使用Git实现协作?
Git有哪些好的做法?
Git有一些成熟的开发流程,其中主流的有两种:基于功能分支的开发流程和GitFlow的开发流程。相对来说,我推荐前者。如果是复杂的大型项目,我推荐GitFlow开发流程。接下来,我们将简要介绍这两种合作模式。
基于职能部门的合作模式
其实基于功能分支的开发过程就一句话:用分支承载功能开发,再合并到主分支。他的优点是可以保证主分支的整洁,同时可以使分支代码逻辑上集中,也方便CodeReview。
分支命名规范
建议使用以下格式:ownerName/featureName。这样就很容易知道分行覆盖的功能,找到分行的负责人。以后清理树枝也很方便。
显色法
从主人那里砍下一根新树枝
git结账-b qixiu/newFeature
开发一些新的功能,然后更频繁地向本地仓库提交推荐的提交代码,以便更灵活地保存或撤销修改。此外,为了保证提交日志的清晰性,建议明确备注。
git状态
Git添加文件//选择要提交的文件,或者全部提交
Git commit -m '提交评论'
git推送原点qixiu/newFeature
如果功能开发完成,可以启动代码审查流程。如果代码测试通过,它将被合并到主代码中,然后准备上线
//冗余版本合并为主版本
git结账大师
git拉-r原点主
git结账qixiu/newFeature
Git rebase master //处理冲突
git结账大师
git合并启秀/新功能
git推送原点主文件
//简化版本合并到主版本中
git结账qixiu/newFeature
Git pull -r origin master //更新master的代码,rebase处理冲突
Git推原点主//将本地代码更新到远程端
有几点需要注意:不要在母版中合并代码,保证母版的可用性非常重要。确保在正确的分支中执行正确的操作。无论是处理冲突还是更新远程代码,请保持敬畏。
此时,基于功能分支的正常开发过程就完成了。接下来,让我们看看另一个开发过程。
GitFlow开发过程
GitFlow比上面提到的基于功能分支的开发过程要复杂得多,更适合大型复杂的项目。它围绕项目发布过程定义了一个严格的分支模型,所有的开发过程都是围绕这个严格的分支模型进行的。这个模型定义了每个分支的角色以及它们如何交流。
我们来看看GitFlow开发过程中约定的几个分支,它们各自的作用是什么?
主分支:用于存储在线版本代码,方便为代码键入版本号。开发分支:用于集成功能分支。功能分支:某一功能的分支,从开发分支中切出,功能完成后合并回开发分支,不与主分支直接交互。发布分支:通常对应于一个迭代。将一个版本的所有功能合并到开发分支后,从开发中剪下一个发布分支。这个分支不增加新的需求,可以完成bug修复和文档改进。重要的是要记住,在代码发布后,它需要合并到主分支,也需要合并到开发分支。修复分支:紧急修复分支,是唯一可以从Master中切出的分支。修复后可以合并为主分支和开发分支。
从每个分支的功能和约定可以看出,它有很多流程和约束,不适合小规模应用。当然,GitFlow还有一些辅助工具gitflow,可以自动完成这些任务,对大型项目也很有帮助。
我讲了Git的基本操作,然后介绍了两个主流的工作流。接下来看看Git有哪些特别值得一提的技能。
Git的小技巧是什么?
除了基本的代码管理功能,Git操作还有一些小技巧可以让你大放异彩。
Git reflog,查看操作记录
我必须先介绍一下这个,因为它已经保存了我的代码好几次了
仔细看图片,reflog记录了你所有的git命令操作,对于恢复一些莫名其妙的场景或者回滚误操作有很大帮助。想象一个场景:您使用git reset-hard commtid将本地开发代码回滚到以前的版本,它还没有被推到远端。你如何找回丢失的代码?如果使用git日志来查看提交日志,就无法检索被丢弃的提交id。另一方面,Git reflog详细记录了每个操作的commitID,这使得您可以轻松恢复当时的操作并检索丢失的代码。当然,如果你所有丢失的代码都没有提交,那么恭喜你,你的代码真的丢失了。
压缩提交记录
这也是一个非常实用的功能。如前所述,我们在开发过程中尽量保持高频率的代码提交,以避免粗心的代码丢失。但是,在合并代码时,我们不希望有太多的冗余提交记录,当rebase合并代码时,它会处理每个提交,有时会导致冗余工作。因此,压缩日志后,提交记录可以非常整洁,使用rebase合并代码也很方便。
那么,如何压缩提交记录呢?使用git日志查找初始commitID git reset commitID,切记不要使用- hard参数重新git添加git commit git push-f origin分支名称,因为会有冲突,所以有必要强行覆盖远程分支,所以要小心。合并到主机中,然后更新远程主机。
此外,还有两种压缩日志的方法:gitcommit-amend:将提交追加到上一次提交中。Git rebase -i:通过交互式rebase提供对分支提交的控制,从而清理混乱的历史。
在实际应用中,三种日志压缩方法都很优秀,git reset更简单,git rebase -i更精致。
Git rebase,合并代码
前面简单介绍了git rebase和git merge的区别。坦率地说,它们各有利弊。Git rebase可以使您的提交记录非常整洁,并且更容易在线回滚或CodeReview但是,这是一个隐藏的操作,所以使用时要小心。Git合并操作更安全、更简单;但是,将添加一些冗余的提交记录。
简单说一下rebase的合并流程和注意事项。看下面的图片
需要注意的有三点:rebase首先找出共同的祖先节点,从祖先节点拾取pay分支的提交记录,然后主分支rebase后的commitID实际发生了变化,尤其是第三点,经常导致误操作,需要注意。
想象一下,如果我们在开发过程中频繁分支rebase master,会发生什么?
当你不断地给master重新加基的时候,实际上你的本地D已经变成了D’,如果你想和远程支付分支保持一致,你的本地分支提交记录已经很难看了。
另外,注意不要在公共分支上使用rebase!
所以为了安全,团队可以考虑采用合并。
拉取请求以促进代码审查
Git不仅为代码托管和代码开发提供帮助,还为代码审计提供类似的功能。在功能分支的开发完成后,我们可以发起一个拉取请求,并选择两个分支进行比较
它将创建一个拉取请求,并指定相关人员审查代码。通常情况下,团队应该鼓励交叉评审,涉及到公共代码时,有必要让相关人员进行评审。
Git钩子,git的生命周期
大多数人都听说过git操作有自己的生命周期,我们可以在不同的生命周期做一些自动化的事情。
举两个简单的例子:当我们可以在预提交期间进行eslint后提交时,我们可以与jenkins这样的工具进行持续集成
当然,还有更多的声明周期,细节可以参考Git钩子
Git子模块git子树,管理第三方模块
这两个命令通常用于管理常见的第三方模块。例如,一些常见的底层逻辑、中间件和一些可能经常变化的常见业务组件。当然,两者是有区别的。Git子模块主要用于管理一些公共模块或底层逻辑进行单向更新。Git子树特别适合一些需要双向更新的可重用逻辑的管理。例如,一些需要重用的业务组件代码。在我之前的实践中,我也使用了子树来管理构建系统的逻辑。
Git别名,简化git命令
我们可以通过配置git别名来简化需要输入的Git命令。例如,git子树需要输入一个长的Git命令,这可以通过配置。git/配置文件。
//git str pull app Fe演示/xxx
//git strpush app Fe演示/xxx
[别名]
stpull=!git子树拉前缀=$1 appfe $2
:
stpush=!git子树拉前缀=$1 appfe $2
git子树拆分-重新加入-前缀=$1 $2
git子树推送前缀=$1 appfe $2
:
总结一下?
本文首先介绍了Git的一般操作,包括克隆代码、提交操作、分支操作等。其实Git一般操作的命令并不多。请看第一部分的简要总结。
其次,介绍了Git的开发过程。这部分主要介绍了两种主流的开发模式:基于功能分支的较轻开发流程*和适用于复杂项目的GitFlow开发流程。两种模式都有各自的使用场景,前者足以日常使用。
最后介绍了一些Git实用技巧,包括reflog操作、日志压缩、rebase中的注意事项、带拉请求的codeReview、git hook的自动化等。
标题:pexels,CC0授权。