pull覆盖本地 - git reset




如何强制“git pull”覆盖本地文件? (20)

重要提示:如果您有任何本地更改,它们将丢失。 无论有没有--hard选项,任何未被推送的本地提交都将丢失。 [*]

如果您有任何未被 Git跟踪的文件(例如上传的用户内容),则这些文件不会受到影响。

我认为这是正确的方法:

git fetch --all

然后,您有两个选择:

git reset --hard origin/master

或者如果你在其他分支上:

git reset --hard origin/<branch_name>

说明:

git fetch从远程下载最新版本而不尝试合并或重新绑定任何内容。

然后git reset将master分支重置为刚刚获取的分支。 --hard选项更改工作树中的所有文件以匹配origin/master中的文件

维护当前的本地提交

[*] :值得注意的是,可以通过在重置之前从master创建分支来维护当前的本地提交:

git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master

在此之后,所有旧提交将保留在new-branch-to-save-current-commits

未提交的更改

然而,未提交的更改(即使是暂存的)也将丢失。 确保存储并提交您需要的任何内容。 为此,您可以运行以下内容:

git stash

然后重新应用这些未提交的更改:

git stash pop

如何在git pull上强制覆盖本地文件?

场景如下:

  • 团队成员正在修改我们正在处理的网站的模板
  • 他们正在向images目录添加一些图像(但忘记在源代码管理下添加它们)
  • 他们稍后通过邮件发送图像给我
  • 我在源控件下添加图像并将其与其他更改一起推送到GitHub
  • 他们无法从GitHub中提取更新,因为Git不想覆盖他们的文件。

这是我得到的错误:

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge

如何强制Git覆盖它们? 这个人是设计师 - 通常我会手动解决所有冲突,因此服务器具有他们只需要在他们的计算机上更新的最新版本。


奖金:

在谈到之前答案中的拉/取/合并时,我想分享一个有趣且富有成效的技巧,

git pull --rebase

上面的命令是我Git生活中最有用的命令,节省了大量的时间。

在将新提交推送到服务器之前,请尝试此命令,它将自动同步最新的服务器更改(使用fetch + merge),并将您的提交放在Git日志的顶部。 无需担心手动拉/合并。

“git pull --rebase”中查找详细信息


警告: git clean删除所有未跟踪的文件/目录,无法撤消。

有时只是clean -f没有帮助。 如果您有未跟踪的DIRECTORIES,还需要-d选项:

# WARNING: this can't be undone!

git reset --hard HEAD
git clean -f -d
git pull

警告: git clean删除所有未跟踪的文件/目录,无法撤消。

首先考虑使用-n ( - --dry-run )标志。 这将显示在没有实际删除任何内容的情况下将删除的内容:

git clean -n -f -d

输出示例:

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...

一种更简单的方法是:

git checkout --theirs /path/to/file.extension
git pull origin master

这将使用git上的文件覆盖您的本地文件


似乎这里的大多数答案都集中在master分支上; 然而,有时候我在两个不同的地方工作同一个功能分支,我希望一个中的rebase能够反映在另一个中而没有大量的跳跃。

基于RNA的答案和torek对类似问题 的答案的组合,我提出了这个非常有效的方法:

git fetch
git reset --hard @{u}

从分支运行它,它只会将本地分支重置为上游版本。

这可以很好地放入git别名( git forcepull ):

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

或者,在.gitconfig文件中:

[alias]
  forcepull = "!git fetch ; git reset --hard @{u}"

请享用!


做就是了

git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname

因此,您可以避免所有不必要的副作用,例如删除您想要保留的文件或目录等。


唯一对我有用的是:

git reset --hard HEAD~5

这将带你回五次提交然后再回来

git pull

我发现通过查找如何撤消Git合并


将索引和头部重置为origin/master ,但不要重置工作树:

git reset origin/master

您可能会发现此命令有助于丢弃本地更改:

git checkout <your-branch> -f

然后进行清理(从工作树中删除未跟踪的文件):

git clean -f

如果除了未跟踪的文件之外还要删除未跟踪的目录:

git clean -fd

我刚刚解决了这个问题:

git checkout -b tmp # "tmp" or pick a better name for your local changes branch
git add -A
git commit -m 'tmp'
git pull
git checkout master # Or whatever branch you were on originally
git pull
git diff tmp

最后一个命令列出了本地更改的列表。 继续修改“tmp”分支,直到它可以接受,然后合并回master:

git checkout master && git merge tmp

下次你可以通过查找“git stash branch”以更干净的方式处理这个问题,虽然stash可能会让你在前几次尝试时遇到麻烦,所以首先要对非关键项目进行实验......


我有一个奇怪的情况, git cleangit resetgit clean 。 我必须在每个未跟踪的文件上使用以下脚本从git index删除冲突的文件:

git rm [file]

然后我能够拉得很好。


我有同样的问题。 没有人给我这个解决方案,但它对我有用。

我通过以下方式解决了

  1. 删除所有文件。 只留下.git目录。
  2. git reset --hard HEAD
  3. git pull
  4. git push

现在它有效。


我有类似的问题。 我不得不这样做:

git reset --hard HEAD
git clean -f
git pull

我知道一种更简单,更少痛苦的方法:

$ git branch -m [branch_to_force_pull] tmp
$ git fetch
$ git checkout [branch_to_force_pull]
$ git branch -D tmp

而已!


我阅读了所有的答案,但我正在寻找一个命令来做到这一点。 这就是我做的。 为.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

所有这些解决方案的问题在于它们都太复杂,或者更大的问题是它们从Web服务器中删除所有未跟踪的文件,这是我们不想要的,因为总是需要配置文件服务器而不是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
  • 第一个命令获取最新数据。

  • 第二个命令检查是否有任何文件正在添加到存储库,并从本地存储库中删除那些未导致文件,这会导致冲突。

  • 第三个命令检出所有本地修改的文件。

  • 最后我们做了一个更新到最新版本,但这次没有任何冲突,因为repo中的未跟踪文件不再存在,并且所有本地修改的文件已经与存储库中的相同。


看起来最好的方法是先做:

git clean

要删除所有未跟踪的文件,然后继续使用通常的git pull ...


而不是做:

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

我建议做以下事情:

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

如果要重置为origin / master分支,是否需要获取所有遥控器和分支?


试试这个:

git reset --hard HEAD
git pull

它应该做你想要的。


这四个命令对我有用。

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

执行这些命令后检查/拉出

git pull origin master

我尝试了很多,但终于用这些命令取得了成功。





git-fetch