如何在git pull
上强制覆盖本地文件?
该场景如下:
- 团队成员正在修改我们正在工作的网站的模板
- 他们正在将一些图像添加到图像目录(但是忘记在源代码控制下添加它们)
- 他们通过邮件将图像发送给我
- 我将图像添加到源代码管理下,并将其与其他更改一起推送到GitHub
- 他们无法从GitHub提取更新,因为Git不想覆盖其文件。
这是我得到的错误:
错误:未跟踪的工作树文件“ public / images / icon.gif”将被合并覆盖
如何强制Git覆盖它们? 这个人是设计师-通常我会手工解决所有冲突,因此服务器具有他们只需在计算机上更新的最新版本。
#1楼
像刺猬一样,我认为答案很糟糕。 但是,尽管刺猬的答案可能更好,但我认为它并没有它的优雅。 我发现做到这一点的方法是通过使用已定义策略的“提取”和“合并”。 应该这样做,以便保留本地更改,只要它们不是您要强制覆盖的文件之一即可。
首先提交您的更改
git add *
git commit -a -m "local file server commit message"
然后获取更改并在发生冲突时覆盖
git fetch origin master
git merge -s recursive -X theirs origin/master
“ -X”是选项名称,“ theirs”是该选项的值。 如果发生冲突,您选择使用“他们的”更改,而不是“您的”更改。
#2楼
看来最好的方法是先这样做:
git clean
要删除所有未跟踪的文件,然后继续执行常规的git pull
...
#3楼
首先,尝试标准方法:
git reset HEAD --hard # To remove all not committed changes!
git clean -fd # To remove all untracked (non-git) files and folders!
警告 :仅当您未提交上述命令时,它们才会导致数据/文件丢失!如果不确定,请首先备份整个存储库文件夹。
然后再次拉。
如果上述方法无济于事,并且您不关心未跟踪的文件/目录(为防万一,请首先进行备份),请尝试以下简单步骤:
cd your_git_repo # where 'your_git_repo' is your git repository folder
rm -rfv * # WARNING: only run inside your git repository!
git pull # pull the sources again
这将删除所有git文件(不包括.git/
dir,您拥有所有提交),然后再次将其拉出。
为什么git reset HEAD --hard
在某些情况下可能会失败?
.gitattributes file
自定义规则在.gitattributes中使用
eol=lf
规则可能会导致git通过将某些文本文件中的CRLF行尾转换为LF来修改某些文件更改。如果是这样,您必须提交这些CRLF / LF更改(通过在
git status
查看它们),或尝试:git config core.autcrlf false
以暂时忽略它们。文件系统不兼容
当您使用不支持权限属性的文件系统时。 在示例中,您有两个存储库,一个在Linux / Mac(
ext3
/hfs+
)上,另一个在基于FAT32 / NTFS的文件系统上。你可能注意到了,有两种不同类型的文件系统,所以不支持Unix许可基本上无法重置系统不支持那种权限的文件权限的一个,所以无论怎么
--hard
你尝试一下,git总是检测到一些“变化”。
#4楼
所有这些解决方案的问题在于它们要么太复杂,要么甚至更大的问题在于它们从Web服务器中删除了所有未跟踪的文件,我们不希望这样做,因为始终存在需要的配置文件。服务器,而不是在Git存储库中。
这是我们正在使用的最干净的解决方案:
# Fetch the newest code
git fetch
# Delete all files which are being added, so there
# are no conflicts with untracked