git 将所有分支重置为原点?

git reset all branches to origin?

我想将多个分支重置为它们的原始版本。所以,

git fetch --all
for b in master work; do
  git switch $b; git reset --hard origin/$b
done

但是更简单?我考虑过删除所有分支以便重新创建它们,但是必须检查一个分支并且会出错。

编辑:场景是origin经常重写多个分支而不受惩罚。下面的答案也给了我将各种状态保存到备份引用的想法——这是一个很好的奖励。

您不需要切换到分支机构。您可以简单地重新创建一个分支并将其指向任意任意 ref:

git branch -f branchname "$target"

(作为额外的好处,与 git reset --hard 相比,工作树中未暂存的更改不会受到影响,后者会清除任何本地更改。)

在脚本中使用时应避免使用git branch,最好使用for-each-ref:

git for-each-ref 'refs/remotes/origin' --format='%(refname:strip=3)' \
| while read ref; do
    git branch -f "$ref" "origin/$ref";
done

如果您只对创建远程跟踪分支当前状态的“备份”感兴趣,git pushgit fetch 可以通过使用当前克隆作为远程来提供帮助。

任一命令都会将 origin 远程的所有分支复制到前缀为 backup/ 的新(本地)分支层次结构中,即 origin/dev 变为 backup/dev:

git fetch . 'refs/remotes/origin/*:refs/heads/backup/*'
# or:
git push . 'refs/remotes/origin/*:refs/heads/backup/*'

或者直接从远程获取到一组单独的本地引用:

git fetch origin 'refs/heads/*:refs/heads/backup/*'