这是我的情景。我在分支A上,在那里我对我当地工作副本上的某个文件进行了一些更改。
/launcher/file.esb
我基本上想要以下内容:
从版本控制中取消此文件,我尝试使用.gitignore完成此操作。
在我结帐不同的分支时,保留对本地工作文件夹中此文件的更改。 A->开发 - > B-> C等......
我无法完成#3。一旦我签出一个新的分支并进行拉动,旧的更改就会被覆盖在文件上。
为什么会这样?不应该将此文件路径包含到.gitignore中,有效地将此文件完全取出版本控制触角吗?
我怎样才能达到#3?
此问题与“可能重复”链接中提到的问题不同。 这是为什么:
这基本上就是我想说的话。 “将我的一个特定文件基本上放在'shell'中,既不会在任何git操作期间被覆盖,也不会在更改后被考虑在内”。它基本上排除了该文件和登台/远程之间的任何形式的版本控制同步。此本地文件和登台/远程版本必须存在且相互完全断开连接。
答案 0 :(得分:4)
这种情况正在发生,因为该文件已经是存储库的一部分。因此,当您切换分支时,您将从正在检出的分支中获取此文件的版本。 gitignore文件仅阻止git查看不属于存储库的文件。这样就完成了,因此git不包含git add .
或git commit -a
等命令中的某些文件。并假设未更改的选项欺骗git没有看到更改,但这意味着Git可以在结帐时覆盖文件,因为它知道文件与提交的版本没有区别。
如果你想要的是从git控件中删除这个文件并自己管理对它的更改,你可以使用git rm --cached /launcher/file.esb
并提交更改。这将从索引中删除此文件,git将不再跟踪该文件。 --cached
选项阻止git实际从工作目录中删除该文件。您可能必须为每个分支单独执行此操作,因为从一个分支中删除文件不会将其从其他分支中删除。要执行此操作,您可能需要撤消假设未更改,然后使用git stash
命令临时存储您的本地更改。
答案 1 :(得分:1)
从版本控制中取消此文件,我尝试使用.gitignore完成。
你试过但你失败了。只有在更新索引时才会读取.gitignore
,即您准备下一次提交。如果文件已提交,则将其添加到.gitignore
无助于告知Git
停止跟踪该文件。
您还必须从索引中删除(使用[git rm --cached](https://git-scm.com/docs/git-rm)
)并提交更改。只有这时Git
才会停止跟踪该文件。将其名称添加到.gitignore
只会告诉它停止将其列在Untracked files
输出的git status
部分中。
但是,如果你签出在从repo中删除文件之前创建的提交,则提交包含该文件,Git也会尝试将其检出。