在我的分支上,我在.gitignore中有一些文件
在另一个分支上,这些文件不是。
我想将不同的分支合并到我的分支中,我不关心这些文件是否不再被忽略。
不幸的是,我得到了这个:
以下未跟踪的工作树文件将被合并覆盖
我如何修改我的pull命令来覆盖这些文件,而不需要我自己找到、移动或删除这些文件?
在我的分支上,我在.gitignore中有一些文件
在另一个分支上,这些文件不是。
我想将不同的分支合并到我的分支中,我不关心这些文件是否不再被忽略。
不幸的是,我得到了这个:
以下未跟踪的工作树文件将被合并覆盖
我如何修改我的pull命令来覆盖这些文件,而不需要我自己找到、移动或删除这些文件?
当前回答
您可以尝试命令从本地清除未跟踪的文件
Git 2.11及更新版本:
git clean -d -f .
Git的旧版本:
git clean -d -f ""
其中-d可以替换为:
-x忽略的文件以及Git不知道的文件也会被删除。 除未跟踪文件外,删除未跟踪目录。 -f命令用于强制运行。
下面的链接也会很有帮助。
其他回答
对于那些不知道的人,git忽略了文件和文件夹中的大写/小写名称差异。当您用不同的情况将它们重命名为完全相同的名称时,结果是一场噩梦。
当我将文件夹从“Petstore”重命名为“Petstore”(大写到小写)时遇到了这个问题。我已经编辑了我的.git/config文件以停止忽略大小写,进行了更改,压缩了我的提交,并保存了我的更改以移动到不同的分支。我不能将我所存储的更改应用到另一个分支。
The fix that I found that worked was to temporarily edit my .git/config file to temporarily ignore case again. This caused git stash apply to succeed. Then, I changed ignoreCase back to false. I then added everything except for the new files in the petstore folder which git oddly claimed were deleted, for whatever reason. I committed my changes, then ran git reset --hard HEAD to get rid of those untracked new files. My commit appeared exactly as expected: the files in the folder were renamed.
我希望这能帮助你避免我同样的噩梦。
更新-一个更好的版本
此工具(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步就太好了,但我不知道有什么等价的。
清洁/重置/硬签出/重基都不适合我。
所以我只是删除了git抱怨的文件*
rm /path/to/files/that/git/complained/about
*我检查了这个文件是否可以通过在一个单独的文件夹中签出一个全新的回购来删除(文件不在那里)
Git 2.23(2019年第三季度)后的回答不会像Esteis的回答中那样使用旧的、令人困惑的Git checkout命令。
你可以用:
Git开关切换分支 Git恢复恢复文件(如图所示)
So:
安全地删除/覆盖麻烦的文件
当你想合并时:
git switch -f receiving-branch # -f is an alias for --discard-changes.
git merge donor-branch # merge works
当你想拉的时候:
git switch -f mybranch # automatically track origin/mybranch
git pull
它避免了:
git清洗危险操作 分离的头像一个git checkout origin/myBranch) 显式的拉,因为git switch有一个猜测模式,相当于git switch -c <branch>——track <remote>/<branch>。这意味着简单的git拉就足够了。
问题是你没有在本地跟踪文件,但是相同的文件被远程跟踪,所以为了“拉”你的系统将被迫覆盖不受版本控制的本地文件。
尝试运行
git add *
git stash
git pull
这将跟踪所有文件,删除对这些文件的所有本地更改,然后从服务器获取这些文件。