Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么git pull不更新本地更改的文件?_Ios_Git_Macos - Fatal编程技术网

Ios 为什么git pull不更新本地更改的文件?

Ios 为什么git pull不更新本地更改的文件?,ios,git,macos,Ios,Git,Macos,据我所知,git pull执行获取和合并。对于iOS项目,我使用分发设置证书、配置配置文件等配置了设置。。但是,在主分支上,当我执行git pull和git日志时,我看到git提交与来自远程主分支的最新提交是最新的,但是git diff仍然显示我的pbxproj文件不同,即与我在本地配置的配置文件字符串等不同 明确地说,这对我来说非常理想,因为我只需要更改代码,而不需要在发布到生产环境之前每次更新分支时都设置分发和资源调配配置文件。但我也想了解git合并的方式。我原以为git会合并我在本地更改的

据我所知,git pull执行获取和合并。对于iOS项目,我使用分发设置证书、配置配置文件等配置了设置。。但是,在主分支上,当我执行git pull和git日志时,我看到git提交与来自远程主分支的最新提交是最新的,但是git diff仍然显示我的pbxproj文件不同,即与我在本地配置的配置文件字符串等不同

明确地说,这对我来说非常理想,因为我只需要更改代码,而不需要在发布到生产环境之前每次更新分支时都设置分发和资源调配配置文件。但我也想了解git合并的方式。我原以为git会合并我在本地更改的文件和/或指示冲突。但没有这样的事情发生

注意:我知道使用“使我的本地主机与远程主机完全相似”的强制更新,但我想了解这与常规合并之间的区别。

git将远程更改与本地提交的更改合并。它不会尝试与未提交的更改合并,如果在相同的文件中有远程更改,它将警告您合并将清除本地更改,并将拒绝合并

更新-我意识到我没有真正回答为什么:

本地提交的更改与未提交的本地更改之间存在这种区别的原因是,您始终可以收回本地提交的更改。它们处于提交中,您可以签出该提交,在那里创建新分支,甚至在需要时将当前分支重置回该点。与本地提交的更改合并不会丢失任何内容

但是您的工作树未提交的本地更改不会得到这样的保护。如果git将更改合并到它中,而结果不是您想要的,那么您就不能轻松地恢复到以前的状态

我们还可以探讨与未提交的更改合并所涉及的技术差异,但如果希望与未提交的更改合并,则可以克服这些技术原因。但是,因为这样做可能会导致数据丢失,所以最好避免将更改合并到任何具有本地未提交更改的文件中

据我所知,git pull执行获取和合并

没错。更准确地说,git pull实际上运行git fetch,然后运行git merge。或者更确切地说,它过去是这样做的,在过去的日子里;在过去一年左右的时间里,Git被修改为通过在内部执行fetch和merge步骤,而不是运行单独的命令,从而使Git拉得更快,如果可能的话,您还可以告诉它执行Git rebase而不是Git merge,还有一些其他情况。但本质上,pull=fetch+merge

棘手的部分是这两个步骤的含义。fetch和merge都是或可能是复杂的

取来 获取步骤更简单:您的Git调用其他Git。您的Git和他们的Git进行了一次小对话,在对话中,他们的Git会告诉您的Git他们有哪些您没有的新提交。您的Git将这些新提交加载到您的存储库中,这样您现在就可以提交了;然后您的Git设置远程跟踪名称,如origin/master,以记住其Git的master等等。当git pull运行git fetch时,它可能会限制git的获取。在非常旧的版本中,这甚至会阻止Git更新您的origin/master等。现代Git消除了最后一个无用的特性

只要您不通过添加refspec或各种fetch标志来使这一点复杂化,就可以进行fetch了。合并部分仍然很棘手。完成提取后,git pull现在运行git merge,这就是事情变得有点复杂的地方

合并 合并的目标很简单:Git首先假设您一直在工作并进行提交,而其他人也在工作并进行提交。如果我们绘制这些提交,早期的提交向左,后期的提交向右,给它们简单的单字母名称,而不是它们实际的不可理解的Gitty散列ID,我们得到如下结果:

          C--D--E   <-- branch (HEAD)
         /
...--A--B
         \
          F--G--H   <-- origin/branch
第二个差异会发现他们改变了什么:

git diff --find-renames <hash-of-B> <hash-of-H>
进行新的合并提交会导致分支名称本身分支指向新提交,就像进行新的普通提交一样

这是一个真正的合并:Git必须合并自合并基以来的更改,这意味着它必须首先定位合并基提交,然后执行两个差异。这是合并的动词部分,用于合并两组更改。完成了to merge动词部分后,Git进行了merge commit,merge作为形容词,或者更不正式地说,merge,它使用merge作为名词

并非所有合并都是真正的合并 假设你是 可能通过git pull取消git fetch,但没有任何更改,因此您:

...--D--E   <-- branch (HEAD), origin/branch
如果您现在要求Git将您的工作或缺少的工作与他们的工作合并,Git会像往常一样找到合并库,但会发现合并库本身就是commit E。显然,将提交与自身进行区分不会发现任何变化。Git可以继续构建一个新的合并提交,将无更改与某些更改相结合以获得:

...--D--E------H   <-- branch (HEAD)
         \    /
          F--G   <-- origin/branch
并签出commit G,以便G的快照填充索引和工作树


Git称之为快进合并,但没有合并!快速转发只是对分支名称的操作。这种情况最终不会留下任何痕迹,这就是Git允许您禁止快进非合并的原因。然而,对于与远程跟踪名称相对应的本地分支,这种事情实际上通常是您想要的,这就是为什么这是Git的默认设置。

太好了,向上投票。这就解释了我的感受。我没有提交配置更改,因为我不想将它们推到远程,只是想确保获得良好的构建。因此,当git进行合并时,即使它看到配置文件不同,它也会进行静默忽略。
...--D--E   <-- branch (HEAD), origin/branch
...--D--E   <-- branch (HEAD)
         \
          F--G   <-- origin/branch
...--D--E------H   <-- branch (HEAD)
         \    /
          F--G   <-- origin/branch
...--D--E
         \
          F--G   <-- branch (HEAD), origin/branch