【问题标题】:How to temporarily ignore untracked files on git pull?如何暂时忽略 git pull 上未跟踪的文件?
【发布时间】:2018-09-29 01:41:49
【问题描述】:

我有一些尚未添加到 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 来更新我的本地存储库,这没有产生任何错误,但它也没有给我的工作副本带来更改。我可以' t 弄清楚之后的下一步。:-/ 无论如何,一个没有错误的pull 是理想的......

【问题讨论】:

  • 提交您的更改,然后拉取,然后git reset origin/master 撤消您的本地提交(但将文件保留在您的工作目录中)。这是一种非常安全且简单的方法。
  • 这可能会导致合并冲突,可能不是 OP 想要的。
  • mm... 建议是暂时提交所有内容以便能够拉取,然后将其重置为以前的状态?是的,似乎不是我想要的。如果我理解正确,我将丢失我对代码所做的任何未提交的更改。
  • 这不是重复的,因为我的问题的核心是不丢失不属于(本地或远程)存储库的文件,这在另一个问题中甚至没有提到。我不知道如何编辑我的帖子以使其更清晰,因为它在标题和第一段中。

标签: git pull


【解决方案1】:

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

git stash

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

关于apply和pop区别的很好解释可以看here


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

git reset --hard

【讨论】:

  • reset 意味着我会丢失本地文件和更改,不是吗?如果我隐藏,我如何将隐藏的东西与拉出的东西合并?
  • 你看过链接了吗?
  • 我问的时候没有链接。 :P
  • 让我看看我是否明白这一点。首先我存储,这意味着我将我的代码更改和新文件保存在某个临时位置。然后我拉,我不会得到任何错误。然后我弹出存储,它将我的代码更改和新文件恢复到我的工作副本中,在最新提取的代码之上。是吗?
  • @RémyHosseinkhanBoucher 那是两年前的事,但如果我没记错的话,它确实有效。如果您不想冒险,您可以在做所有这些之前备份您的更改,并且在您尝试之后您就会知道。 ;) 从那以后我就不需要它了。大声笑:/
【解决方案2】:

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

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

... overwritten by merge

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

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

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

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

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

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

    • 添加并提交。 Git 会将你的 change-since-the-base 与他们的 change-since-the-base 合并。大概这两个更改都是添加此文件,即该文件不在合并库中。这意味着冲突将是添加/添加冲突,这有点痛苦。
    • 将您的文件版本保存在别处,删除未跟踪的版本。让 Git 合并(作为快进或真正的合并,无论它做什么)。手动合并您自己的更改、添加并做出您自己的新提交。
    • 另一个人错了,文件应该不被跟踪:将你的文件版本保存在别处。让 Git 合并。 删除文件并提交,提交删除。然后,您可以放回自己的未跟踪文件。

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

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

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

【讨论】:

  • “已经由其他人决定(...)(...):现在在另一个提交中添加了该特定文件” - 但是没有其他提交,也没有其他人。 :-/
  • 我承认这是一个奇怪的错误。我可以发誓我之前有新文件并且没有收到此错误。但是当我检查服务器时,它不存在。除非它过去存在并被删除(应该很久以前),现在 git 很困惑? idk.... :/
  • 肯定还有另一个提交,否则就没有什么可合并的了。做出其他承诺的人就是“其他人”,即使那是你。 :-)
  • 天啊.....你是对的!嗯,有点。没有其他提交。 :$ 但我在半年前git added 了一个文件,但从未提交过。 git status 中被报告为“新”的所有内容都在进行中。我git reset 那个文件,提交了其他新东西,现在git pull 工作了!你错了,有另一个提交令人不安的事情,但你是对的,有另一个待处理的操作。谢谢!
  • 嗯,现在 pull 的合并完成了,试试git ls-files --stage(注意这会产生很多输出,每个跟踪文件一行)。如果您在任何时候都有git added 文件,则将其复制到索引/暂存区域中,并且从那时起您所做的每一次提交中都存在该文件,除了您首先将其从索引中取回所做的任何提交/暂存区。请记住,每个提交都是 每个 文件的完整快照:例如,使用 git ls-tree -r <commit> 来查看所有文件。 (如果你 git commit <paths> 你会得到一个临时索引/暂存区;我假设你没有这样做。)
猜你喜欢
  • 1970-01-01
  • 2012-06-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多