我是GIT的新手,我们有GIT资料库和功能分支。我想采取功能分支并做一些更改。但我在Cloning和Checkout之间感到困惑。请帮忙。我不应该直接在功能分支上这样做?我必须有一个本地分支,即使是微小的变化?
答案 0 :(得分:0)
要在本地计算机上处理远程功能分支,您必须创建一个本地分支,以便跟踪该远程分支。
假设您已经克隆了您的存储库并拥有一个本地master
分支;
您现在可以使用功能分支的本地副本 - 提交和推送更改将更新远程功能分支。
答案 1 :(得分:0)
你真的应该读一本关于Git的好书,否则你会陷入一个令人头疼的世界。
让我们先定义一些术语。
commit 是某个源树的完整快照。除了这个快照,提交还包含一些我们称之为元数据的信息:有关提交本身的信息,例如是谁创建的,以及何时提交。每次提交时存储的另一个关键元数据是身份 - 哈希ID - 其父提交,这是它的前一次提交。
每个提交都由其哈希ID唯一标识,哈希ID是一个很难看的名字,如89ea799ffcc5c8a0547d3c9075eb979256ee95b8
,没有人能够记住或预测。 1 所以Git会为你记住这些,在某种程度上我们会在某个时刻到达。请记住,每个提交也会记录父级,或者有时会记录多个父级,因此89ea799ff...
可能会3505ddecb...
作为其父级(或多个父级之一)。
存储库的核心是提交的集合。除了这个提交集合之外,存储库还有一些名称 - 分支和标记名称。 Git中的每个分支或标记名称只包含一(1)个唯一的哈希ID。 2
clone 是基于现有存储库的新存储库。
在典型的克隆中,您从源存储库中复制所有提交(及其所有相应的其他Git对象)。然后你有你的 Git,在你的存储库中,重命名所有的分支名称,这样它们就不再是分支名称了,而是,远程跟踪名称。远程跟踪名称非常像分支名称,但有两点不同:
git fetch
和git push
从中获取新内容时,它会自动更新,或者向您提供您所做的任何新提交。一旦拥有了自己的存储库,您将在该存储库中拥有一个索引和一个工作树。 3 您可以使用它们来构建自己的新提交。进行新提交会使您当前的分支名称指向新提交。在您创建新提交之前,新提交的父提交是当前提交的 。新提交的快照是您运行git commit
时索引中的内容。
git checkout
命令有点复杂 - 它有太多可以做的事情 - 但它的主要目的是设置你的索引和工作树,这样你就可以了。\#34; on"一个特定的分支。您所在的分支(例如master
或develop
或feature
)确定存储库中的哪个提交是当前提交。这是其哈希存储在该分支名称下的提交。
如果您要求查看分支名称,例如master
或feature
,并且您还没有拥有该分支,那么您的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会执行以下操作(看起来像是一个原子事务):
请注意,现在新提交是当前提交,分支名称指向新提交。 Git会通过查看当前提交的父级来查找旧提交。同时,索引现在与当前提交匹配,因为新提交 - 现在是当前 - 是从索引中创建的。索引是否与工作树匹配取决于您。
1 虽然它们似乎是随机的,但每个哈希ID都是根据提交的内容计算出来的。如果您有两个相同的哈希ID,那么您有两次列出的单个提交或其他Git对象。如果您有两个不同的哈希ID,则有两个不同的对象。宇宙中的每个Git都将为同一个对象计算相同的哈希ID,但是因为计算使用加密哈希 - 它几乎不可能弄清楚如何撒谎哈希ID。 But only almost.
2 请注意,虽然对象哈希ID是唯一的,但您可以拥有多个存储相同哈希ID的名称。例如,基于当前提交创建新的标记是很常见的,如果这样做,新标记将与当前分支名称相同的提交命名。 (这掩盖了轻量级标记和带注释标记之间的区别,但暂时不介意。)
3 所谓的 bare 存储库根本没有工作树,所以你不能在其中做任何工作。这样的事情的目的是充当克隆和推送的地方。
从Git版本2.5开始(但2.6中有一些大错误修复),您可以在常规的非裸存储库中添加更多工作树。每个添加的工作树都有自己的索引。