以故障安全方式检查远程分支,丢弃本地更改?

Checkout remote branch in a failsafe way, throwing local changes away?

将工作副本(master 分支)重置为上游分支状态的常见建议似乎是:

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

git checkout master
git reset --hard
git pull

或者分离 HEAD:

git checkout origin/master
git reset --hard
git pull origin master

我对这些的问题是它们不是故障安全的。工作副本可能处于导致签出错误的状态:

error: Your local changes to the following files would be overwritten by checkout:

...

Please commit your changes or stash them before you switch branches. Aborting

似乎可以解决以下问题:

git fetch
git checkout --force origin/master -B master

强制结帐,删除本地更改。检出远程分支,覆盖可能存在的本地分支 master 并且不分离 HEAD。 origin/master 应该引用最新的远程 HEAD,因为 git fetch 在结帐之前是 运行。

我的问题:是否有其他 Git 极端情况可以防止这些命令失败?一些奇怪的工作副本状态,比如在合并过程中,未跟踪的文件被跟踪或反之亦然,被忽略的文件被暂存,子模块相关的东西或类似的东西?

哪些命令相当于删除整个工作副本并再次克隆存储库? (我不想真正重新克隆,因为有问题的存储库很大。)

强制检出将覆盖工作目录中未跟踪的文件(如果它们在待检出分支中被跟踪),但它不会删除未跟踪的文件不是结帐的一部分。

按照我推荐的方式清理结帐:

首先清理工作目录:

例如使用其中一种方法:

  • 隐藏更改和未跟踪的文件以供以后使用
    git stash save -u 'some message'
    如果您再次需要它们,您可以使用
    恢复这些更改git stash apply stash{0}
    如果您想检查隐藏的更改,可以使用
    git stash show -p stash@{0}
    ,如果您想检查隐藏的未跟踪文件,可以使用
    git show stash@{0}^3.

    注意:如果您在此之后保存更多的藏品,藏品数量(0)可能会改变。
    咨询git stash list 如果不确定使用哪个数字。
  • 隐藏更改和未跟踪文件 忽略文件,方法是首先使用 git status --ignored 仔细检查哪些文件,然后使用 git stash save --all 'some message'.
  • 使用 git reset --hard HEAD; git clean -f -d 永久删除更改和未跟踪的更改。请确保您确实想要执行此操作,因为您无法撤消此操作。
  • 删除更改未跟踪的文件忽略的文件,首先使用git status --ignored仔细检查哪些文件,然后使用git clean -f -d -x。确保您确实想要执行此操作,因为您无法撤消此操作。通常这应该不是以避免结帐冲突所必需的。

清理工作目录后,您应该能够签出任何分支你想要没有碰撞。


(I don't want to actually re-clone because the repository in question is huge.)

不确定您是否知道,以防带宽是这里的问题:

您可以在本地克隆存储库。因此,而不是重新克隆例如从 github 开始,您可以改为执行本地 git clone ./repo repo_new 并在新回购协议中调整原点,例如git remote set-url https://mygitsvr/user/repo.