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

时间:2013-07-01 12:16:33

标签: git merge git-merge git-fetch

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

在另一个分支上,这些文件不是。

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

不幸的是我明白了:

  

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

覆盖

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

17 个答案:

答案 0 :(得分:351)

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

尝试运行

git add * 
git stash
git pull

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

答案 1 :(得分:73)

您可以尝试使用命令清除本地

中未跟踪的文件

git 2.11和更新

git clean  -d  -f .

年长的git

git clean  -d  -f ""

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

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

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

  • -f需要强制它运行。

这里的link也很有帮助。

答案 2 :(得分:55)

对我有用的唯一命令是:

Canvas#drawLines(…)

答案 3 :(得分:18)

如果这是一次性操作,您可以在执行拉取之前从工作目录中删除所有未跟踪的文件。请阅读How to remove local (untracked) files from the current Git working tree?,了解有关如何删除所有未跟踪文件的信息。

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

答案 4 :(得分:16)

您可以尝试该命令

git clean -df

答案 5 :(得分:15)

删除所有未跟踪的文件:

git clean  -d  -fx .

答案 6 :(得分:6)

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

-n 
--dry-run 
    Don’t actually remove anything, just show what would be done.

答案 7 :(得分:6)

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

git clean -f '/path/to/file/'

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

答案 8 :(得分:6)

此答案与其他答案有何不同?

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

解决方案

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

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf "{}"

然后执行:

git pull

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

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo "{}"

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

这是它的功能细目:

  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是很好的,但是我不知道有什么等效方法。

答案 9 :(得分:6)

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

git clean -dxf
git pull origin master

答案 10 :(得分:5)

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

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

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

git fetch origin
git checkout -f origin/mybranch
git checkout mybranch
git merge origin/mybranch

答案 11 :(得分:3)

清除/重置/硬结帐/重置对我都不起作用。

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

rm /path/to/files/that/git/complained/about

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

答案 12 :(得分:1)

在我遇到这个问题的情况下。我有一个在远程上重命名的本地文件。

当尝试git pull时,Git告诉我,新文件名没有被跟踪-尽管在本地尚不存在,但它在远程文件中。

因为在本地没有实例,所以我无法对{em> old 文件名进行git pull的操作(起初这并不明显,因为我对它重命名的愚蠢想法)。

答案 13 :(得分:1)

一种方法是通过存储本地更改并从远程存储库中提取。这样,您将不会丢失本地文件,因为这些文件将被保存。

git add -A
git stash
git pull

您可以使用此命令-git stash list

检查本地隐藏文件

答案 14 :(得分:0)

对于那些不知道的人,git忽略文件和文件夹中大写/小写名称的区别。当您将它们重命名为完全相同的名称(大小写不同)时,这真是一场噩梦。

当我将文件夹从“ Petstore”重命名为“ petstore”(大写小写)时,遇到了此问题。我已经编辑了.git / config文件以停止忽略大小写,进行更改,压缩提交,并保存更改以移至其他分支。我无法将隐藏的更改应用于其他分支。

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

我希望这可以帮助您避免我的噩梦。

答案 15 :(得分:0)

如果您将文件写入.gitignore下,请删除这些文件并再次运行git pull。那帮了我。

答案 16 :(得分:0)

此问题可能是由于您的本地更改造成的。

你不能直接存储文件,所以你尝试 git add .first

sudo git add *
sudo git stash
sudo git pull

解决了