0

当我尝试git pull在我的分支中时,我得到:

error: Your local changes to the following files would be overwritten by merge:
    Vendor/JSONKit

确实,当我执行 a 时git status,它说 Vendor/JSONKit 已“修改”。

Vendor/JSONKit 包含一个名为 JSONKit (https://github.com/johnezang/JSONKit) 的第三方项目。我从来没有接触过这段代码。我也没有设置文件夹——但我认为它就是所谓的“子模块”。

是什么导致了这个错误,我该如何克服它?如果我尝试git stash,它声称我“没有要保存的本地更改”。如果我进入 Vendor/JSONKit 并尝试做任何事情,git 会说我不再在分支上。

4

1 回答 1

2

在单个存储库中:

您应该能够使用 探索差异git diff -- Vendor/JSONKit,但如果您只想重置文件(并放弃更改),请发出以下命令:

git checkout HEAD -- Vendor/JSONKit

Vendor/JSONKit这将检查您工作目录中的最新版本并放弃修改。


在带有子模块的存储库中:

Git 子模块允许您将 git 存储库相互嵌入。假设“JSONKit”是“MyApp”中的一个子模块。顶级 git 存储库MyApp仅跟踪 的HEAD提交JSONKit,因此您可以在历史的任何时候完美地重建MyApp' 和JSONKit' 的状态。

假设您在JSONKit存储库中提交了更改。在里面JSONKit,这看起来像一个正常的差异并且有一个正常的历史。在父存储库中MyApp,它将注册为对HEAD提交的更改。它可能看起来像这样的差异,取自git scm 文档。本例中的子模块是一个名为“rack”的目录。

$ git diff --cached rack
diff --git a/rack b/rack
new file mode 160000
index 0000000..08d709f
--- /dev/null
+++ b/rack
@@ -0,0 +1 @@
+Subproject commit 08d709f78b8c5b0fbeb7821e37fa53e69afcf433

如何MyApp知道哪些目录是子模块?它在.gitmodules文件中被跟踪。cat它,你会看到注册的每个子模块MyApp

$ cat .gitmodules 
[submodule "rack"]
    path = rack
    url = git://github.com/chneukirchen/rack.git

当您发出 时,您告诉 git 检查父存储库索引中的git submodule update最新HEAD提交,从而放弃子模块存储库中的更改:JSONKit

update
   Update the registered submodules, i.e. clone missing submodules and checkout the commit specified in the index of the containing repository. This will
   make the submodules HEAD be detached unless --rebase or --merge is specified or the key submodule.$name.update is set to rebase, merge or none.  none
   can be overridden by specifying --checkout.
于 2012-08-21T00:22:40.670 回答