我如何强制将本地文件覆盖在git pull
我的本地仓库包含一个文件名文件名与服务器上的文件名相同。
错误: 未跟踪的工作树文件“ example. txt ” 会被合并覆盖
我如何强制将本地文件覆盖在git pull
我的本地仓库包含一个文件名文件名与服务器上的文件名相同。
错误: 未跟踪的工作树文件“ example. txt ” 会被合并覆盖
当前回答
不要用git reset --hard
这将抹去他们完全不可取的变化,相反:
git pull
git reset origin/master
git checkout <file1> <file2> ...
您当然可以使用git fetch
代替git pull
因为它显然不会合并, 但如果你通常拉它, 继续拉在这里是有道理的。
所以这里发生的事情就是git pull
更新您的源/ 主管参考; git reset
更新本地分支引用与来源/主管相同,不更新任何文件,所以您的检查状态没有变化;git checkout
将文件返回到您的本地分支索引状态需要时。如果在现场和上游主控上添加了完全相同的文件,索引已经与重置之后的文件匹配,因此在普通情况下,不需要做git checkout
完全没有
如果上游分支也包含您想要自动应用的承诺,您可以跟踪进程上微妙的变异:
git pull
git merge <commit before problem commit>
git reset <problem commit>
git checkout <file1> <file2> ...
git pull
其他回答
这个解决方案总是在运行 。
cd $GIT_ROOT_DIRECTORY
git fetch origin/$TARGET_BRANCH
git rm -rf --cached .
git reset --hard origin/TARGET_BRANCH
git clean -df
git pull origin $TARGET_BRANCH
所有这些解决方案的问题在于,它们要么过于复杂,要么是一个更大的问题,就是它们从网络服务器上移除了所有未跟踪的文件,我们并不想这样做,因为服务器上总是有需要的配置文件,而不是Git仓库。
以下是我们使用的最干净的解决方案:
# 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
rm -f -- "$file"
done
# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
git checkout -- "$file"
done
# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
第一个命令获取最新数据 。
第二次命令检查是否正在将任何文件添加到存储库中,并从本地存储库中删除那些会造成冲突的未跟踪文件。
第三个命令检查所有本地修改的文件 。
最后,我们努力更新最新版本, 但这次没有任何冲突, 因为回购中的未追踪文件已经不存在了, 所有本地修改过的文件都已经和存储库一样了。
这是恢复变革的最佳做法:
git commit
提交您预置的更改, 以便将其保存在reflog 格式的reflog(见下文)git fetch
获取最新的上游变化git reset --hard origin/master
硬重置源主分支缩略reflog 格式的reflog 本地存储库中正在更新的记录分支和其他参考资料简简简简简简简reflog 格式的reflog是更改的历史历史.
因此,这总是一个伟大的实践 承诺。 承诺被附在折叠件上, 以确保您永远有办法检索删除的代码 。
我尝试了大部分我在这里能找到的东西,
有效的是git merge -X theirs
而不是做:
git fetch --all
git reset --hard origin/master
我建议采取以下行动:
git fetch origin master
git reset --hard origin/master
如果您要重置到源/ 主管分支, 无需获取所有远程和分支 ?