【问题标题】:Checkout remote branch in a failsafe way, throwing local changes away?以故障安全的方式检查远程分支,丢弃本地更改?
【发布时间】:2019-12-14 03:46:11
【问题描述】:

将工作副本(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

我遇到的问题是它们不是故障安全的。工作副本可能处于导致结帐错误的状态:

错误:您对以下文件的本地更改将被覆盖 通过结帐:

...

请在切换分支之前提交您的更改或存储它们。中止

似乎可以解决问题的方法如下:

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

强制结帐,摆脱本地更改。远程分支被签出,覆盖可能存在的本地分支master 并且不分离 HEAD。 origin/master 应该指最新的远程 HEAD,因为 git fetch 在结帐之前运行。

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

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

【问题讨论】:

  • 在拉取之前进行硬重置应该会使您突出显示的特定错误消息消失。硬重置会直接消灭你的工作和舞台。
  • 是的,但如果我没记错的话,可能需要再次重置:拉取可能会导致合并冲突。有多种选择可以绕过它,但我认为我提出的两个命令会更有效地实现相同的结果。
  • 是的,但是在硬结账/拉取之后应该可以工作。
  • git reset --hard HEAD; git clean -dfx
  • 我之前试过git pull --hard,但不幸的是它不存在????无论如何,如果后者隐式地重置分支,我看不出有任何理由在强制签出/拉出之前进行硬重置。 @EncryptedWatermelon 在什么情况下需要清洁?忽略的文件会被忽略,因此它们不应该影响您推送回远程分支的内容,除非您强制暂存忽略的文件 - 但这应该通过强制签出来处理?

标签: git git-checkout git-reset


【解决方案1】:

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

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

首先清理工作目录:

例如使用其中一种方法:

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

    注意:隐藏编号 (@987654325如果您在此之后保存更多存储,@) 可能会发生变化。
    如果不确定要使用哪个号码,请咨询 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。确保您确实想要执行此操作,因为您无法撤消此操作。通常这对于避免结帐冲突是必要的。

清理您的工作目录后,您应该能够签出您想要的任何分支而不会发生冲突。


(我不想真正重新克隆,因为有问题的存储库很大。)

不确定你是否知道,所以以防万一带宽是这里的问题:

您可以在本地克隆存储库。所以不要重新克隆,例如从 github,您可以改为执行本地 git clone ./repo repo_new 并调整新仓库中的原点,例如git remote set-url https://mygitsvr/user/repo

【讨论】:

  • 感谢您的详细回答。您关于强制签出仅覆盖 一些 未跟踪文件的评论是我没有想到的一个好点。在结帐前进行硬重置和清理似乎是合理的,并且在结帐时不需要--force。但是,origin/master -B master 仍然是必需的。特定的工作副本用于 CI 自动化,因此无需存储更改。本地克隆听起来很有趣,但事实的来源是远程仓库,我更关心 CPU 和 I/O 性能而不是网络带宽(解析增量 + 文件签出 > 下载时间)。
  • 我明白了。然后强制结帐,然后是git clean -f -d(如果需要,可以使用-x)可能是最快的方法。
猜你喜欢
  • 2021-09-20
  • 2014-03-31
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2017-02-08
  • 2022-06-20
相关资源
最近更新 更多