如何在 git 拉取时暂时忽略未跟踪的文件?

How to temporarily ignore untracked files on git pull?

我有一些新文件还没有添加到 git;我不确定我会,我还没有决定。但我想获取服务器中最新的内容。

但是,当我执行 git pull 时,出现错误 error: Your local changes to 'XXXX' would be overwritten by merge. Aborting.,其中 XXXX 是我的新文件。

我如何告诉 git 从服务器下载更改和新文件,告诉我服务器上的内容与我对存储库中已有文件的本地修改之间可能存在的冲突,同时时间不中止,因为我在本地有新文件?

我不想将它们添加到 .gitignore,因为我经常遇到这种情况,我不想在 .gitignore 中添加和删除文件是时候做一些愚蠢的事情了……特别是因为我不想 运行 忘记某个文件的风险,最终我会决定必须将它添加到存储库中,所以我想要 git status 继续告诉我关于他们的事。有时我 运行 git status -uno 当我想忽略新文件时,有时我 运行 git status 查看新文件并决定保留什么和丢弃什么。但是我找不到 git pull.

的等效选项

我在谷歌上的尝试将我带到了那些想要用存储库中的内容或其他类似场景覆盖他们的本地更改的人。 :( 阅读文档后我发现我可以执行 git fetch 来更新我的本地存储库,这没有产生任何错误,但它也没有将更改带到我的工作副本中。我在那之后想不出下一步。:-/ 在任何情况下,没有错误的 pull 是理想的...

您必须先将其存储并在从远程拉取后应用更改,或者将当前分支重置为上次提交。重置分支将导致您丢失更改。

git stash

// after you have pulled from remote
git stash apply 
// OR
git stash pop

关于applypop之间的区别的很好的解释可以找到here


您也可以选择使用以下命令重置当前分支。

git reset --hard

您可能知道,git pull 基本上是 git fetch,然后是 git merge

失败的步骤不是 git fetch,而是 git merge:

... overwritten by merge

注意最后一个词是合并。这意味着您的犹豫不决:

I have some new files that I didn't add to git yet; I'm not sure I will, I'm still undecided.

已由其他人为您决定,至少是针对一个这样的文件:该特定文件现在已添加,在另一个提交中。那就是 Git 将覆盖的那个。

您现在有多种选择:

  • 不合并(或还不合并):您可以不跟踪文件。我认为这很清楚,但它使情况没有得到解决。最终你会(可能?)必须合并....

  • 合并:文件被跟踪。然后您可以选择 Git 应该如何处理您现有的未跟踪文件:

    • 添加并提交。 Git 会将您的自基础变更与他们的自基础变更合并。大概这两个变化都是 add this file,即文件不在合并库中。这意味着冲突将是 add/add 冲突 ,这是一种痛苦。
    • 在别处保存您的文件版本,删除未跟踪的文件。让 Git 合并(作为快进或真正的合并,无论哪种方式)。手动合并您自己的更改、添加并进行您自己的新提交。
    • 另一个人错了,应该跟踪该文件:将您的文件版本保存在别处。让Git合并。 删除 文件并提交,提交删除。然后您可以放回您自己未跟踪的文件。

还有一些额外的选项(例如变基而不是合并)但它们都以相同的情况结束:文件被跟踪(因为它在您告诉 Git 合并的提交中) ,或者您无论如何都必须更新到该提交,删除文件,然后再次提交以进行提交,其中文件不会被跟踪.

您 "save the file elsewhere" 的方式由您决定:例如,您可以将其完全移出工作树,或者您可以使用 git stash 进行提交文件。

工作的时候,git stash还是挺方便的,但是因为它实际上做了两三个不在任何分支上的commit,所以是个相当复杂的小野兽,出错的时候就变得很很难对付。所以对于任何本身可能很复杂的事情,我想避免 git stash。请注意 git stash 默认情况下仅存储 tracked 文件,因此您必须 git add 它才能将其放入 git stash 通常进行的两次提交中。您可以使用 git stash -u 专门进行第三次提交以保存未跟踪的文件,但这会使存储更难处理。