您对开源项目的第一个贡献可能是一个非常奖励的经验。一旦您的功能,修复或增强作为GitHub PullRequest 1(PR)的一部分合并,您的大脑可能会开始在新收购的GitFoo🙅♀️中开始查看淘油的下一个问题。
如果您已经通过了这项练习,您也知道Git瑞士军刀,以及相关代码协作平台(GitHub等),可能会感觉像是黑色艺术和压倒性。当事情走向南方时,这是令人痛心的,例如。审阅者请求更改代码。
但即使在您的代码贡献很好的情况下,审阅者也会屏蔽您在接受(将“)进入上游(”目标“)存储库之前在提交之前执行其他步骤。
以下是您可能在评论期间看到的典型评论者(或机器人)评论的简短列表:
让我告诉你,我几次以同一情况在一起,既是承受者和审查员,则为在VMware事件Brontappliance(VEBA)项目上。
我已经见证了多次热情(首次)贡献者,通常没有关于Git和Softwaredevelopment的知识,可能拼命地失败,因为下面的工具,术语或隐秘射手,如下所示:
git推上上游头:问题-1to< some_remote_url> !! [被拒绝]头 - >问题1(非快进)错误:无法推送一些refs'< some_remote_url>'提示:更新被拒绝,因为当前分支的尖端是LaplingHint:它的远程对应。在再次推动之前,集成了远程更改(例如:' git pull ...').hint:请参阅'注意关于快进和#39; ' git push --help'有关详细信息。
随着时间的推移,我为我的日常工作建立了一系列模式。他们希望让我保持组织和保护我免受普通错误,例如常见的错误。推动错误的分支/存储库。当我并行工作时,这更重要。
当然,我在这里和那里调整这些模式,具体取决于我正在使用的项目或团队的贡献范士/工作流程。我希望你找到专题,特别是当你被封锁或沮丧时😄
始终确保您阅读并了解项目的贡献指南,请在开始编码Andopen Andopen申请之前,请按照所提供的问题/拉拔请求模板进行操作。
如果该项目不提供任何这些,请首先搜索相关问题。如果您的想法/修复尚未讨论,则在审查您提交的原因期间,打开一个问题以避免冗长。前期,清晰和友好的通信是开源项目中的关键。
在处理存储库时,GIT的漂亮事情是远程URL或本地文件夹之间的概念在此内容不会区别。我们可以将此与Osoventage一起使用,以在不创建Repositoryon Github的情况下在不创建的操作中显示一些概念。
让我们创建一个本地演示存储库令人敬畏的项目以了解后续部分中解释的图案。
MKDIR令人敬畏的项目&& CD Awesome-ProjectGit init。/users/mgasch/awesome-project/.git/#种子存储库中的第一个委托,&&& git添加Readme.md&& git commit -s -m"添加自述文件"
为了避免不得不记住所有不同的命令行标志,我跨越$ shell aliases,例如, gloga是一个以上命令的快捷方式。
许多$ shell和plugin管理器,例如ohmyzsh提供有用的预定义的GITALIASES。为清楚起见,我将在此帖子中使用完整命令。
让我们创建更多的宣告,让这篇文章更加现实。
在{1..5}中的i; do touch file_ $ {i}; git添加file_ $ {i}; git commit -s -m" feat:添加功能$ {i}" -m"关闭:#$ {i}" ;完成[输出省略] git log --oneline --decorate-graph --all * aa08aaf(头部 - > main)专长:添加功能5 * 3f00922 feat:添加功能4 * 525a0eb feat:添加功能3 * d800962壮举:添加功能2 * a78afae feat:添加功能1 * fdb642a添加自述文件
忽略现在使用-m标志添加到每个提交的文本。我会在犯下的部分中返回他们。
默认情况下,您无法对存储库进行直接更改(除非您是Aowner或维护者)。这就是GitHub建立了叉/拉请求工作流程的原因。
叉子在您自己的帐户中创建了原始(" Origin"或"上游")存储库中的时间点克隆("或#34;)存储库。您的更改始终是inthat存储库。然后,您可以在原点创建(打开)拉出请求。
Git CLI没有叉的概念。但是我们可以用普通的OL&#39模仿工作流程;克隆。即使我们无法使用以下示例涵盖完整的原点/叉/本地_fork_clone终端,Helpto将至少保持复杂性,同时关注有用的模式。
#留下原点存储库文件夹CD ..#通过创建一个名为Clonegit克隆的克隆魔法项目叉 - 令人敬畏的项目克隆到' fork-awesome-project' ...完成。 CD Fork-Awesome-Project
一件好事是Git将记住从Andautomicalical上创建克隆的位置,以跟踪romation / main。
#show远程详细信息遥控器源*远程原产地获取URL:/用户/ MGASCH / Awesome-Project推送URL:/用户/ MGASCH / Awesome-Project Head Branch:主遥控器分支:主要跟踪的本地分支配置为' git配置Pull&#39 ;:主要合并与远程主本地ref配置为' git push&#39 ;: main推送到main(最新)#分支跟踪详情granch -avv * main aa08aaf [原产地/ main] feat:添加功能5 remotes / horiz / head - > Origin / Main Remotes / Origin / Main AA08AAF Feat:添加功能5
git log --oneline --decorate -graph --all * aa08aaf(头部 - > main,horien / main,origh / head)专长:添加功能5 * 3f00922 feat:添加功能4 * 525a0eb feat:添加功能3 * D800962专业:添加功能2 * A78AFAE FORM:添加功能1 * FDB642A添加自述文件
在这里,头部 - >主要告诉您在Checurrent存储库中的当前位置(提交)(井,文件夹)。还要注意附加原点/ mainand源/头引用。他们向您展示了原始存储库中的头部和主2分支的位置。
并且有第一次捕获:在真实的场景中,可能会有更多的提交,已经添加到原点存储库中。因此,重要的是要使遥控器的更改保持避免在稍后阶段的问题,例如,避免问题。合并冲突将同时更改相同的代码路径。
像Main分别的头部,分支或标签分别为V1.0.2都不是无可读的参考,AKA REFS在GIT存储库中指向特定提交SHA。
将涵盖与遥控器同步的主题,以保持Forkin Sync。但由于人们可以轻易丢失所有不同的存储库,我将首先覆盖一些重要的命名模式。
在创建克隆后执行的第一步是将突发性重新命名为更有意义的东西,例如, “上游的”。
Git Remote Rename Origin上游#显示最后一次提交log-onine -1aa08aaf(头部 - > main,上游/主要,上游/头部)壮举:添加功能5
对我来说,上游/主要读取更自然。但随时可以选择任何叫做什么不迷失的名字。
git clone提供-o( - - origin)标志,以提供克隆操作期间的自定义远程名称。
此外,并防止我们意外地推动到错误的遥控器,我们可以为Git推送配置一个虚拟URL。有了这个小技巧,Git willprevent我们从推送到上游存储库。
#no_push是一个无效的Urlgit远程设置 - url --push上游no_push#oops,我并不意味着向上逐步推送上游推送:' no_push'似乎不是一个git存储ordfatal:无法从远程存储库读取。请确保您拥有正确的访问权限和存储库存在。
您可能会想知道为什么需要这一点,因为通常无论如何您都不会将权限推送到上游。好吧,随着时间的推移,您可能真正地发现了一个项目的合作员甚至是维护者。这很棒,但如果你不小心你的承诺结束了错误的存储库......特别是你不遵循直观的远程命名策略。
这是另一个提示:如果我们使用真正的远程存储库,例如, github,作为一个anexample,你会把叉子克隆到你的本地机器。根据平台和工具,叉子的遥控器可能会出现起源,而“真正的”源存储库(“上游”)可能不会出现在youperform一个git远程显示时出现。像往常一样,有一个简单的修复。
#假设原点实际上是forkgit远程重命名源fork#添加真实上游,例如, VEBA Projectgit远程添加上游[email protected]:VMware-Samples / vCenter-event-Broker-Appliance#所有存储库和Prune Stale Branchesgit fetch -avp [输出省略]
对于我使用GitHub问题编号解决的分支名称,其中有一个贡献:
我被迫创造一个问题,这是一件好事
一旦您并行工作多个问题/分支机构,此方法就会从意外推动错误的代码来拯救多次。无论你选择什么名字饰品,只要它一致(可以自动化)你就好了。
以下是使用GH CLI创建问题和相应分支的示例。
#也可以通过github uigh问题创建--title" abc被打破" - agsignee" @ me" - Body" ABC由于XYZ"在< yrt; some_remote> https://> some_remote> / mexing / 20#使用上面的问题编号并创建并切换到新的Branchgit checkout -b问题-20开关到一个新的分支机构和#39;问题-20' #创建提交...
#获取最新的存储库Informationgit fetch -avp [省略的输出] git branch --merged | egrep"问题 - " | XARGS GIT分支-D [省略输出]
-d标志告诉git只删除已完全合并的分支。如果存储库没有CreateMerge为PRS承诺,则此命令可能无法为您工作。在那种情况下(或者如果你真的想以任何原因摆脱yourbranch),请使用Brute-Force Way Git Branch -D。
随着时间的推移,特别是在非常活跃的项目中,上游存储库将在提交方面的叉子的Beahead。因此,您需要跟上这些上游更改并将它们同步到叉子中。
让我们在我们的示例中创建更多的提交令人敬畏的项目来制作这个。
#假设Fork目录CD ../awesome-project#为i中的{6..10}中创建提交; do touch file_ $ {i}; git添加file_ $ {i}; git commit -s -m" feat:添加功能$ {i}" -m"关闭:#$ {i}" ;完成[输出省略] git log --oneline --decorate -graph --all * 3c86329(head-> main)专长:添加功能10 * f2a1e6a feat:添加功能9 * 17b3210 feat:添加功能8 * f4896b0 feat :添加功能7 * 68D3931 Feat:添加功能5 * 3F00922 Feat:添加功能4 * 525A0EB Feat:添加功能3 * D800962 Feat:添加功能2 * A78AFAE Feat:添加功能1 * FDB642A添加自述文件
现在我们需要切换回叉子并将其与上游同步。
CD ../fork-awesome-project#获取有关我们最近的ChangeGit fetch的信息-avp [省略的输出] git log --oneline --decorate -graph --all * 3c86329(上游/主要,上游/头)壮举:添加功能10 * f2a1e6a feat:添加功能9 * 17b3210 feat:添加功能8 * f4896b0 feat:添加功能7 * 68d3931 feat:添加功能6 * aa08aaf(head-> main)专长:添加功能5 * 3f00922 feat:添加功能4 [Snip]
在上面的命令中,我只获取有关更改的信息,而不是替代的信息,而不是自己。你可以看到这个,因为我们的当前位置,即。头部,仍然指向主要的主题。
我的意图是,我想用安然的方式训练你的肌肉记忆,而不是通常的git拉动完成工作。
如果您仍然对该头部混淆,请将其视为“您是”标记在地图上以指示当前位置。当您穿过地图(提交和refs)时,头部将相应地移动。
rebasing是一个惊人的,但经常被误解,git的概念。它允许您将refs和evencommits移动到另一个提交,分支机构或任何其他参考文献上。
关于我们上面的示例,我们希望移动我们的叉式主分支机构(HEAD)的当前位置以匹配其上游/主要对应。由于我们在两个存储库之间的历史记录没有任何冲突的变化,因此与上游/主要同步带来主要是:
#在fork' s main branchgit rebase上游/ mainscescessly重新替换和更新的refs / heads / main.git log --oneline --decorate-graph --all * 3c86329(主机,上游/主要,上游/头部)专长:添加功能10 * f2a1e6a feat:添加功能9 * 17b3210 feat:添加功能8 * f4896b0 feat:添加功能7 * 68d3931 feat:添加功能6 [Snip]
因为您将在项目中执行代码更改,即项目中的NOT MAIN(或相应的“主”分支),但不会出现合并或重新划分冲突。由于线性提交历史记录,Git Rebase可以简单地将头部插入所需的REF。
我的建议:Rebasing而不是Git Merge应该成为你的reamiedwore(集成)从遥控器进入本地分支的更改。您将在哦,我的git中看到git rebase的真正实力!下面的部分...
提交表示Git中仅申请历史记录的原子变化,如在日志中。因此,重要的是,精心制作的提交包括aleabingful但简要说明的内容。
尽管工具可能无法强制执行标准,但例如,字符限制等等,您应该知道和遵循一些提出最佳实践。 iusivally将新人指向这篇伟大的帖子:如何编写承诺。
您也可能想知道-m标志和文本,如" feat:"在执行Git提交时使用前面的示例。
让我们借此例解释:Git Commit -S -M" feat:添加功能x" -m"关闭:#34"
可以多次使用-m标志,并替换否则会替换交互式编辑器,以创建提交标题和消息。甚至支持多线程(仅在第一个和#34之后继续打字;)。
根据您所贡献的项目,它可能会使用特定模式A提交标题或身体来制作一个变更。这里"壮举:"是否识别为提交在项目中将在“功能”部分中突出显示,如果是usesthis。从Vebaproject看看这个例子。
阅读项目的贡献指南或询问维护者应如何制作如何(如果)承诺。
如果您包含一个关键词"关闭:#34"在提交消息主体并打开拉出请求中,GitHubwill尝试自动将指定的问题(这里#34)链接到PR所以在PR合并后自动关闭。就像使用theaformentioned前缀一样,这些关键字可能用于更改内容或释放。
最后,-S标志将添加一个逐个页脚,该页脚是一个修补程序的作者,通常需要在项目中进行注重的off-offer。但是,不要用数字标识yourcommits来救。
也许最大的问题是何时创建提交以及如何打破它们的upinto单个块。
后者真的取决于工作类型和项目指南(如果有的话)。在我看来,属于(“原子”)的一切都进入了SameCommit,包括文档更新。这使得恢复orcherrypick更改更加简单。
如果您在较大的拉动请求上工作,可能会将其分解为IntoSub-Tasks,该任务很好地映射到个人提交。或者,PR本身必须被分解为具有较小(单个)提交的多个PRS。
创建提交声音很容易,对吧?好吧,你往往不知道你的工作中的初影,以及如何(时间)来打破它们。它也可能是在事实之后请您要求您这样做(请参阅以下部分)。
如果你像我这样的偏执,你实际上可能想要经常提交并推动TOA遥控器(叉子)作为一个便宜的备份,以防你在你的localMachine上搞砸......或者你的磁盘突然和备份(你做备份,不要't你是吗?)是从两天前♥
长话短说,在大多数情况下,你根本不知道最终的历史将是什么。您的(临时)提交历史实际上可能看起来像符号,呃这是:
#在降序提交时间顺序* 7010AA5我需要另一份工作* 3b3361e所以关闭... * 58327d5该死的!* 0a4652e另一个FIX * B1CC213 WIP
让我告诉你,这是规范,也不糟糕!像往常一样与Git,有几种方式消失了。我的首选是使用Git Resetonce我的工作已经准备好了。
以下是如何根据叉子和Branch问题-31中上面的提交历史来修复它:
#我们主要是主要的纪念日志--oneline --decorate --graph --all主要^ .. head * 7010aa5(head->问题-31)我需要另一份工作* 3b3361e如此接近...... * 5832755该死的!* 0a4652e另一个FIX * B1CC213 WIP * 3C86329(上游/主要,上游/头部,主要)专长:添加功能10#软重置我们的头部要使我们的所有提交更改(没有丢失!)如果您想要多个提交#添加我们的更改,请将GIT重置主#冲洗并重复以下两个步骤.AGAINGIT添加< stuff> #创建一个漂亮的commitgit commit -s -m"修复:修复abc&#34中的错误; -m"关闭:#31" #Heureka!git log --oneline --decorate - graph --all main ^ .. head * 96c6889(head->问题-31)修复:修复abc * 3c86329中的错误(上游/主要,上游/头部,主要)壮举:添加功能10
重置命令超级方便,恢复已提交的更改,就像他们被承诺一样 - 但不丢失实际更改。它们再次在工作目录中被静置时被冻结。将重置视为在特征的行动中。
如果要重新排列进入的内容,则重置命令也可以派上友好。假设您想要awesome_script.sh不在第一个但第二次提交中.Simply(软)将其重置为先前状态(提交)(如上所示,并以所需的内容再次提交)。
尽管如此:Git Reset有一个 - 丢弃的选项,它将丢弃AllChanges。如果这不是你想要的git反射是有帮助的......
最后,我将涵盖一些典型的挑战,你可能会跑到你的第一个拉出请求......或者为了忘记这个东西♥
在公关评论期间,以下部分被分解为您强大的典型对话。
通常,您将被一个友好的🤖致辞,说明您忘记了更多的签名。这也可能发生在rebase /壁球(见下文)后发生,其中您没有签署生成的提交。
问题:在分支机构-31中提交96c6889,尚未在上游存储库中注销的AND AND AND AND AND AND。 #当前提交历史记录日志主^ .. head-oneline96c6889(head->问题-31)修复:修复abc3c86329中的错误(上游/主要,上游/头部,main)专长:添加功能10 解决方案:修改提交并强制推送到叉子(所以它在相关的PR中得到了折断。 #保留提交内容/消息,但签署它关闭(-s)git commit -amend --no-edit -s [miss-31 a2817f0] fix:修复abc日期的错误日期:WED 6月9日星期三14:48:26 2021 +0200 1文件已更改,0插入(+),0删除( - )创建模式100644 File_fixed.Shgit Push Fork Head:问题-31 --Force-with-租约[省略输出] 记得你 ......