如何强制执行 "git pull" 并覆盖本地文件?

9510

如何在执行 git pull 命令时强制覆盖本地文件?我的本地仓库中包含与服务器上相同文件名的文件。

错误:无法完成合并,未跟踪的工作树文件 'example.txt' 将被覆盖。


48
如果您正在阅读此内容并认为自己可能会丢失文件,我曾经遇到这种情况,并发现Sublime Text的缓冲区保存了我的工作 - 如果我在某个项目上工作时,意外删除了所有内容,尝试解决类似于这个问题或使用此问题的答案,并且已经在Sublime中打开这些文件(有很大的可能性),那么文件仍将存在于Sublime中,可能是在其中,也可能在撤销历史记录中。 - Toni Leigh
303
重置当前分支到与远程分支origin/branch_to_overwrite相同的状态,包括代码和提交记录。命令为:git reset --hard origin/branch_to_overwrite - Andrew Atkinson
5
基本上,在初始的checkout -b之后,只需从develop分支进行一次pull操作,然后进行你的工作,完成后再将更改push回去。 - ldgorman
5
简短回答:删除并重新创建分支。
  1. 删除分支: git branch <branch> -D
  2. 重置到冲突之前的提交: git reset <commit> --hard
  3. 重新创建分支: git branch <branch>
  4. 设置跟踪服务器: git --set-upstream-to=origin/<branch> <branch>
  5. 拉取:git pull
- Nino Filiu
6
将所有的CRLF行尾符改为LF(以干净的方式开始),请执行以下操作:git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout . - Chloe
显示剩余6条评论
53个回答

16

这四个命令对我来说可行。

git reset --hard HEAD
git checkout origin/master
git branch -D master
git checkout -b master

执行这些命令后,请检查/拉取

git pull origin master

我尝试了很多次,但最终通过这些命令成功了。


3
"git branch -D master" 删除分支,所以请小心操作。我更喜欢使用 "git checkout origin/master -b <新分支名称>" 来创建一个新的分支并且不需要3、4行命令。同时建议使用 "git clean -f" 命令来清理工作区。 - Chand Priyankara

16
git fetch --all
git reset --hard origin/develop

git reset:这个命令的这部分用于将当前分支重置到指定的提交或引用。 - undefined
--hard:此选项用于指定重置模式。在--hard模式下,不仅分支指针会移动到指定的提交或引用,工作目录和索引(暂存区)也会被强制更新以匹配该提交。这意味着你工作目录和暂存区中与指定提交不相关的任何更改都将被永久删除。 - undefined
源/开发:这是您想要将当前分支重置为的参考点。在这种情况下,您将当前分支重置为远程仓库中称为“origin”的“develop”分支的状态。通常在您想要丢弃所有本地更改并将分支与远程仓库上的“develop”分支的最新状态同步时使用此选项。 - undefined

14

我阅读了所有的答案,但我正在寻找一个单一的命令来完成这个操作。这是我的做法:在.gitconfig中添加了一个git别名。

[alias]
      fp = "!f(){ git fetch ${1} ${2} && git reset --hard ${1}/${2};};f"

将您的命令作为

git fp origin master

等同于

git fetch origin master
git reset --hard origin/master

11

不要使用git reset --hard。这会删除他们的更改,这可能是完全不可取的。相反:

git pull
git reset origin/master
git checkout <file1> <file2> ...

当然可以使用 git fetch 替代 git pull ,因为它明显不会合并,但如果你通常使用 pull,在这里继续 pull 是有意义的。

所以,这里发生的是 git pull 更新了你的 origin/master 引用git reset 更新了你的本地分支引用 成为与 origin/master 相同,而不更新任何文件,因此你的检出状态未更改;然后 git checkout 根据需要还原文件到你的本地分支索引状态 。在现场和上游主分支上完全添加了相同的文件的情况下,索引已经匹配了重置后的文件,因此通常情况下你根本不需要执行 git checkout

如果上游分支还包含你想要自动应用的提交,则可以按照该过程的微妙变化进行操作:

git pull
git merge <commit before problem commit>
git reset <problem commit>
git checkout <file1> <file2> ...
git pull

9
这是撤销更改的最佳实践:
  • git commit 将您已暂存的更改提交,以便将它们保存在 reflog 中(见下文)
  • git fetch 获取最新的上游更改
  • git reset --hard origin/master 强制重置到原始主分支
reflog 记录本地存储库中更新的分支和其他引用。或者简单地说 - reflog 是您更改历史的记录
因此,提交总是一个很好的做法。提交会附加到 reflog 中,这可确保您始终可以找回删除的代码。

7
在Windows上,只需执行这个命令:
git fetch --all & git reset --hard origin/master

为什么它会与 Linux 上的不同?您使用哪个特定的 git 实现/软件包?和/或者使用哪个环境(例如 MinGW)? - Peter Mortensen
我不确定,只确定它在Windows中有效。在Linux中,将两个命令连接到一行中的分隔符是什么?(不是管道,只是简单地连接而不传递输出) - Luca C.

6

我使用了这个命令来删除本地文件,以便进行pull/merge操作。但是要小心!先运行git merge ... 命令,看看是否只有那些你真正想要删除的文件。

git merge origin/master 2>&1 >/dev/null | grep ^[[:space:]] | sed s/^[[:space:]]//g | xargs -L1 rm
  • git merge 列出了所有这些文件,它们都以一些空白开头。
  • 2>&1 >/dev/null 将错误输出重定向到标准输出,因此会被 grep 捕获。
  • grep ^[[:space:]] 仅过滤具有文件名的行。
  • sed s/^[[:space:]]//g 去掉开头的空格。
  • xargs -L1 rm 对这些文件中的每一个调用 rm,删除它们。

小心操作:无论 git merge 输出什么,rm 都将针对以空格开头的每一行进行调用。


6

我曾试图在Angular2-Webpack-Starter上使用Material2分支,但遇到了很大的困难。这是我下载和使用该分支的唯一方法。

git clone --depth 1 https://github.com/angularclass/angular2-webpack-starter.git

cd angular2-webpack-starter/

git checkout -b material2

打开项目文件夹并删除所有非隐藏的文件和文件夹,保留所有隐藏的内容。

git add .

git commit -m "pokemon go"

git reset --hard

git pull origin material2

当编辑器弹出时,按 ':wq',然后按Enter键。

现在你已经准备好了。


6

如果你在编写代码时发现新的更改是一个巨大的错误或不需要的,你可以简单地使用替代方法:

git restore .

其中“.”表示目录中的所有文件。


2
我最近发现了这个命令,我认为它是最简单的。 - Chan Kim

6
这个解决方案始终在运行。
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

为什么不费心解释呢? - nerkn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接