git branch,fork,fetch,merge,rebase和clone之间有什么区别?

What are the differences between git branch, fork, fetch, merge, rebase and clone?

我想了解Git中分支、分叉和克隆之间的区别?

同样地,当我使用git fetch而不是git pull时,这意味着什么?

另外,与merge相比,rebase是什么意思?

我怎样才能把个人的承诺压在一起?

它们是如何使用的,为什么要使用它们,它们代表什么?

Github是如何计算的?


吉特

这个答案包括很多人都问过的Github。好的。本地存储库

Git(本地)有一个目录(.git,您将文件提交给该目录,这是您的"本地存储库"。这不同于SVN这样的系统,您可以在SVN中立即添加并提交到远程存储库。好的。

Git存储通过保存整个文件而更改的文件的每个版本。在这方面,它也不同于SVN,因为您可以转到任何单独的版本,而无需通过增量更改"重新创建"它。好的。

Git根本不"锁定"文件,因此避免了编辑的"独占锁定"功能(考虑到像pvc这样的老系统),因此所有文件都可以一直被编辑,即使是离线的。它实际上在合并文件更改(在同一个文件中)方面做得非常出色!在拉取或获取/推送到远程存储库(如Github)期间一起执行。唯一需要手动更改(实际上是编辑文件)的时间是,如果两个更改涉及同一行代码。好的。分支

分支允许您保留主代码("主"分支),复制(新分支),然后在该新分支内工作。如果工作需要一段时间,或者主服务器在创建分支之后获得了大量更新,那么应该对主分支进行合并或重新调整(通常更倾向于更好的历史记录和更容易解决冲突)。完成后,将分支中所做的更改合并回主存储库。许多组织对每一项工作都使用分支,不管它是一个特性、bug还是琐事项。其他组织只使用分支进行重大更改,如版本升级。好的。

fork:对于一个分支,您可以控制和管理该分支,而对于fork,其他人可以控制接受返回的代码。好的。

一般来说,做分支有两种主要方法。第一种方法是在主分支上保留大多数更改,只对更大和运行时间更长的内容使用分支,如版本更改,您希望有两个分支可用于不同的需求。第二种方法是,您基本上为每个特性请求、错误修复或杂务创建一个分支,然后手动决定何时将这些分支实际合并到主分支中。虽然这听起来很乏味,但这是一种常见的方法,也是我目前使用和推荐的方法,因为这样可以保持主分支的清洁,并且是我们提升到生产的主分支,所以我们只需要通过重新平衡和合并分支来完成、测试代码。好的。

把一个分支"引进"给主人的标准方法是做一个merge。分支也可以"重新调整"为"清理"历史记录。它不会影响当前状态,并会提供"更清晰"的历史记录。好的。

基本上,这个想法是你从一个特定的点分支(通常是从主人)。自从你分支之后,"大师"本身就从那个分支点向前移动了。如果您在分支中所做的所有更改都是针对主控形状的当前状态及其所有最新更改进行的,那么它将是"更干净"(更容易解决问题,更容易理解历史)。因此,过程是:保存更改;获取"新"主控形状,然后重新应用(这是重新平衡部分)更改。请注意,REBASE和MERGE一样,可能会导致必须手动解决的冲突(即编辑和修复)。好的。

需要注意的一条准则:只有当分支是本地的并且您还没有将其推到远程时,才重新设置它!这主要是因为重新平衡可以改变其他人看到的历史,其中可能包括他们自己的承诺。好的。跟踪分支

这些是命名为origin/branch_name的分支(而不仅仅是branch_name的分支)。当您向远程存储库推送和从远程存储库拉取代码时,这实际上是发生这种情况的机制。例如,当您的git push分支名为building_groups时,您的分支首先转到origin/building_groups,然后转到远程存储库。同样,如果执行git fetch building_groups,则检索到的文件将放在origin/building_groups分支中。然后可以选择将此分支合并到本地副本中。我们的做法是始终执行git fetch和手动合并,而不是仅执行git pull(这两个步骤都是一步完成的)。好的。正在获取新分支。

获取新分支:在克隆的初始点,您将拥有所有分支。但是,如果其他开发人员添加分支并将它们推送到远程,则需要有一种方法来"了解"这些分支及其名称,以便能够在本地将它们拉下来。这是通过一个git fetch来完成的,它将使用跟踪分支(例如,origin/将所有新的和更改过的分支放入本地存储库中。一旦fetched,可以git branch --remote列出跟踪分支,git checkout [branch]实际切换到任意给定分支。好的。合并

合并是将来自不同分支或同一分支的不同版本(例如,当本地分支和远程分支不同步时)的代码更改组合在一起的过程。如果在一个分支中开发了工作,并且该工作已经完成、准备好并经过测试,那么可以将其合并到master分支中。这是由git checkout master切换到master分支,然后是git merge your_branch。合并将把所有不同的文件,甚至对同一个文件的不同更改放在一起。这意味着它将实际更改文件中的代码以合并所有更改。好的。

当所做的checkoutmaster它的推荐也做一git pull origin masterto get的甚latest版本的远程主你的本地出产的热情的主人。如果远程主变,即,moved forward,你将看到的信息,reflects说,在那git pull。。。。。。。如果这是在案例(主变)你是advised到git checkout your_branch然后rebase它的主人,那你的变化真的得到replayed"指的是顶部的"新"的主人。然后你会继续与谈判的主升到AS日期显示在下一款的规定。

/好的。

好吧,如果是有冲突的,当时的硕士学位将有新的变化,在补充说。如果是有冲突的,这意味这同样的文件有相似的变化三家系的代码,它不能自动merge。。。。。。。在这个案例git merge new_branch会的报告说,有冲突的S(S)的resolve。。。。。。。你resolve",他们通过编辑的文件(这将有变化都在算计)的变化,选择你想要的,literally deleting的线的变化,你不想,然后省力的文件。的变化是separators标记物如========<<<<<<<<。。。。。。。

/好的。

你有一次的时间分辨的任何冲突中你会一次又来了git addgit commit那些变化的连续的merge(你将得到的反馈从NEA在这个过程的指南,你)。

/好的。

当工艺不好的工作中你会发现,这是非常方便的git merge --abort复位的事情。

/好的。 互动的移位和squashing / reordering / removing commits

如果你要做很多工作中的一个小步骤,你的承诺,例如,代码为"工作中的进展的每一天,你可能想要的"南瓜"的那些小的多commits成几个较大的commits。。。。。。。这可以是有用的,当你想做代码与同事的评论。你不想回答,"你把步骤(通过commits),你想说的是这里是年底的效应(不同的)的所有的变化,这为我工作中的一个承诺。

/好的。

对关键因子的评价时,是否考虑这样做是否是在多commits是对同一文件或文件的一次以上的(更好的南瓜commits在这案例)。这是做与政府互动的工具。本机床出口commits删除你的南瓜,commits,reword消息,等。例如,git rebase -i HEAD~10(注:这是一个~,而不是一个-)brings弹出下面的:

/好的。

interactive rebasing in Git

/好的。

要小心,虽然和使用这个工具gingerly’"。做一个南瓜/删除/ reorder at a时,退出和保存这承诺,然后reenter的工具。如果commits是不邻接的你可以reorder他们(南瓜,然后为需要)。你可以删除commits真的在这里,太,但你真的需要是悲伤,你是做什么当你做那!

/好的。 叉子

Git存储库中有两种主要的协作方法。第一个,上面详述的,是直接通过分支,人们拉和推从/到。这些合作者在远程存储库中注册了他们的ssh密钥。这将允许他们直接推送到该存储库。缺点是您必须维护用户列表。另一种方法-分叉-允许任何人"分叉"存储库,基本上是在自己的Git存储库帐户中创建本地副本。然后他们可以进行更改,并在完成后发送一个"拉请求"(实际上更像是来自他们的"推送"和实际存储库维护人员的"拉"请求),以接受代码。好的。

第二种方法使用forks,不需要有人维护存储库的用户列表。好的。github

GitHub(一个远程存储库)是一个远程源,如果您有(或被添加到)这样的存储库,那么您通常会将那些已提交的更改推送到该源,因此本地和远程实际上是完全不同的。另一种考虑远程存储库的方法是,它是一个位于远程服务器上的.git目录结构。好的。

当您在GitHub Web浏览器GUI中"fork"时,您可以单击此按钮Image of fork button-在GitHub帐户中创建代码的副本("克隆")。第一次这样做可能会有点微妙,因此请确保查看代码库列在哪个存储库下—要么是原始所有者,要么是"派生自",然后这样做:好的。

氧化镁好的。

一旦您有了本地副本,您就可以根据自己的意愿进行更改(通过将它们拉到本地机器上并将其推到本地机器上)。完成后,您将向原始存储库所有者/管理员提交一个"拉请求"(听起来很花哨,但实际上您只需点击:Image of pull request button,他们就会"拉"进去。好的。

对于一起处理代码的团队来说,更常见的是"克隆"存储库(单击存储库主屏幕上的"复制"图标)。然后,在本地键入git clone并粘贴。这将在本地设置您,您还可以推拉到(共享)Github位置。好的。无性系

如Github部分所示,克隆是存储库的副本。当您有一个远程存储库时,您对其URL发出git clone命令,然后您将得到存储库的本地副本或克隆。这个克隆包含所有内容、文件、主分支、其他分支、所有现有的提交、整个shebang。您对这个克隆进行添加和提交,然后将这些提交推送到远程存储库本身。正是这种本地/远程的概念使Git(以及类似于它的系统,如Mercurial)成为了一个dvcs(分布式版本控制系统),而不是更传统的cvs(代码版本控制系统),如svn、pvcs、cvs等,直接提交到远程存储库。好的。可视化

核心概念的可视化可以在http://marklodato.github.com/visual-git-guide/index-en.html和http://ndpsoftware.com/git欺骗表.html loc=index好的。

如果你想直观地显示变化是如何工作的,你就不能用一个我称之为"地铁地图"(特别是伦敦地铁)的图形用户界面来击败视觉工具gitg(macos的gitx),这对于显示谁做了什么、事情是如何变化、分散和合并等都是很好的。好的。

您还可以使用它来添加、提交和管理您的更改!好的。

Image of gitg/gitx interface。好的。

尽管GitG/GitX相当少,但GUI工具的数量仍在继续扩大。许多Mac用户使用Brotherbard的Gitx分支,对于Linux,一个很好的选择是智能Git,它具有直观而强大的界面:好的。

氧化镁好的。

请注意,即使使用GUI工具,您也可能在命令行中执行大量命令。好的。

为此,我的~/.bash_aliases文件中有以下别名(从每个终端会话的~/.bashrc文件调用):好的。

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 '

我的~/.gitconfig文件中有以下"git别名"——为什么有这些?这样分支完成(使用tab键)就可以工作了!好的。

所以这些是:好的。

1
2
3
[alias]
  co = checkout
  cob = checkout -b

示例用法:git co [branch]选项卡完成分支将起作用。好的。图形用户界面学习工具

您可能会发现https://learngitbranching.js.org/对于学习一些基本概念很有用。屏幕截图:enter image description here视频: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 !
  • 在本地分支机构工作时,您会弄乱一些文件,只想回到上一次执行git pull时的状态:好的。

    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命令一样,它在这里所做的工作没有很好的命名)。好的。

  • 你在本地做了一些修改,你想确保在你做一个git resetrebase的时候不会丢失它们:我经常手工复制整个项目(cp -r ../my_project ~/),当我不确定是否会弄乱git或丢失重要的修改时。好的。

  • 你在重新平衡,但事情变得一团糟:好的。

    1
    git rebase --abort # To abandon interactive rebase and merge issues

  • 将您的Git分支添加到您的PS1提示符(请参见https://unix.stackexchange.com/a/127800/10043),例如好的。

    氧化镁好的。

    分支机构是selenium_rspec_conversion。好的。

  • 好啊。


    克隆只是存储库的副本。从表面上看,它的结果相当于svn checkout,您可以从其他存储库下载源代码。Subversion之类的集中式VCS和Git之类的DVCSS之间的区别在于,在Git中,克隆时实际上是复制整个源存储库,包括所有历史记录和分支。现在您的计算机上有了一个新的存储库,您所做的任何提交都将进入该存储库。在您将这些提交推送到另一个存储库(或原始存储库)之前,或者在有人从您的存储库中提取提交(如果可以公开访问)之前,没有人会看到任何更改。

    分支是存储库中的某个内容。从概念上讲,它表示一个开发线程。您通常有一个主分支,但是您也可能有一个分支,其中您正在处理某个特性XYZ,另一个用于修复bug ABC。当您签出了一个分支后,您所做的任何提交都将保留在该分支上,并且不会与其他分支共享,直到您将它们与所讨论的分支合并或重新设置到所讨论的分支上。当然,当谈到分支时,Git看起来有点奇怪,直到您查看如何实现分支的底层模型。与其自己解释(我已经说得太多了,我想),不如链接到"计算机科学"上解释Git如何在Git网站上创建分支和提交模型:

    http://eagain.net/articles/git-for-computer-scientists(计算机科学家)/

    叉子其实不是一个Git概念,它更像是一个政治/社会概念。也就是说,如果有些人对项目的发展方式不满意,他们可以把源代码和原始开发人员分开来处理。那将被视为一把叉子。Git使分叉变得容易,因为每个人都有自己的源代码"主"副本,所以它很简单,只需与原始项目开发人员断开联系,不需要像与SVN一样从共享存储库中导出历史。

    编辑:由于我不知道Github等网站使用的"fork"的现代定义,请查看评论以及我下面的Michael Durrant的回答以了解更多信息。


    以下是奥利弗·斯蒂尔对这一切如何结合的印象:

    enter image description here


    叉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 / < >