我已经克隆了一个git存储库。 在我从另一个分支创建了新分支之后,例如分支A的分支B。 然后,我在分支B的代码中做了很多修改 而且,我想在上一个分支A上结帐。 惊喜!如果我想隐藏我的工作以及在分支A上接通电源时,不带aks的Git签出。写在分支B上的所有修改都在分支A上。
怎么可能? 我尝试使用命令行并从IDE phpStorm中获得相同的结果 我在Windows 10上工作。
帮帮我:)
答案 0 :(得分:0)
让我们尝试一种稍微不同的方法,而不是立即将其作为Checkout another branch when there are uncommitted changes on the current branch的副本来关闭。
...我从另一个分支中新建了一个分支,例如分支A中的分支B。
也就是说,您跑了:
git checkout branch-a
git checkout -b branch-b
或:
git checkout -b branch-b branch-a
或许多其他可能的命令之一。
然后,我在分支B内的代码中做了很多修改...
这是问题的根源:您已经对您的工作树进行了更改。您未未更改任何分支。分支B仍与分支A完全相同。您有更改,但根本不在任何分支上。。它们是未提交的更改。
这里棘手的一点是,Git对分支名称的关注很少。 Git关心的是 commits 。
每个提交都有一个丑陋的哈希ID,例如08da6496b61341ec45eac36afcc8f94242763468
。该哈希ID实际上是提交的真实名称。所有其他名称只是提供哈希ID的方法。
提交本身存储东西。提交后,它将存储所有已提交文件的快照。此快照永远无法更改-不能更改。散列ID似乎是随机的,实际上是提交中所有内容的加密校验和,包括保存的快照(以及更多内容)。因此,如果您要以某种方式进行更改,您将拥有一个新的和不同的提交,以及一个新的和不同的丑陋的哈希ID。现有的提交将仍然具有其现有的哈希ID。
Git 确实,真的关心这些提交。 Git将竭尽所能,不要失去任何一个。即使您错误地创建了一个密码,例如在文件中包含密码,或者是一个本不应该提交的巨型文件,要获得 rid 仍然是难 。 1 (尽量不要意外地犯此类事情。)
分支 name 只是一个名称。它所做的只是保留一个哈希ID。像branch-a
或branch-b
或master
这样的名称是记住丑陋的哈希ID的一种方式,因为否则很难记住。
在Git中处理提交时,有一个很大的绊脚石:压缩并冻结了提交中存储的文件。这是一个功能:由于不能更改提交中的文件 ,因此以后的提交可以重用该文件。因此,您可以在其中包含一个大文件的情况下进行一千次提交,如果该大文件每次都相同,则实际上只有一个大文件副本。
但这也意味着,为了使用文件,Git必须从提交中提取文件。这就是您的工作树的全部内容。 (工作树有几种不同的称呼方式,包括工作目录或工作树; 在这里它们都非常相似。)在这里您可以看到和处理文件。
工作树中的文件不是提交。更改它们不会影响任何现有的提交。因此,您可以随意更改它们,而 Git 中什么也没有发生。事情只发生在您的工作树中,而现在只是让您随心所欲而已。
当您进行一次 new 提交时,还有一些棘手的问题。 Git不会从您的工作树中进行新的提交!这有点特殊-大多数其他版本控制系统 do 从您的工作树中进行新提交。但是Git有所不同:它通过它调用的内容(例如 index 或 staging区域)进行新的提交,或者(通常是在最近几天) cache < / em>。
索引从保存git checkout
时选择的 commit 的所有文件的副本开始。 2 您必须复制任何更新的文件使用git add
将索引返回到 索引,以获取下一次提交时要使用的更新版本。
因此,具有三个名称(索引,暂存区和缓存)的东西可能最好描述为您建议的 next 提交。当您运行git commit
时,Git会将索引中的任何内容冻结到新提交中。
但是现在,branch-a
和branch-b
这两个名称都称为 same 提交。因此,当您这样做时:
git checkout branch-a
Git检查实际的哈希ID,并确认它是 same 提交。无需执行任何操作,因此Git只是更新了名为HEAD
的特殊文件以将名称branch-a
放入其中。 3 您尚未更改 commits ,但现在您在branch-a
上。运行:
git checkout branch-b
您仍然没有更改提交,但是现在HEAD
中包含branch-b
,因此您在branch-b
上。
一旦git add
,然后git commit
,您将有一个新的提交,并带有一个新的大的哈希哈希ID。 Git会将 new 提交的哈希ID存储到HEAD
中的任何 name 中,而 now Git会非常认真地关心所有这些文件,因为现在它们是提交的一部分。
1 这不是不可能,只是努力。
2 从技术上讲,索引中的内容实际上不是冻结格式的提交文件的副本,而是对冻结文件的引用格式化提交的文件。由于它们无法更改,因此从您自己的角度来看,这是没有区别的区别。它使索引占用的空间更少,但对您使用索引的方式没有影响。
3 这个特殊文件通常只是一个名为.git/HEAD
的文件。即使您在使用所有小写字母head
的系统上,也应该这样拼写所有大写字母,因为每隔一段时间, 4 小写字母{{1} }指的是错误文件。 Git里面有一些字符串比较,如果您将其head
拼写,则会使用正确的特殊文件。
4 今天一次是使用HEAD
时。谁知道将来什么时候。