What are the differences between git branch, fork, fetch, merge, rebase and clone?
我想了解Git中分支、分叉和克隆之间的区别?
同样地,当我使用
另外,与
我怎样才能把个人的承诺压在一起?
它们是如何使用的,为什么要使用它们,它们代表什么?
Github是如何计算的?
吉特
这个答案包括很多人都问过的Github。好的。本地存储库
Git(本地)有一个目录(
Git存储通过保存整个文件而更改的文件的每个版本。在这方面,它也不同于SVN,因为您可以转到任何单独的版本,而无需通过增量更改"重新创建"它。好的。
Git根本不"锁定"文件,因此避免了编辑的"独占锁定"功能(考虑到像pvc这样的老系统),因此所有文件都可以一直被编辑,即使是离线的。它实际上在合并文件更改(在同一个文件中)方面做得非常出色!在拉取或获取/推送到远程存储库(如Github)期间一起执行。唯一需要手动更改(实际上是编辑文件)的时间是,如果两个更改涉及同一行代码。好的。分支
分支允许您保留主代码("主"分支),复制(新分支),然后在该新分支内工作。如果工作需要一段时间,或者主服务器在创建分支之后获得了大量更新,那么应该对主分支进行合并或重新调整(通常更倾向于更好的历史记录和更容易解决冲突)。完成后,将分支中所做的更改合并回主存储库。许多组织对每一项工作都使用分支,不管它是一个特性、bug还是琐事项。其他组织只使用分支进行重大更改,如版本升级。好的。
fork:对于一个分支,您可以控制和管理该分支,而对于fork,其他人可以控制接受返回的代码。好的。
一般来说,做分支有两种主要方法。第一种方法是在主分支上保留大多数更改,只对更大和运行时间更长的内容使用分支,如版本更改,您希望有两个分支可用于不同的需求。第二种方法是,您基本上为每个特性请求、错误修复或杂务创建一个分支,然后手动决定何时将这些分支实际合并到主分支中。虽然这听起来很乏味,但这是一种常见的方法,也是我目前使用和推荐的方法,因为这样可以保持主分支的清洁,并且是我们提升到生产的主分支,所以我们只需要通过重新平衡和合并分支来完成、测试代码。好的。
把一个分支"引进"给主人的标准方法是做一个
基本上,这个想法是你从一个特定的点分支(通常是从主人)。自从你分支之后,"大师"本身就从那个分支点向前移动了。如果您在分支中所做的所有更改都是针对主控形状的当前状态及其所有最新更改进行的,那么它将是"更干净"(更容易解决问题,更容易理解历史)。因此,过程是:保存更改;获取"新"主控形状,然后重新应用(这是重新平衡部分)更改。请注意,REBASE和MERGE一样,可能会导致必须手动解决的冲突(即编辑和修复)。好的。
需要注意的一条准则:只有当分支是本地的并且您还没有将其推到远程时,才重新设置它!这主要是因为重新平衡可以改变其他人看到的历史,其中可能包括他们自己的承诺。好的。跟踪分支
这些是命名为
获取新分支:在克隆的初始点,您将拥有所有分支。但是,如果其他开发人员添加分支并将它们推送到远程,则需要有一种方法来"了解"这些分支及其名称,以便能够在本地将它们拉下来。这是通过一个
合并是将来自不同分支或同一分支的不同版本(例如,当本地分支和远程分支不同步时)的代码更改组合在一起的过程。如果在一个分支中开发了工作,并且该工作已经完成、准备好并经过测试,那么可以将其合并到
当所做的
/好的。
好吧,如果是有冲突的,当时的硕士学位将有新的变化,在补充说。如果是有冲突的,这意味这同样的文件有相似的变化三家系的代码,它不能自动merge。。。。。。。在这个案例
/好的。
你有一次的时间分辨的任何冲突中你会一次又来了
/好的。
当工艺不好的工作中你会发现,这是非常方便的
/好的。 互动的移位和squashing / reordering / removing commits
如果你要做很多工作中的一个小步骤,你的承诺,例如,代码为"工作中的进展的每一天,你可能想要的"南瓜"的那些小的多commits成几个较大的commits。。。。。。。这可以是有用的,当你想做代码与同事的评论。你不想回答,"你把步骤(通过commits),你想说的是这里是年底的效应(不同的)的所有的变化,这为我工作中的一个承诺。
/好的。
对关键因子的评价时,是否考虑这样做是否是在多commits是对同一文件或文件的一次以上的(更好的南瓜commits在这案例)。这是做与政府互动的工具。本机床出口commits删除你的南瓜,commits,reword消息,等。例如,
/好的。
/好的。
要小心,虽然和使用这个工具gingerly’"。做一个南瓜/删除/ reorder at a时,退出和保存这承诺,然后reenter的工具。如果commits是不邻接的你可以reorder他们(南瓜,然后为需要)。你可以删除commits真的在这里,太,但你真的需要是悲伤,你是做什么当你做那!
/好的。 叉子
Git存储库中有两种主要的协作方法。第一个,上面详述的,是直接通过分支,人们拉和推从/到。这些合作者在远程存储库中注册了他们的ssh密钥。这将允许他们直接推送到该存储库。缺点是您必须维护用户列表。另一种方法-分叉-允许任何人"分叉"存储库,基本上是在自己的Git存储库帐户中创建本地副本。然后他们可以进行更改,并在完成后发送一个"拉请求"(实际上更像是来自他们的"推送"和实际存储库维护人员的"拉"请求),以接受代码。好的。
第二种方法使用forks,不需要有人维护存储库的用户列表。好的。github
GitHub(一个远程存储库)是一个远程源,如果您有(或被添加到)这样的存储库,那么您通常会将那些已提交的更改推送到该源,因此本地和远程实际上是完全不同的。另一种考虑远程存储库的方法是,它是一个位于远程服务器上的
当您在GitHub Web浏览器GUI中"fork"时,您可以单击此按钮-在GitHub帐户中创建代码的副本("克隆")。第一次这样做可能会有点微妙,因此请确保查看代码库列在哪个存储库下—要么是原始所有者,要么是"派生自",然后这样做:好的。
氧化镁好的。
一旦您有了本地副本,您就可以根据自己的意愿进行更改(通过将它们拉到本地机器上并将其推到本地机器上)。完成后,您将向原始存储库所有者/管理员提交一个"拉请求"(听起来很花哨,但实际上您只需点击:,他们就会"拉"进去。好的。
对于一起处理代码的团队来说,更常见的是"克隆"存储库(单击存储库主屏幕上的"复制"图标)。然后,在本地键入
如Github部分所示,克隆是存储库的副本。当您有一个远程存储库时,您对其URL发出
核心概念的可视化可以在http://marklodato.github.com/visual-git-guide/index-en.html和http://ndpsoftware.com/git欺骗表.html loc=index好的。
如果你想直观地显示变化是如何工作的,你就不能用一个我称之为"地铁地图"(特别是伦敦地铁)的图形用户界面来击败视觉工具
您还可以使用它来添加、提交和管理您的更改!好的。
。好的。
尽管GitG/GitX相当少,但GUI工具的数量仍在继续扩大。许多Mac用户使用Brotherbard的Gitx分支,对于Linux,一个很好的选择是智能Git,它具有直观而强大的界面:好的。
氧化镁好的。
请注意,即使使用GUI工具,您也可能在命令行中执行大量命令。好的。
为此,我的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # git alias g='git status' alias gcob='git checkout -b ' alias gcom='git checkout master' alias gd='git diff' alias gf='git fetch' alias gfrm='git fetch; git reset --hard origin/master' alias gg='git grep ' alias gits='alias | grep"^alias g.*git.*$"' alias gl='git log' alias gl1='git log --oneline' alias glf='git log --name-status' alias glp='git log -p' alias gpull='git pull ' alias gpush='git push ' |
我的
所以这些是:好的。
1 2 3 | [alias] co = checkout cob = checkout -b |
号
示例用法:
您可能会发现https://learngitbranching.js.org/对于学习一些基本概念很有用。屏幕截图:视频:https://youtu.be/23jqqclpss0好的。最后,7个关键救生员!
您可以进行更改、添加和提交它们(但不要强制),然后噢!你意识到你是大师!好的。
1 2 3 4 5 6 | git reset [filename(s)] git checkout -b [name_for_a_new_branch] git add [file(s)] git commit -m"A useful message" Voila! You've moved that 'master' commit to its own branch ! |
在本地分支机构工作时,您会弄乱一些文件,只想回到上一次执行
1 | git reset --hard origin/master # You will need to be comfortable doing this! |
。
您开始在本地进行更改,编辑六个文件,然后,噢,废话,您仍然在主(或其他)分支中:好的。
1 2 3 | git checkout -b new_branch_name # just create a new branch git add . # add the changes files git commit -m"your message" # and commit them |
您将当前分支中的一个特定文件弄乱,并希望基本上"重置"该文件(丢失更改)为上次从远程存储库中提取该文件时的状态:好的。
1 | git checkout your/directories/filename |
。
这实际上重置了文件(与许多git命令一样,它在这里所做的工作没有很好的命名)。好的。
你在本地做了一些修改,你想确保在你做一个
你在重新平衡,但事情变得一团糟:好的。
1 | git rebase --abort # To abandon interactive rebase and merge issues |
。
将您的Git分支添加到您的
氧化镁好的。
分支机构是
好啊。
克隆只是存储库的副本。从表面上看,它的结果相当于
分支是存储库中的某个内容。从概念上讲,它表示一个开发线程。您通常有一个主分支,但是您也可能有一个分支,其中您正在处理某个特性XYZ,另一个用于修复bug ABC。当您签出了一个分支后,您所做的任何提交都将保留在该分支上,并且不会与其他分支共享,直到您将它们与所讨论的分支合并或重新设置到所讨论的分支上。当然,当谈到分支时,Git看起来有点奇怪,直到您查看如何实现分支的底层模型。与其自己解释(我已经说得太多了,我想),不如链接到"计算机科学"上解释Git如何在Git网站上创建分支和提交模型:
http://eagain.net/articles/git-for-computer-scientists(计算机科学家)/
叉子其实不是一个Git概念,它更像是一个政治/社会概念。也就是说,如果有些人对项目的发展方式不满意,他们可以把源代码和原始开发人员分开来处理。那将被视为一把叉子。Git使分叉变得容易,因为每个人都有自己的源代码"主"副本,所以它很简单,只需与原始项目开发人员断开联系,不需要像与SVN一样从共享存储库中导出历史。
编辑:由于我不知道Github等网站使用的"fork"的现代定义,请查看评论以及我下面的Michael Durrant的回答以了解更多信息。
以下是奥利弗·斯蒂尔对这一切如何结合的印象:
。
叉vs.克隆两个的话,这两个拷贝的意思 P / < >
请看这个图。< >子(从originally http:/ / www.dataschool.io /内容/图像/ / / MAR 2014 github1.png /子> <)。 P / < >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | .-------------------------. 1. Fork .-------------------------. | Your GitHub repo | <-------------- | Joe's GitHub repo | | github.com/you/coolgame | | github.com/joe/coolgame | | ----------------------- | 7. Pull Request | ----------------------- | | master -> c224ff7 | --------------> | master -> c224ff7 (c) | | anidea -> 884faa1 (a) | | anidea -> 884faa1 (b) | '-------------------------' '-------------------------' | ^ | 2. Clone | | | | | | | | | | | 6. Push (anidea => origin/anidea) v | .-------------------------. | Your computer | 3. Create branch 'anidea' | $HOME/coolgame | | ----------------------- | 4. Update a file | master -> c224ff7 | | anidea -> 884faa1 | 5. Commit (to 'anidea') '-------------------------' (a) - after you have pushed it (b) - after Joe has accepted it (c) - eventually Joe might merge 'anidea' (make 'master -> 884faa1') |
叉 P / < >
- 拷贝到你的remote回购(云),它链接到"乔"
- 然后你可以拷贝的克隆到你当地的回购和F * % $起来
- 当你做的是你不能推回到你的remote
- 然后你可以问乔,如果他想用它在他的项目由cllcklng拉我的要求
克隆 P / < >
- 拷贝到你当地的回购(harddrive)
只是添加到其他人的注意,具体到forking。 P / < >
它的好,要意识到,technically,cloning回购的回购和forking的是同样的事情。做: P / < >
1 | git clone $some_other_repo |
你可以自己在TAP后-你需要的只是一些其他的forked回购。 P / < >
蠢货,VCS,也在事实上所有关于罢工<><>forking / cloning罢工。的伙伴关系,从"只是browsing"用remote PS这样一个cgit,有很小的做用Gi回购,并不是involve<><>的罢工的罢工forking / cloning的回购在一些点。 P / < >
然而, P / < >
-
当有人说我forked回购X,他们的意思是,他们有雅 在克隆的回购在人与intention expose到它 其他人,例如给一些experiments,或到不同的apply 访问控制mechanism(EG。到让人没有github但存取 与公司内部的帐户到collaborate)。 P / < >
事实是:回购现在也可能与雅比其他的命令
git clone ,,它的现在可能hosted某处在服务器级 opposed到人的笔记本电脑,现在可能有着不同的slightly 格式("光秃秃的回购",IE。没有工作是我所有的只是树) 技术细节。 P / < >"事实上,它现在将可能含有不同的设定的branches, 标签或commits现在可能的原因,为什么他们这样做是在第一 的地方。 P / < >
(什么github确实,当你点击"叉",也只是cloning与添加 糖:它的clones回购的你,让它在你的帐户,记录 "forked从什么地方,adds remote取名为"上游",和现在 importantly,起好的动画)。 P / < >
-
当有人说我cloned回购X,他们的意思是,他们有雅 在克隆的回购locally他们的笔记本电脑或桌面与intention 研究它,跟它玩,contribute到它,或者建造的东西从源 在它的代码。 P / < >
"美"的Gi是它让这都是非常适合在一起:所有这些普通股票回购部分<><>的罢工的罢工块/承诺链,所以它的安全可能快到(注意看下面的merge)和四之间的所有这些变化后的回购协议号,你看到合适的。 P / < >
注:"安全",只要你不要rewrite普通部分和链,只要是不conflicting同步变化。 P / < >