如何在 git pull 上暂时忽略未跟踪的文件?

  • 本文关键字:跟踪 文件 git pull 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之间区别的非常好的解释可以在这里找到


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

git reset --hard

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

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

... overwritten by merge

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

我有一些尚未添加到 git 的新文件;我不确定我会不会,我还没有决定。

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

现在,您可以选择各种选项:

  • 不合并(或暂时不合并):您可以不跟踪文件。 我认为这很清楚,但它使情况悬而未决。 最终你(可能?)将不得不合并......

  • 合并:文件将被跟踪。 然后,您可以对 Git 如何处理现有的未跟踪文件进行子选择:

    • 添加并提交。 Git 会将你的自基地以来的变化与他们从基地开始的变化合并。 据推测,这两个更改都是添加此文件,即该文件不在合并基中。 这意味着冲突将是添加/添加冲突,这有点痛苦。
    • 将您的文件版本保存在其他位置,删除未跟踪的文件。 让 Git 合并(作为快进或真正的合并,无论它做什么)。 手动合并您自己的更改,添加并进行自己的新提交。
    • 另一个人错了,文件不应该被跟踪:将您的文件版本保存在其他地方。 让 Git 合并。删除文件并提交,提交删除。 然后,您可以放回自己的未跟踪文件。

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

"将文件保存到其他地方"的方式取决于您:例如,您可以将其完全移出工作树,或者您可以使用git stash进行包含该文件的提交。

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

最新更新