git笔记之重置本地仓库所有分支和远程保持一致、工作区恢复干净,像刚clone下来一样

git笔记之重置本地仓库所有分支和远程保持一致、工作区恢复干净,像刚clone下来一样

code review!

文章目录

要让本地仓库的所有分支都重置到与远程完全一致的状态,可以使用以下脚本。这个脚本会执行以下步骤:

  1. 获取所有本地跟踪的分支。
  2. 对于每个分支,切换到该分支并从远程拉取最新的更改,强制覆盖本地更改(包括未提交的更改、冲突等)。
  3. 重置工作目录和索引到最新拉取的状态。
  4. 清理可能存在的未跟踪文件。

1.实现该功能的 Bash 脚本示例

bash 复制代码
#!/bin/bash

# 获取当前所在的分支
initial_branch=$(git rev-parse --abbrev-ref HEAD)

# 获取所有的本地跟踪分支
branches=($(git branch -r | grep -v '\->' | while read remote; do echo ${remote#origin/}; done))

# 遍历每个分支
for branch in "${branches[@]}"; do
  # 切换到该分支
  git checkout $branch || { echo "无法切换到分支: $branch"; continue; }
  
  # 从远程拉取最新代码并强制更新
  git reset --hard origin/$branch
  git clean -fd
  
  # 输出信息
  echo "分支 $branch 已重置为与远程保持一致。"
done

# 返回到最初的分支
git checkout $initial_branch

在运行此脚本之前,请确保了解它的作用,并且备份重要数据,因为这将删除任何未提交的更改,并将本地仓库状态重置为与远程仓库完全一致。此外,如果有未推送的本地分支,这些分支不会被处理,除非它们也在远程存在并且被跟踪。

注意:

  • git reset --hard 会丢弃所有未提交的更改。
  • git clean -fd 会删除所有未跟踪的文件和目录。
  • 这个脚本假设想要同步所有远程分支。如果只想同步特定的分支,可以修改 branches 数组来只包含那些分支名称。

2.改进版:增加了git fetch

在执行 git reset --hard origin/$branch 之前,必须先通过 git fetch 更新远程跟踪分支。否则,reset 操作可能会基于过时的信息进行。

以下是修改后的脚本,添加了 git fetch 命令以确保从远程获取最新的更新:

bash 复制代码
#!/bin/bash

# 获取当前所在的分支
initial_branch=$(git rev-parse --abbrev-ref HEAD)

# 从远程拉取所有最新的信息
git fetch --all

# 获取所有的本地跟踪分支
branches=($(git branch -r | grep -v '\->' | while read remote; do echo ${remote#origin/}; done))

# 遍历每个分支
for branch in "${branches[@]}"; do
  # 切换到该分支
  git checkout $branch || { echo "无法切换到分支: $branch"; continue; }
  
  # 从远程拉取最新代码并强制更新
  git reset --hard origin/$branch
  git clean -fd
  
  # 输出信息
  echo "分支 $branch 已重置为与远程保持一致。"
done

# 返回到最初的分支
git checkout $initial_branch

关键点:

  1. git fetch --all:这个命令会从所有配置的远程仓库中获取最新的数据,包括新的分支、标签和提交。
  2. git reset --hard origin/$branch:这将把当前分支重置到远程分支的状态,丢弃所有本地未提交的更改。
  3. git clean -fd:这将删除所有未跟踪的文件和目录。

注意事项:

  • 数据丢失风险git reset --hardgit clean -fd 是破坏性操作,会删除未提交的更改和未跟踪的文件。在运行此脚本前,请确保不需要这些更改,并且已经备份了重要数据。
  • 网络连接:确保在执行脚本时有稳定的网络连接,以便成功从远程仓库获取数据。

这样,脚本就能确保每个本地分支都与远程仓库保持完全一致。

相关推荐
tingshuo291715 小时前
S001 【模板】从前缀函数到KMP应用 字符串匹配 字符串周期
笔记
洛森唛1 天前
Elasticsearch DSL 查询语法大全:从入门到精通
后端·elasticsearch
闲云一鹤1 天前
Git LFS 扫盲教程 - 你不会还在用 Git 管理大文件吧?
前端·git·前端工程化
Elasticsearch3 天前
如何使用 Agent Builder 排查 Kubernetes Pod 重启和 OOMKilled 事件
elasticsearch
vibecoding日记4 天前
为什么我就想要「线性历史 + Signed Commits」,GitHub 却把我当猴耍 🤬🎙️
git·编程工具
Elasticsearch4 天前
通用表达式语言 ( CEL ): CEL 输入如何改进 Elastic Agent 集成中的数据收集
elasticsearch
程序员小崔日记4 天前
如何将代码轻松上传到 Gitee?Git 使用全攻略!
git·gitee·上传
Bigger5 天前
为什么你的 Git 提交需要签名?—— Git Commit Signing 完全指南
git·开源·github
DianSan_ERP6 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet