我如何强制将本地文件覆盖在git pull
我的本地仓库包含一个文件名文件名与服务器上的文件名相同。
错误: 未跟踪的工作树文件“ example. txt ” 会被合并覆盖
我如何强制将本地文件覆盖在git pull
我的本地仓库包含一个文件名文件名与服务器上的文件名相同。
错误: 未跟踪的工作树文件“ example. txt ” 会被合并覆盖
当前回答
似乎大多数答案都集中在master
然而, 分支中, 有几次我在两个不同的地方 研究同一个功能分支, 我希望在一个分支中重设一个, 在另一个分支中反映出来, 而不是跳过很多圈子。
依据综合RNA 的答复和Torrek对类似问题的答复我已经想出了一个非常成功的计划:
git fetch
git reset --hard @{u}
从一个分支运行它 它只会重新设置你的地方分支 到上游版本。
这可以恰当地用在别名中(git alits) (Git) 。git forcepull
)以及:
git config alias.forcepull "!git fetch ; git reset --hard @{u}"
或者,在你的.gitconfig
文件 :
[alias]
forcepull = "!git fetch ; git reset --hard @{u}"
尽情享受吧!
其他回答
我认为,冲突有两种可能的原因,必须分别加以解决,而且据我所知,上述答案中没有一个涉及这两个问题:
未跟踪的本地文件需要删除, 手动( 安全) 或按其他答案中的建议, 由git clean -f -d
离子分支以外的当地承诺也需要删除。git reset --hard origin/master
(取代“校长”的分支)git fetch origin
(一)(一)
我也有同样的问题,而且出于某种原因,git clean -f -d
这就是为什么:出于某种原因, 如果你的档案被Git(通过.gitignore 条目,我想,通过.gitignore 条目)忽略了, 它仍然费了时间,拉拉拉,但一个清洁除非添加, 否则不会删除它-x
.
解决这一问题的另一种办法是,首先将任何未承诺的改动用git stash
然后运行,然后运行
git pull --rebase=interactive -s recursive -X theirs
在互动的重新基础中,你可以改变你所有本地不想要的承诺drop
,这将摆脱他们 并离开你 在远程分支的头部 而不引入合并承诺。
现在你可以跑了git stash apply
如果你有 本地藏的改变 你想带回来。
根据我自己的类似经验,以上Strahinja Kustudidic提出的解决方案是迄今为止最好的。 正如其他人已经指出的那样,仅仅努力重设就会消除全部( 全部)未跟踪的文件, 其中可能包含很多您不想删除的文件, 例如配置文件。 更安全的做法是只删除即将添加的文件, 而对于这个事项, 您可能还想要检查任何即将更新的本地修改过的文件 。
因此,我更新了Kustudic的脚本来做这个。我还修了个打字机(在原文中遗漏了一个字)。
#/bin/sh
# Fetch the newest code
git fetch
# Delete all files which are being added,
# so there are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
echo "Deleting untracked file $file..."
rm -vf "$file"
done
# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
echo "Checking out modified file $file..."
git checkout $file
done
# Finally merge all the changes (you could use merge here as well)
git pull
您可能会发现此命令有助于丢弃本地更改 :
git checkout <your-branch> -f
然后进行清理(从工作树上移走未追踪的文件) :
git clean -f
如果您想要除去未跟踪的文件之外, 还要删除未跟踪的目录 :
git clean -fd