git笔记之重置本地仓库所有分支和远程保持一致、工作区恢复干净,像刚clone下来一样
code review!
文章目录
- git笔记之重置本地仓库所有分支和远程保持一致、工作区恢复干净,像刚clone下来一样
-
- [1.实现该功能的 Bash 脚本示例](#1.实现该功能的 Bash 脚本示例)
- [2.改进版:增加了git fetch](#2.改进版:增加了git fetch)
要让本地仓库的所有分支都重置到与远程完全一致的状态,可以使用以下脚本。这个脚本会执行以下步骤:
- 获取所有本地跟踪的分支。
- 对于每个分支,切换到该分支并从远程拉取最新的更改,强制覆盖本地更改(包括未提交的更改、冲突等)。
- 重置工作目录和索引到最新拉取的状态。
- 清理可能存在的未跟踪文件。
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
关键点:
git fetch --all
:这个命令会从所有配置的远程仓库中获取最新的数据,包括新的分支、标签和提交。git reset --hard origin/$branch
:这将把当前分支重置到远程分支的状态,丢弃所有本地未提交的更改。git clean -fd
:这将删除所有未跟踪的文件和目录。
注意事项:
- 数据丢失风险 :
git reset --hard
和git clean -fd
是破坏性操作,会删除未提交的更改和未跟踪的文件。在运行此脚本前,请确保不需要这些更改,并且已经备份了重要数据。 - 网络连接:确保在执行脚本时有稳定的网络连接,以便成功从远程仓库获取数据。
这样,脚本就能确保每个本地分支都与远程仓库保持完全一致。