在我的分支上,我在.gitignore中有一些文件
在不同的分支上,这些文件不是。
我想将另一个分支合并到我的分支中,并且我不在乎那些文件是否不再被忽略。
不幸的是我得到这个:
以下未跟踪的工作树文件将被合并覆盖
我如何修改我的pull命令以覆盖这些文件,而不必自己查找,移动或删除这些文件?
在我的分支上,我在.gitignore中有一些文件
在不同的分支上,这些文件不是。
我想将另一个分支合并到我的分支中,并且我不在乎那些文件是否不再被忽略。
不幸的是我得到这个:
以下未跟踪的工作树文件将被合并覆盖
我如何修改我的pull命令以覆盖这些文件,而不必自己查找,移动或删除这些文件?
Answers:
问题是您不是在本地跟踪文件,而是远程跟踪了相同的文件,因此为了“拉”您的系统,将不得不覆盖不受版本控制的本地文件。
尝试跑步
git add *
git stash
git pull
这将跟踪所有文件,删除对这些文件的所有本地更改,然后从服务器获取文件。
git add -A .; git stash
为我工作。该git add *
变种抱怨忽略的路径。
您可以尝试使用命令从本地清除未跟踪的文件
Git 2.11和更高版本:
git clean -d -f .
旧版本的Git:
git clean -d -f ""
在哪里-d
可以替换为以下内容:
-x
被忽略的文件以及Git未知的文件也将被删除。
-d
除未跟踪的文件外,还删除未跟踪的目录。
-f
需要强制它运行。
这也是一个有用的链接。
-i
为交互模式。除了删除不需要的目录外,我还删除了该项目的用户设置:-(
-x
可以伤害。
对我有用的唯一命令是:
git fetch --all
git reset --hard origin/{{your branch name}}
git merge
该文件将覆盖未跟踪的文件以下注释将“ FOI”用于“感兴趣的文件”,即
git checkout -f donor-branch # replace FOI with tracked `donor` versions
git checkout receiving-branch # FOI are not in `receiving`, so they disapppear
git merge donor-branch # now the merge works
git pull
该文件将覆盖未跟踪的文件pull = fetch + merge
,因此我们采取 git fetch
了上述git checkout -f, git checkout, git merge
技巧。
git fetch origin # fetch remote commits
git checkout -f origin/mybranch # replace FOI with tracked upstream versions
git checkout mybranch # FOI are not in mybranch, so they disapppear
git merge origin/mybranch # Now the merge works. fetch + merge completes the pull.
git merge -f
不存在,但是git checkout -f
确实存在。
我们将使用git checkout -f
+ git checkout
删除感兴趣的文件(请参见上文),然后您的合并即可正常进行。
步骤1.此步骤用供体分支的跟踪版本强行替换未跟踪的FOI(它还会签出供体分支,并更新其余的工作目录)。
git checkout -f donor-branch
第2步。此步骤将删除FOI,因为它们已在我们当前的(捐助者)分支中被跟踪,而在receiving-branch
我们切换到的FOI中却没有。
git checkout receiving-branch
步骤3.现在不存在FOI,合并到捐助者分支中将不会覆盖任何未跟踪的文件,因此我们没有任何错误。
git merge donor-branch
如果这是一次性操作,则可以在执行提取操作之前从工作目录中删除所有未跟踪的文件。阅读如何从当前的Git工作树中删除本地(未跟踪)文件?有关如何删除所有未跟踪文件的信息。
确保不要意外删除仍需要的未跟踪文件;)
更新-更好的版本
该工具(https://github.com/mklepaczewski/git-clean-before-merge)将:
git pull
,git pull
等效版本相同,git pull
版本,--pretend
不会修改任何文件的选项。旧版
这个答案与其他答案有何不同?
此处介绍的方法仅删除将被合并覆盖的文件。如果目录中还有其他未跟踪(可能被忽略)的文件,则此方法不会删除它们。
解决方案
此代码段将提取所有未跟踪的文件,这些文件将被覆盖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 "{}"
说明-因为一个衬里很吓人:
这是它的功能细分:
git pull 2>&1
-捕获git pull
输出并将其全部重定向到stdout,以便我们可以轻松地捕获它grep
。grep -E '^\s
-目的是捕获将被覆盖的未跟踪文件的列表 git pull
。文件名前面有很多空白字符,因此我们利用它来获取它们。cut -f2-
-从2中捕获的每一行的开头删除空格。xargs -I {} rm -rf "{}"
-我们xargs
遍历所有文件,将它们的名称保存在“ {}”中,并分别调用rm
它们。我们-rf
用来强制删除和删除未跟踪的目录。用瓷器命令替换步骤1-3是很好的,但是我不知道有什么等效方法。
git pull
为git checkout <branch_name>
对于那些不知道的人,git会忽略文件和文件夹中大写/小写名称的区别。当您使用不同的大小写将它们重命名为完全相同的名称时,这真是一场噩梦。
当我将文件夹从“ Petstore”重命名为“ petstore”(大写到小写)时,我遇到了这个问题。我已经编辑了.git / config文件,以停止忽略大小写,进行更改,压缩提交并保存更改以移至其他分支。我无法将隐藏的更改应用到该其他分支。
我发现有效的解决方法是暂时编辑.git / config文件以再次暂时忽略大小写。这导致git stash apply
成功。然后,我将ignoreCase更改回false
。然后我添加了所有内容,除了petstore文件夹中的新文件,git奇怪地声称,无论出于什么原因,新文件都被删除了。我提交了更改,然后执行了git reset --hard HEAD
以删除那些未跟踪的新文件。我的提交与预期的完全一样:文件夹中的文件已重命名。
我希望这可以帮助您避免我的噩梦。
git pull -f
呢git checkout .
。什么样的恶梦。
清除/重置/硬结帐/重置对我都不起作用。
所以我刚刚删除了git抱怨的文件*
rm /path/to/files/that/git/complained/about
*我检查了是否可以通过在单独的文件夹中签出全新的存储库来删除此文件(文件不存在)