Git 命令签出任何分支并覆盖本地更改

是否有一个 Git 命令(或者一个简短的命令序列)可以安全地执行以下操作?

  • 去掉所有的局部变化。
  • 如果需要,从原始分支获取给定的分支
  • 检查给定的分支?

目前我被困在:

git fetch -p
git stash
git stash drop
git checkout $branch
git pull

但是它困扰着我,因为我被要求密码两次(由 fetchpull)

一些注意事项:

  • 它是自制的应用程序部署脚本的一部分(代码托管在 GitHub 上)。
  • 如果分支已经从原来的地方获取了或者没有获取,那么应该没有什么区别(例如,一个新分支的第一次部署理想情况下不应该需要任何额外的步骤)。
  • 这个脚本位于一个可以由多个人访问的远程计算机上,因此不存储凭据,并且必须输入用户/密码(如果可能的话,只输入一次)。
  • 我不关心任何本地更改; 我总是希望获得给定分支的原始副本(部署脚本的进一步部分产生本地更改)。
  • 我不能每次都克隆或导出一个新的存储库; 这需要花费太多的时间。
147605 次浏览

有几点:

  • 我相信 git stash + git stash drop可以用 git reset --hard代替
  • ... 或者,更短的,将 -f添加到 checkout命令:

    git checkout -f -b $branch
    

    这将丢弃任何本地更改,就像在结帐之前使用 git reset --hard一样。

至于主要问题: 您可以将适当的分支从远程合并到本地分支: git merge $branch origin/$branch,我相信它不会碰到远程。如果是这样的话,它就消除了对凭证的需要,从而解决了您最大的问题。

你可以遵循类似于 如何强制“ git pull”覆盖本地文件的解决方案:

git fetch --all
git reset --hard origin/abranch
git checkout abranch

那只需要一次接球。

在 Git 2.23 + 中,git checkout在这里被 git switch(只提供英文版本)所取代(仍处于试验阶段)。

git switch -f $branch

(如 回答所示,使用 ABC0是 --discard-changes的化名)

即使索引或工作树与 HEAD 不同,也要继续。
恢复索引和工作树以匹配切换目标。


如果你做 没有想要 开关分支,但只有 恢复一个文件夹从另一个分支,那么 git restore是另一个命令,取代了旧的过时和令人困惑的 git checkout
我展示了 我是 git restore

git restore --source=anotherBranch --staged] [--worktree -- aFolder
# or, shorter:
git restore -s anotherBranch -SW -- aFolder

在某些情况下,git resetgit clean可能是过度杀伤(并且是对时间的巨大浪费)。

如果您只是有一个类似“以下未跟踪文件将被覆盖...”的消息,并且您希望远程/原点/上游覆盖那些冲突的未跟踪文件,那么 git checkout -f <branch>是最佳选择。

如果您像我一样,您的其他选择是清理和执行 --hard reset,然后重新编译您的项目。

新的 git-switch指令(从 GIT 2.23开始)也有一个标志 --discard-changes,应该可以帮助您。之后可能需要 git pull

警告: 它仍被认为是实验性的。