当前位置: 首页 > Linux

还在为SVN发愁?一起来看看git是如何帮助你走出管理困境的吧!

时间:2023-04-06 23:43:19 Linux

本文内容主要包括以下几点。带大家看看git的发展史。发展历程2008年4月10日,GitHub正式上线。2014年1月23日,联合创始人汤姆·普雷斯顿-沃纳(TomPreston-Werner)从另一位联合创始人克里斯·万斯特拉斯(ChrisWanstrath)手中接过总裁一职,后者也将接替普雷斯顿·沃纳留下的CEO职位.2018年6月4日晚,微软宣布通过75亿美元的股票交易收购了GitHub。[2]10月26日,微软完成对GitHub的75亿美元收购。10月29日,微软负责开发者服务的副总裁NatFriedman将成为GitHub的新任CEO。[3]2020年3月17日,Github宣布收购npm,GitHub现已保证npm永远免费。[4]基本功能作为一个开源的代码库和版本控制系统,Github拥有超过900万的开发者用户。随着越来越多的应用程序迁移到云端,Github已成为管理软件开发和发现现有代码的首选方法。前面说过,作为一个分布式版本控制系统,Git中没有主库这个概念。每个复制的库都可以独立使用,两个库之间的任何不一致都可以解决。合并。GitHub可以托管各种git库并提供web界面,但与国外的SourceForge、GoogleCode或中文编码服务不同,GitHub的独特卖点在于易于从另一个项目分支。为一个项目贡献代码非常简单:首先点击项目站点的“fork”按钮,然后检出代码并将修改添加到刚刚fork出来的代码库中,最后通过内置的报告给项目“pullrequest”机制人们申请代码合并。有些人已经将GitHub称为编码人员的MySpace。在GitHub上分支就像在Myspace(或Facebook...)上交朋友,不断连接社交关系图的节点。GitHub项目本身自然也托管在GitHub上,但是在公众视野不可见的私有仓库中。开源项目可以免费托管,但私有存储库则不然。GitHub的开发者之一ChrisWanstrath确认了在财务上支持托管免费存储库和付费私有存储库的计划。通过与客户的互动、FamSpam的开发,甚至GitHub本身的开发,GitHub的私有存储库已被证明是物有所值的。任何希望节省时间并避免与团队其他成员一样翻页的痛苦的人都将从GitHub获得他们真正想要的价值。在GitHub上,用户可以很容易地找到大量的开源代码。在梳理和了解了git的相关开发经验和基本功能后,程序员最关心的话题也是搜索最多的词汇——用法就会出来,那么对于github,我们有哪些比较好的操作命令呢?作为一个资深程序员,我一定想到了。让我们来看看。基本用法以下四个命令在工作目录、暂存目录(也称索引)和仓库之间复制文件。·gitaddfiles将当前文件放入暂存区。·gitcommit生成暂存区快照并提交。·gitreset--files用于撤消上次gitadd的文件,也可以使用gitreset撤消所有暂存区文件。·gitcheckout--files将文件从暂存区复制到工作目录以丢弃本地更改。您可以使用gitreset-p、gitcheckout-p或gitadd-p进入交互模式。也可以跳过暂存区直接从仓库取文件或者直接提交代码。·gitcommit-a相当于运行gitadd将当前目录下的所有文件添加到暂存区,然后运行。提交。gitcommitfiles进行一次提交,其中包含最后一次提交以及工作目录中文件的快照。并将文件添加到暂存区。gitcheckoutHEAD--回滚文件以复制上次提交。同意在下文中按以下形式使用图片。绿色的5位字符表示提交的ID,分别指向父节点。分支以橙色显示并指向特定的提交。当前分支由附加到它的HEAD标识。这张图显示了最后5次提交,ed489是最新的提交。master分支指向本次提交,另一个maint分支指向祖父提交节点。命令详解Commit提交时,git用暂存区的文件创建一个新的提交,并将此时的节点设置为父节点。然后将当前分支指向新的提交节点。下图中,当前分支为master。运行命令前master指向ed489,提交后master指向新节点f0cec,并以ed489为父节点。即使当前分支是提交的祖父分支,git也会这样做。下图中,在master分支的grandparent的maint分支上进行了commit,生成了1800b。这样maint分支就不再是master分支的祖父分支了。在这种情况下,合并(或变基)是必要的。如果要更改提交,请使用gitcommit--amend。git将使用与当前提交相同的父提交进行新提交,旧提交将被取消。Checkoutcheckout命令用于将文件从历史提交(或暂存区)复制到工作目录,也可用于切换分支。当给定一个文件名时(或者开启-p选项,或者文件名和-p选项同时开启),git会将文件从指定的commit复制到暂存区和工作目录。例如gitcheckoutHEAD~foo.c会将提交节点HEAD~(即当前提交节点的父节点)中的foo.c复制到工作目录,并添加到暂存区。(如果命令中没有指定提交节点,内容将从暂存区复制。)注意当前分支不会改变。当没有指定文件名,但是给出了一个(本地)分支时,那么HEAD标志被移动到那个分支(也就是我们“切换”到那个分支),然后暂存区和工作目录的内容就会与HEAD对应的提交节点一致。新提交节点(下图中的a47c3)中的所有文件将被复制(到暂存区和工作目录);仅存在于旧提交节点(ed489)中的文件将被删除;以上文件均未被忽略且不受影响。如果既没有指定文件名也没有指定分支名称,而是指定了标记、远程分支、SHA-1值或类似master~3的内容,您将得到一个名为detachedHEADlogo的匿名分支。这使得在历史版本之间切换变得容易。比如你要编译1.6.6.1版本的git,可以运行gitcheckoutv1.6.6.1(这是标签,不是分支名),编译安装,然后切换回另一个分支,这样作为gitcheckoutmaster。但是,当提交操作涉及“分离的HEAD”时,行为会略有不同,详情请参见下文。当HEAD处于分离状态时提交操作当HEAD处于分离状态(未附加到任何分支)时,提交操作正常进行,但不会更新任何命名分支。(你可以认为这是更新一个匿名分支。)一旦你切换到另一个分支,比如master,提交节点(可能)将永远不会被再次引用,它会被丢弃。请注意,在此命令之后没有任何内容引用2eecb。但是,如果你想保存这个状态,你可以使用命令gitcheckout-bname创建一个新的分支。reset重置命令将当前分支指向另一个位置,并可选择更改工作目录和索引。还用于在不触及工作目录的情况下将文件从历史存储库复制到索引。如果没有给出选项,则当前分支指向该提交。如果使用--hard选项,则工作目录也会更新,如果使用--soft选项,则它保持不变。如果没有给出提交点版本号,则默认使用HEAD。这样,分支指向相同,但索引会回滚到上次提交。如果使用--hard选项,工作目录也将相同。如果给出了文件名(或-p选项),那么就像使用文件名检出一样工作,除了更新索引。Mergemerge命令将不同的分支合并在一起。在合并之前,索引必须与当前提交相同。如果另一个分支是当前提交的祖父分支,则合并命令将不执行任何操作。另一种情况是当前提交是另一个分支的祖父母,导致快进合并。指向只是简单的移动一下,就产生了一个新的commit。否则就是真正的合并。默认情况下,在当前提交(如下所示的ed489)和另一个提交(33104)及其共同的祖父母(b325c)之间执行三向合并。结果是先保存当前目录和索引,然后与父节点33104进行新提交。CherryPickcherry-pick命令“复制”一个提交节点,并在当前分支上进行相同的新提交。Rebase是合并命令的替代方法。Merge将两个父分支合并为一个提交,并且提交历史是非线性的。Rebasing在当前分支上重放另一个分支的历史,commit历史是线性的。本质上,这是线性化的自动挑选。以上命令都是在topic分支执行的,不是master分支,在master分支上重放,将分支指向新节点。请注意,旧提交不会被引用并将被回收。要限制回滚范围,请使用--onto选项。以下命令在master分支上重播当前分支从169a6开始的最后几次提交,即2c33a。还有gitrebase--interactive可以让你更轻松地完成一些复杂的操作,例如丢弃、重新排列、修改和合并提交。没有图片反映这些,详情看这里:git-rebase(1)Tip1.ChangeExportinthelastcommit(导出更改在上次提交中完成)该命令通常用于定期发送更改的项目,以方便其他人使用审查/综合。gitarchive-o../updated.zipHEAD$(gitdiff--name-onlyHEAD^)2.ChangetheExportfilebetweentwocommits(Exportchangedfilesbetweentwocommits)同样,如果你需要在两次提交之间改变文件,你可以选择下面的一段代码。gitarchive-o../latest.zipNEW_COMMIT_ID_HERE$(gitdiff--name-onlyOLD_COMMIT_ID_HERENEW_COMMIT_ID_HERE)3.克隆一个特定的远程分支(Cloneaspecificremotebranch)如果你想从远程仓库克隆一个特定的分支而不克隆整个仓库分支,那么下面的一段代码将为您工作。gitinit  gitremote添加-tBRANCH_NAME_HERE-foriginREMOTE_REPO_URL_PATH_HERE  gitcheckoutBRANCH_NAME_HERE4。ApplypatchfromUnrelatedlocalrepository(从无关的本地存储库应用补丁)这里有一个快捷方式可以帮你实现。  git--git-dir=PATH_TO_OTHER_REPOSITORY_HERE/.gitformat-patch-k-1--stdoutCOMMIT_HASH_ID_HERE|gitam-3-k5。CheckifyourBranchchangesispartofOtherbranch)cherry这个命令可以检查你的分支是否在其他分支中被修改过。它将使用+或-标识符显示当前分支上的更改。+表示不存在,-表示存在于现有分支中。  gitcherry-vOTHER_BRANCH_NAME_HERE  #例如:tocheckwithmasterbranch  gitcherry-vmaster6。Startanewbranchwithnohistory(开始一个没有历史记录的新分支)有时候,你想开始一个新的分支,但不想运行很长的历史记录,例如,你想把代码放在公共域(开源),但不想分享历史。gitcheckout--孤儿NEW_BRANCH_NAME_HERE7。CheckoutFilefromOtherBranchwithoutSwitchingBranches(CheckoutFilefromOtherBranchwithoutSwitchingBranches)这里会教你如何获取你想要的文件。gitcheckoutBRANCH_NAME_HERE--PATH_TO_FILE_IN_BRANCH_HERE8。忽略跟踪文件中的变化(IgnoreChangesinaTrackedFile)如果你在一个团队中工作,他们都在使用同一个分支,也许你会经常使用获取/合并(fetch/merge),但这有时需要重新设置特定的配置文件,这意味着您必须在每次合并后进行更改。现在,使用此命令,您可以要求Git忽略对特定文件的更改。gitupdate-index--假设不变PATH_TO_FILE_HERE9。Checkwhetherthesubmittedparthasbeenchangedinthereleaseversion(Checkifcommittedchangesarepartofarelease)name-rev这个命令可以告诉你在哪里提交到最新版本。使用此代码可帮助您检查提交的部分是否已在发布版本中进行更改。gitname-rev--name-onlyCOMMIT_HASH_HERE10。Useresetinsteadofmerge(Pullwithrebaseinsteadofmerge)当一个特性分支被合并到主流中时,分支合并将被记录在Git中作为合并提交。但是当团队的多个成员在同一个分支上工作时,定期合并可能会导致多个合并消息在日志中显得杂乱无章。因此,您可以使用重置(rebase)来保持历史清洁并清除无用的合并消息。gitpull--rebase另外,你也可以配置一个特定的分支来重置。gitconfigbranch.BRANCH_NAME_HERE.rebasetrue11。保存http用户/密码,增加http上传数据大小gitconfig--globalcredential.helperstoregitconfig--globalhttp.postBuffer524288000