以故障安全方式检查远程分支,丢弃本地更改?
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
.
将工作副本(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
.