【问题标题】:git reset all branches to origin?git将所有分支重置为原点?
【发布时间】:2021-06-11 20:02:13
【问题描述】:

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

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

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

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

【问题讨论】:

  • 在什么意义上更简单?
  • 如果其他分支的名称与远程的名称匹配,您可以删除所有其他分支。当您尝试git checkout example 时,将从origin/example 创建一个新的。
  • 你到底想做什么?如果只是将本地分支重置为相应的“原始”状态,我想删除确实有上游对应的分支会更容易。
  • 删除并重新创建,以便“以防万一”存在本地副本。我已经考虑过了,但它仍然是 2 * N 个命令,加上其中一个分支将被检出,并且需要更多命令来处理
  • 这里的why 没有意义,无论它们是否与本地分支提交匹配,您都已经拥有远程引用。您在这里考虑的根本问题是什么?

标签: git git-branch git-reset


【解决方案1】:

你不需要切换到分支。您可以简单地重新创建一个分支并让它指向任意 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/*'

【讨论】:

  • 这样更好;虽然它不适用于当前签出的分支,但它仍然需要 N 个命令(或 for 循环)。我想一个别名就可以了。
  • ^ 适用于您的第一个版本。根据您的第二个版本,我还找到了git push . 'refs/heads/*:refs/heads/backup-*'
  • @usretc git push . 'refs/heads/*:refs/heads/backup-* 只会复制您现有的本地分支,而不是任何远程跟踪分支。它也不会将您的本地分支重置为其匹配的远程部分。
  • 是的,我只是在尝试一切。场景是origin 改写历史而不受惩罚。所以,我经常想将所有本地分支重置为“他们的”版本。您的帖子还让我想到了保存当前状态,这是一个不错的奖励。
  • @usretc 我背离了重新创建所有本地分支的原始解决方案,因为这是一个难以逆转的破坏性操作。您的 cmets 表示由于频繁的历史重写,您想要创建 origin 远程的“备份”。在单独的层次结构中复制远程结构可为您提供备份,而不会覆盖/破坏任何本地参考。但没关系,无论哪种方式最适合您的方案。您可以使用fetch origin 'refs/heads/*:refs/heads/* 获得与原始解决方案相同的结果——这将覆盖所有本地引用。
猜你喜欢
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2019-04-24
  • 2012-10-31
  • 2014-10-11
  • 2013-06-01
  • 2015-04-26
相关资源
最近更新 更多