当我在其中一个分支机构中创建/删除文件夹或文件,然后签出另一个分支时,更新不会反映在我的文件夹中,但它们会反映在我的网站上。我正在使用sftp进行崇高,出于某种原因,当我检查其他分支时,我似乎无法通过侧边栏更新新的文件更改。任何人都有任何想法让这个工作?
答案 0 :(得分:0)
TL; DR:您必须git add
该文件,然后git commit
更新后的索引。
(这是基于上面的评论。)
如果您在工作树中创建了一个文件,但没有git add
- 编辑该文件,则该文件是未跟踪文件。 未跟踪文件的精确定义是不在索引中的文件。该索引也称为临时区域,因为它是您更新(即,暂存)下一步提交的文件的位置。 git add
步骤将文件复制到索引中,为下一个git commit
提交它做好准备。您必须使用git commit
完成此过程(好吧,您必须最终完成它 - 您可以等待,如果您愿意,可以将更多文件复制到索引中,甚至覆盖您刚刚复制的文件)。
Git单独留下未跟踪的文件,至少尽可能多。只要文件未被跟踪(不在索引中),您就可以切换所有您喜欢的分支,文件就在那里。
添加并提交文件后,它将成为该提交中的普通文件,就像该提交中的每个其他文件一样。 git commit
步骤只是在运行git commit
时以索引中的形式打包索引中的每个文件,并将其转换为新的只读(完全), 1 永久(大部分), 2 提交。
请注意,当您更改现有的工作树文件时,较旧的版本仍在索引中(如果它在那里,即,如果跟踪该文件)。您仍然需要git add modified-file
将更新后的版本复制到索引中。这就是为什么Git不断强迫你git add
所有事情:你必须先将它复制到索引中,即使索引中已经有旧版。
签出任何现有提交都会使用该提交中的文件填充索引和工作树。检查一些其他提交将从索引和工作树中删除先前签出的提交但不在新的签出提交中的任何文件。 (注意in some cases, you can carry un-committed changes around in your index and work-tree while switching branches, but sometimes you can't do this.细节有点混乱。)
因此,在分支git add new-file
上运行git commit
和feature-A
之后,执行git checkout feature-B
会将您从具有该文件的新提交切换出来(它在索引中) →跟踪,并在工作树中→可见)到feature-B
上现有的旧提交。较旧的提交不具有新文件,因此它来自 out 索引,Git 从工作树中删除。< / p>
请注意,现在feature-A
的提示已该文件。如果您仍在feature-B
并且创建该文件并将其保留为未跟踪状态,那么它只是一个未跟踪的文件。它不在索引中。您现在无法 git checkout feature-A
,因为Git必须覆盖您未跟踪的文件。你必须删除它(以便它不妨碍)或添加并提交它(以便它被跟踪和清理),以便Git可以吹走 复制并将其替换为来自feature-A
。
(练习:当您从feature-A
检出提交时,当时新文件是否会在索引中?)
1 存储在Git存储库中的每个对象始终是完全只读的。有四种对象类型:提交,树, blob 和带注释的标记。你最直接看到的两个是commit和blob:commit对象保存你的提交,blob对象保存你的文件数据。
2 只要你能找到,就会坚持下去。像master
这样的分支名称标识一个特定的提交,并且该提交找到其父级。父提交找到自己的父级,它找到另一个父级,依此类推。一般来说,在Git中,你将添加新的提交,而不会忘记/放弃旧的提交,通过简单的方法让 new 提交记住,作为其父级,无论哪个提交是最新的某些分支在那之前。然后,分支名称将标识最新的提交。
每隔一段时间你就会发现有些提交很糟糕,应该被遗忘。只要您没有将该提交提交给其他人,您只需调整您的分支名称和其他现有提交即可忘记或放弃您不喜欢的提交。忘记/放弃的提交ID会被保存在名为 reflog 的边日志中一段时间。最终reflog条目到期,只有这样Git才能真正收回提交。默认情况下,reflog条目至少存在30天,所以在放弃后,您最多可以改变主意并获得提交。
这意味着提交主要是永久性的。它们不是100%永久保证,但它们不会意外丢失。由于它们也是只读的,这意味着您可以永久使用保存在这些提交中的历史文件。