GIT克隆还是结账?在功能分支上工作

时间:2017-11-28 10:29:45

标签: git

我是GIT的新手,我们有GIT资料库和功能分支。我想采取功能分支并做一些更改。但我在Cloning和Checkout之间感到困惑。请帮忙。我不应该直接在功能分支上这样做?我必须有一个本地分支,即使是微小的变化?

2 个答案:

答案 0 :(得分:0)

要在本地计算机上处​​理远程功能分支,您必须创建一个本地分支,以便跟踪该远程分支。

假设您已经克隆了您的存储库并拥有一个本地master分支;

  1. git fetch
  2. git checkout -b feature_branch origin / feature_branch
  3. 您现在可以使用功能分支的本地副本 - 提交和推送更改将更新远程功能分支。

答案 1 :(得分:0)

你真的应该读一本关于Git的好书,否则你会陷入一个令人头疼的世界。

让我们先定义一些术语。

commit 是某个源树的完整快照。除了这个快照,提交还包含一些我们称之为元数据的信息:有关提交本身的信息,例如是谁创建的,以及何时提交。每次提交时存储的另一个关键元数据是身份 - 哈希ID - 其父提交,这是它的前一次提交。

每个提交都由其哈希ID唯一标识,哈希ID是一个很难看的名字,如89ea799ffcc5c8a0547d3c9075eb979256ee95b8,没有人能够记住或预测。 1 所以Git会为你记住这些,在某种程度上我们会在某个时刻到达。请记住,每个提交也会记录父级,或者有时会记录多个父级,因此89ea799ff...可能会3505ddecb...作为其父级(或多个父级之一)。

存储库的核心是提交的集合。除了这个提交集合之外,存储库还有一些名称 - 分支和标记名称。 Git中的每个分支或标记名称只包含一(1)个唯一的哈希ID。 2

clone 是基于现有存储库的新存储库。

在典型的克隆中,您从源存储库中复制所有提交(及其所有相应的其他Git对象)。然后你有你的 Git,在你的存储库中,重命名所有的分支名称,这样它们就不再是分支名称了,而是,远程跟踪名称。远程跟踪名称非常像分支名称,但有两点不同:

  • 它位于您的存储库中,但它的目的是跟踪他们的分支 - 另一个Git中的分支名称。因此,您无法将其用作 分支。
  • 并且,当您git fetchgit push从中获取新内容时,它会自动更新,或者向您提供您所做的任何新提交。

一旦拥有了自己的存储库,您将在该存储库中拥有一个索引和一个工作树 3 您可以使用它们来构建自己的新提交。进行新提交会使您当前的分支名称指向新提交。在您创建新提交之前,新提交的提交是当前提交的 。新提交的快照是您运行git commit时索引中的内容。

git checkout命令有点复杂 - 它有太多可以做的事情 - 但它的主要目的是设置你的索引和工作树,这样你就可以了。\#34; on"一个特定的分支。您所在的分支(例如masterdevelopfeature)确定存储库中的哪个提交是当前提交。这是其哈希存储在该分支名称下的提交。

如果您要求查看分支名称,例如masterfeature,并且您还没有拥有该分支,那么您的Git会检查您的远程 - 跟踪名称。如果恰好一个看起来相同,那么您的Git将使用您保存的遥控器为您的存储库创建分支名称 - 将名称保存的哈希值作为分支的初始哈希值。因此,在新克隆中,git checkout feature将选择origin/feature作为正确的提交哈希,使用该哈希选择创建 feature,然后获取&#34}。上"那个分支。 git status命令 - 经常使用它! - 现在会说on branch feature

无论何时进行 new 提交,Git都会立即打包索引中的所有内容,并将其用于新提交的新快照。这意味着索引的主要功能是保存内容以进行下一次提交。因此,索引从一些现有提交的内容开始。此内容也可以在您的工作树中找到,您可以在这里实际开展自己的工作。

对工作树进行了一些更改后,您必须将更改复制回索引,否则他们将无法进入新的提交。要将修改后的文件从工作树复制到索引中,只需git add该文件即可。这将更新工作树中的索引副本,现在该版本将在下一次提交中。对您更改的每个文件重复此操作。请注意,如果您在 git add之后再次更改文件,则索引仍会保留您git add - ed的版本,而不是该版本中的版本工作树。您需要git add再次将新版本复制到位。

当一切准备就绪,并且你运行git commit时,Git会执行以下操作(看起来像是一个原子事务):

  1. 快照索引。
  2. 收集您的姓名,电子邮件地址和时间,以用作新提交的作者和提交者数据。
  3. 收集提交消息。 (这可能会使用你最喜欢的编辑器,但你必须告诉Git你最喜欢哪一个。)
  4. 使用当前提交的哈希ID作为新提交的父级。 Git会通过读取分支名称的内容,以通常的方式找到当前提交的哈希ID。
  5. 进行新的提交。这个新的提交是新的,它获得了一个新的,唯一的哈希ID。
  6. 将新提交的哈希ID写入当前分支的名称。
  7. 请注意,现在新提交是当前提交,分支名称指向新提交。 Git会通过查看当前提交的父级来查找提交。同时,索引现在与当前提交匹配,因为新提交 - 现在是当前 - 是从索引中创建的。索引是否与工作树匹配取决于您。

    1 虽然它们似乎是随机的,但每个哈希ID都是根据提交的内容计算出来的。如果您有两个相同的哈希ID,那么您有两次列出的单个提交或其他Git对象。如果您有两个不同的哈希ID,则有两个不同的对象。宇宙中的每个Git都将为同一个对象计算相同的哈希ID,但是因为计算使用加密哈希 - 它几乎不可能弄清楚如何撒谎哈希ID。 But only almost.

    2 请注意,虽然对象哈希ID是唯一的,但您可以拥有多个存储相同哈希ID的名称。例如,基于当前提交创建新的标记是很常见的,如果这样做,新标记将与当前分支名称相同的提交命名。 (这掩盖了轻量级标记带注释标记之间的区别,但暂时不介意。)

    3 所谓的 bare 存储库根本没有工作树,所以你不能在其中做任何工作。这样的事情的目的是充当克隆和推送的地方。

    从Git版本2.5开始(但2.6中有一些大错误修复),您可以在常规的非裸存储库中添加更多工作树。每个添加的工作树都有自己的索引。