关于Git的一些(基本)问题和澄清

时间:2011-09-26 05:37:38

标签: git

我正在研究和学习分布式版本控制系统的基础知识,特别是Git。在看了关于Git的Linus' Tech Talk之后,我有一些我不太了解的问题。值得注意的是,我来自基于Windows的SVN背景,所以我的所有问题都来自该环境。

  1. 如何处理合并到其他人的分支机构?也就是说,Joe和Jane都从head / master分支,而Joe想要合并Jane在她的分支中所做的更改,这是怎么做到的?为了使我的问题更具体 - 如果Joe在阿根廷而Jane在俄罗斯,这是怎么做到的?每个Git分支都有一个能够做这些事情的服务器吗?或者是一个中央服务器仍然负责跟踪所有当前分支机构及其居住地? Git如何知道所有这些(可能有数千个)分支在哪里? (特别是在Windows环境中!)

  2. Linus谈到没有备份,说这是不必要的,因为每个人都有他的代码副本。但是如果他克隆了一个存储库,做了几十行改变,提交,但从不推动......如果他的机器死了,他不会失去所有的改变吗?我认为我正确地理解了这个概念(所有提交都是本地直到推送),但他似乎对这个问题非常谴责,所以我很好奇。

4 个答案:

答案 0 :(得分:1)

1)你必须公开你的仓库,以便可以使用任何一种可用的传输机制(ssh,git-daemon等)完成点对点推/拉。在Git中没有真正的概念服务器/客户端,但通常的做法是拥有一个人们推送和拉出的中央存储库,就像SVN中的repo一样。除了工作副本之外,您还可以在本地使用完整的回购。作为DVCS,Git使您可以直接与团队中的其他人协作,然后推送到中央仓库。很少有你没有这样的核心回购。

2)Linus一直在谈论推送代码的备份,而不是正在进行中驻留在本地存储库上的工作,类似于在SVN中对工作目录进行更改的方式。还要注意他一定是在Linux代码的背景下谈论,它有数百个协作者,因此他必须提到他们不必担心存储库的备份,因为每个人都有它的副本。但是,当然,除非你已推送,否则你可能会丢失本地更改/提交。

答案 1 :(得分:0)

  1. multiple protocols个git可用于在存储库之间传输数据:
    • Dumb HTTP - 客户端只是下载所需的git对象文件,因此任何http服务器都可以工作。但是,这会浪费带宽。
    • Smart HTTP
    • 通过SSH获取包
    • 通过git获取包
  2. 最后三个都是“智能”,因为客户端和服务器协作以避免传输不必要的数据。

    您还可以使用git bundle导出包含更改的二进制文件,然后手动将其传输到其他人的计算机。

    你的回购不需要知道成千上万的其他分支在哪里。通常,您会将您推或拉的少数(或一个)添加为remote。这基本上是存储库URL的快捷方式。但是,您仍然可以从其他网址推送和拉取。

    无论您如何获取数据,最终都会使用git merge将其合并。

    2。是的,Linus意味着他不需要备份他已经推过的东西。据推测(如果他真的没有备份),他经常提交和推动。你不应该过于字面意思,因为他在公开声明中通常会产生戏剧性的效果。

答案 2 :(得分:0)

我会给你一个简短的答案。让我们从2)开始。是的,你会丢失数据。他的意思是你不需要传统意义上的备份(每次都要复制你的完整目录)。如果你推动它的备份'。如果你没有,你将失去自上次推动以来的数据。推送与复制/粘贴不同。

1)如何处理合并到其他人的分支机构?

基本上,您的计算机上有一个git存储库,可以是克隆存储库,也可以是全新存储库。然后,您需要一个远程位置,您可以推送(您只需创建一个'裸存储库然后推送到它)或者您必须具有对其他人的读取访问权限(可能在局域网上,但推送到服务器更传统)。有了这个裸露的回购或其他人的阅读权限,他们可以“拉”'你的代码进入他们的回购,你也可以这样做。你可以从任何人的任何顺序拉出来,即使人们不认识彼此并从你不知道的人群中拉出来。 git中的魔法将找出放置所有内容的位置,而不是两次合并。它很擅长识别冲突。

答案 3 :(得分:0)

1)合并在本地处理 - 服务器只执行线性时间线。

为了将本地与远程合并,你的Joe将“git pull”Jane的分支(通过任何支持的协议 - 一些像文件系统访问一样简单,一些比git + ssh更令人困惑),解决任何冲突,然后可能会将他的更改推送到主人(如果他在那里有写权限),或者将其发布给Jane获取。如果Jane在此期间没有改变任何内容,她可以在不进行任何手动合并的情况下使用Joe的合并后代码。

它是如何知道的 - 它没有,你告诉它远程分支在哪里。有git(github.com)的托管服务提供商,你可以在你的网络服务器上自己推出,并通过任何方式告诉Joe / Jane网址

2)备份很少比每天更频繁。 Linus可能比支持更频繁地推送 - 事实上,无论使用git作为我的代码的备份 - 使用多个遥控器,我有一个用于我自己的代码的遥控器,在每次有意义的提交后自动推送。