以下未跟踪的工作树文件将被合并覆盖,但我不在乎

CQM*_*CQM 254 git merge git-merge git-fetch

在我的分支上,我在.gitignore中有一些文件

在不同的分支上,这些文件不是.

我想将不同的分支合并到我的,我不在乎这些文件是否不再被忽略.

不幸的是我明白了:

合并将覆盖以下未跟踪的工作树文件

如何修改我的pull命令来覆盖这些文件,而不必自己查找,移动或删除这些文件?

use*_*Fog 413

问题是您没有在本地跟踪文件,但远程跟踪相同的文件,因此为了"拉"您的系统将被迫覆盖不受版本控制的本地文件.

试试跑步

git add * 
git stash
git pull
Run Code Online (Sandbox Code Playgroud)

这将跟踪所有文件,删除对这些文件的所有本地更改,然后从服务器获取文件.

  • `git add -A.; git stash`为我工作.`git add*`变种抱怨被忽略的路径. (49认同)
  • 我试过git add.,git stash,git pull.它工作,但我仍然不明白为什么? (10认同)
  • 如果有人有兴趣,这里有一个很好的链接来了解它的工作原理.https://git-scm.com/book/en/v1/Git-Tools-Stashing (2认同)
  • //,这实际上并没有太深地说明此错误的目的。 (2认同)

sil*_*eep 97

您可以尝试命令从本地清除未跟踪的文件

git 2.11和更新

git clean  -d  -f .
Run Code Online (Sandbox Code Playgroud)

老吉他

git clean  -d  -f ""
Run Code Online (Sandbox Code Playgroud)

其中-d可以替换为以下内容:

  • -x表示也会删除被忽略的文件以及git未知的文件.

  • -d表示除了未跟踪的文件外,还删除未跟踪的目录.

  • -f是强制它运行所必需的.

这里的链接也很有帮助.

  • 我会为交互模式添加`-i`.除了删除不需要的目录,我还删除了项目的用户设置:-( (17认同)
  • 这删除了*Slim Framework*上的所有*vendor*目录.**非常关心这个命令** (11认同)
  • 但这是非常危险的,而且不是可撤销的任务!! 你可能会丢失很多文件!小心!! (8认同)
  • 由于`-x`可能会受到伤害,所以值得通过评论来扫描[类似答案](http://stackoverflow.com/a/8362346/575530). (6认同)
  • 你应该从答案中删除'x'.这很危险! (2认同)
  • 我绝对不想删除 git 未知的文件! (2认同)

Asa*_*sen 69

唯一对我有用的命令是:

git fetch --all
git reset --hard origin/{{your branch name}}
Run Code Online (Sandbox Code Playgroud)

  • 这删除了我的两个本地提交,使用前请小心! (4认同)
  • 应该注意的是,如果您删除了子模块并将它们作为原始仓库中的库读取,则需要这个答案.我需要一个答案,这就是有效的. (3认同)
  • 在使用 --hard 之前,请三思。默认行为是为了保护您免受错误的影响 (2认同)
  • 这应该是公认的答案:D 没有什么对我有用,但这个解决方案工作得很好。谢了哥们!! (2认同)

Ash*_*ule 19

第 1 步:清理工作副本

a) 将本地更改保存在存储中 如果您想保留本地更改,可以将它们安全地存储在存储中。如果您稍后需要它们,它们将可用。

$ git stash --include-untracked
Run Code Online (Sandbox Code Playgroud)

b) 放弃本地更改 如果您确定不再需要它们,则可以完全放弃本地更改:

$ git reset --hard
Run Code Online (Sandbox Code Playgroud)

c)如果您还有未跟踪的/新文件,您也必须使用“git clean”命令来删除这些文件:

$ git clean -fd
Run Code Online (Sandbox Code Playgroud)

第 2 步:再次拉取 清理完可能被覆盖的所有本地更改/未跟踪文件后,拉取最终将起作用:

$ git pull
Run Code Online (Sandbox Code Playgroud)

  • `git clean -fd` 是一个非常危险的操作;如果没有特别确定它的作用,就不应该运行它。 (2认同)

mna*_*gel 18

如果这是一次性操作,您可以在执行拉取之前从工作目录中删除所有未跟踪的文件.阅读如何从当前Git工作树中删除本地(未跟踪)文件?有关如何删除所有未跟踪文件的信息.

请务必不要意外删除您仍需要的未跟踪文件;)


Amr*_*med 16

你可以尝试这个命令

git clean -df
Run Code Online (Sandbox Code Playgroud)

  • 删除未跟踪的目录有什么用?它们可能很有价值,你知道. (4认同)

Abh*_*oel 15

删除所有未跟踪的文件:

git clean  -d  -fx .
Run Code Online (Sandbox Code Playgroud)

  • 哎呀,还清理了 IDE 文件:( (9认同)
  • 删除项目中可能使用的文件不应该是真正的解决方案 (4认同)
  • 请非常小心地使用此命令。它删除了我的代码中的很多文件。从过去 2 天开始,我无法再次执行我的代码。 (2认同)

Est*_*eis 12

git merge -f不存在,但是git checkout -f确实存在。在下面的示例中,FOI的意思是“感兴趣的文件”:供体分支中存在的文件,接收分支中不存在的文件以及由于存在于工作目录中且未跟踪而阻止合并的文件。这些是删除这些感兴趣的文件的步骤,以便您的合并将正常进行。

# FOI is the 'files of interest', the untracked files blocking the merge.

# 1. This forcibly replaces untracked FOI with tracked versions of
# the donor branch (as well as updating the rest of the working dir).
git checkout -f donor-branch

# 2. This removes the FOI because they they are tracked in our current
# (donor) branch, and absent in the `receiving-branch` we switch to.
git checkout receiving-branch

# 3. Now that the FOI are absent, merging in the donor branch will not
# overwrite any untracked files, so we get no errors.
git merge donor-branch
Run Code Online (Sandbox Code Playgroud)

在您的问题中,您问“我将如何修改pull命令以写入那些文件”?

拉就是git fetch(获取远程历史记录)+上游分支的自动合并。因此,您可以将pull命令修改为(a)获取远程历史记录,(b)使用checkout -f技巧覆盖文件,(c)合并远程历史记录。步骤将如下所示:

git fetch origin
git checkout -f origin/mybranch
git checkout mybranch
git merge origin/mybranch
Run Code Online (Sandbox Code Playgroud)

  • 这太干净了,不可能是第七个或第八个答案! (5认同)
  • 这是最好的答案。因为它可以将所有内容拉入,而无需重置或冒丢失内容的风险,只需覆盖需要覆盖的内容即可。完美。 (4认同)

Mic*_*rek 10

清洁/重置/硬结帐/重新设定基准都不适合我。

所以我只是删除了 git 抱怨的文件*

rm /path/to/files/that/git/complained/about
Run Code Online (Sandbox Code Playgroud)

*我检查了是否可以通过在单独的文件夹中检出全新的存储库来删除这些文件(文件不在那里)

  • 这是最好/最简单的答案。疯狂的是 git merge 中没有选项可以自动执行此操作。 (3认同)

小智 9

问题是当我们有传入的更改将合并未跟踪的文件时,git 会抱怨。这些命令帮助了我:

git clean -dxf
git pull origin master
Run Code Online (Sandbox Code Playgroud)


mat*_*att 7

这个答案与其他答案有何不同?

此处介绍的方法仅删除将被合并覆盖的文件。如果目录中还有其他未跟踪(可能被忽略)的文件,则此方法不会删除它们。

解决方案

此摘要将提取所有将被覆盖的未跟踪文件,并将其git pull删除。

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf "{}"
Run Code Online (Sandbox Code Playgroud)

然后执行以下操作:

git pull
Run Code Online (Sandbox Code Playgroud)

这不是git Poland命令,因此请始终仔细检查其用途:

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo "{}"
Run Code Online (Sandbox Code Playgroud)

说明-因为一个衬里很吓人:

这是它的功能细分:

  1. git pull 2>&1-捕获git pull输出并将其全部重定向到stdout,以便我们可以轻松地捕获它grep
  2. grep -E '^\s-目的是捕获将被覆盖的未跟踪文件的列表git pull。文件名前面有很多空白字符,因此我们利用它来获取它们。
  3. cut -f2- -从2中捕获的每一行的开头删除空格。
  4. xargs -I {} rm -rf "{}"-我们xargs遍历所有文件,将它们的名称保存在“ {}”中,并分别调用rm它们。我们-rf用来强制删除和删除未跟踪的目录。

用瓷器命令替换步骤1-3是很好的,但是我不知道有什么等效方法。


小智 6

如果您考虑使用该-f标志,您可能首先将其作为干运行运行.只是你早先知道接下来会出现什么样的有趣情况;-P

-n 
--dry-run 
    Don’t actually remove anything, just show what would be done.
Run Code Online (Sandbox Code Playgroud)


小智 6

除了接受的答案,您当然可以通过指定文件删除不再需要的文件:

git clean -f '/path/to/file/'
Run Code Online (Sandbox Code Playgroud)

如果你想查看git clean将删除哪些文件,请记得首先使用-n标志运行它.请注意,这些文件将被删除.就我而言,无论如何我都不关心它们,所以对我来说这是一个更好的解决方案.


A H*_*lam 5

一种方法是存储本地更改并从远程存储库中提取。通过这种方式,您不会丢失本地文件,因为这些文件将进入藏匿处。

git add -A
git stash
git pull
Run Code Online (Sandbox Code Playgroud)

您可以使用此命令检查本地隐藏文件 - git stash list


A. *_*son 5

对于那些不知道的人,git 会忽略文件和文件夹中的大写/小写名称差异。当您使用不同的大小写将它们重命名为完全相同的名称时,结果证明这是一场噩梦。

当我将文件夹从“Petstore”重命名为“petstore”(大写到小写)时遇到了这个问题。我编辑了我的 .git/config 文件以停止忽略大小写,进行更改,压缩我的提交,并将我的更改隐藏起来以移动到不同的分支。我无法将我隐藏的更改应用到另一个分支。

我发现有效的修复方法是临时编辑我的 .git/config 文件以再次暂时忽略大小写。这导致git stash apply成功。然后,我将 ignoreCase 改回false. 然后我添加了除 petstore 文件夹中的所有新文件之外的所有内容,git 奇怪地声称无论出于何种原因都删除了这些文件。我提交了我的更改,然后跑去git reset --hard HEAD删除那些未跟踪的新文件。我的提交完全符合预期:文件夹中的文件已重命名。

我希望这可以帮助你避免我同样的噩梦。

  • 感谢您的回答,就我而言,我能够通过使用“git config core.ignorecase true”来解决这个问题 (3认同)

Von*_*onC 5

Git 2.23(2019 年第 3 季度)后的答案不会使用Esteis答案中那样旧且令人困惑的git checkout命令

你会使用:

所以:

仅安全删除/覆盖烦人的文件

当你想合并时:

git switch -f receiving-branch # -f is an alias for --discard-changes.
git merge donor-branch         # merge works
Run Code Online (Sandbox Code Playgroud)

当你想拉的时候:

git switch -f mybranch    # automatically track origin/mybranch
git pull
Run Code Online (Sandbox Code Playgroud)

它避免了:

  • 危险git clean的操作
  • 分离的头像一个git checkout origin/myBranch
  • 显式拉动,因为具有相当于 的 git switch猜测模式git switch -c <branch> --track <remote>/<branch>。意思简单git pull就足够了。