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

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

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

不幸的是,我得到了这个:

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

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


当前回答

以我为例,当我遇到这个问题时。我在遥控器上重命名了一个本地文件。

当尝试git拉git告诉我新的文件名没有跟踪-它是在远程上,虽然它还不存在于本地。

因为在本地没有实例,我不能做git拉,直到我在旧文件名上做了git rm(这起初并不明显,因为我愚蠢的重命名它的想法)。

其他回答

安全地删除/覆盖麻烦的文件

当你想合并时:

git checkout -f donor-branch   # replace bothersome files with tracked versions
git checkout receiving-branch  # tracked bothersome files disappear
git merge donor-branch         # merge works

当你想拉的时候:

git fetch
git checkout -f origin/mybranch   # replace bothersome files with tracked versions
git checkout mybranch             # tracked bothersome files disappear
git pull origin/mybranch          # pull works

这就是你使用它所需要知道的。下面是一个解释。


详细解释

我们要删除的烦人文件:

存在于捐赠分支(对于git拉:上游分支), 在接收分支中不存在, 并且正在阻止合并,因为它们在你的工作目录中存在并且未被跟踪。

Git merge -f和Git pull -f不存在,但是Git checkout -f存在。

我们将使用git checkout -f + git checkout来跟踪+删除麻烦的文件,然后您的合并可以正常进行。

步骤1。这一步强制将未跟踪的Bothersome Files替换为跟踪的捐赠分支版本(它还检出捐赠分支,并更新工作目录的其余部分)。

git checkout -f donor-branch

步骤2。这一步删除了麻烦文件,因为它们在我们当前(捐赠)分支中被跟踪,而在我们切换到的接收分支中不存在。

git checkout receiving-branch

步骤3。现在Bothersome Files不存在了,在捐赠分支中合并将不会覆盖任何未跟踪的文件,因此我们不会得到错误。

git merge donor-branch

如果你考虑使用-f标志,你可以先运行它作为一个演练。你只需要提前知道你接下来会遇到什么样有趣的情况;-P

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

我有同样的问题,每当我尝试合并主在我的本地分支它说

以下未跟踪的工作树文件将被合并M.xcworkspace/xcshareddata/swiftpm/Package.resolved覆盖

但以上任何一个答案对我都不起作用。当我做git状态没有未跟踪的文件,所以当我做git添加。没有文件得到阶段性,因此存储不能解决问题,也不能像上面回答的那样强制签出。

我可以通过运行上面提到的命令来解决这个问题,但更重要的是,我必须关闭Xcode(即使在运行干净命令后,它也可能会创建导致我出现问题的文件)。

Git clean -dfxn(检查什么可以删除)

Git清除-d -fx。(删除上述文件)

更新-一个更好的版本

此工具(https://github.com/mklepaczewski/git-clean-before-merge)将:

删除未跟踪的文件,这些文件与它们的git拉等价物相同, 将更改还原到修改后的文件,这些文件的修改版本与它们的git拉等价物相同, 报告修改/未跟踪的文件,与他们的git拉版本不同, 该工具有——pretend选项,不会修改任何文件。

旧版本

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

这里给出的方法只删除将被merge覆盖的文件。如果目录中有其他未跟踪(可能被忽略)的文件,此方法将不会删除它们。

解决方案

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

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

然后就这样做:

git pull

这不是git瓷器命令,所以总是仔细检查它会做什么:

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

解释——因为有一句台词很吓人:

以下是它的功能:

git pull 2>&1 - capture git pull output and redirect it all to stdout so we can easily capture it with grep. grep -E '^\s - the intent is to capture the list of the untracked files that would be overwritten by git pull. The filenames have a bunch of whitespace characters in front of them so we utilize it to get them. cut -f2- - remove whitespace from the beginning of each line captured in 2. xargs -I {} rm -rf "{}" - us xargs to iterate over all files, save their name in "{}" and call rm for each of them. We use -rf to force delete and remove untracked directories.

如果用瓷器命令代替第1-3步就太好了,但我不知道有什么等价的。

如果文件写在.gitignore下,删除这些文件并再次运行git pull。这帮了我大忙。