1. 首先判断项目结构
情况1:单一仓库,多模块(Monorepo)
project/
├── app/ # 主模块
├── library1/ # 子模块
├── library2/ # 子模块
└── build.gradle # 统一构建
操作:在根目录操作即可,Git 会自动管理所有子文件夹。
情况2:多个独立仓库
project/
├── app/ # 独立 Git 仓库
├── sdk/ # 独立 Git 仓库
└── docs/ # 独立 Git 仓库
操作:需要分别进入每个文件夹操作。
2. 快速判断方法
bash
# 在项目根目录查看
ls -la
# 如果有 .git 文件夹,是单一仓库
# 如果每个子文件夹都有 .git,是多仓库
# 或者使用 git 命令
cd project
git status # 如果成功,是单一仓库
cd project/app
git status # 如果成功,说明 app 是独立仓库
3. 切换分支的完整流程
对于单一仓库:
bash
# 1. 进入项目根目录
cd /path/to/project
# 2. 查看当前分支
git branch # 查看本地分支
git branch -r # 查看远程分支
git branch -a # 查看所有分支
# 3. 切换分支
git checkout develop # 切换到已存在的分支
git checkout -b feature/new-branch # 创建并切换到新分支
# 4. 拉取最新代码
git pull origin develop
# 5. 查看状态确认
git status
对于多仓库:
bash
# 方法1:手动逐个切换
cd app && git checkout develop && git pull
cd ../sdk && git checkout develop && git pull
cd ../docs && git checkout develop && git pull
# 方法2:使用脚本(推荐)
#!/bin/bash
# switch_all_branches.sh
for dir in app sdk docs; do
echo "=== 切换到 $dir ==="
cd $dir
git checkout develop
git pull origin develop
cd ..
echo ""
done
4. 实用的 Git 操作命令
查看状态和日志:
bash
# 查看状态(最重要)
git status
# 查看提交历史
git log --oneline -10 # 最近10条
git log --graph --all # 图形化查看
# 查看文件变化
git diff # 未暂存的修改
git diff --staged # 已暂存的修改
分支操作:
bash
# 查看分支
git branch # 本地分支
git branch -a # 所有分支(包括远程)
# 创建分支
git branch feature/xxx # 创建分支
git checkout feature/xxx # 切换到分支
# 或一步完成
git checkout -b feature/xxx
# 删除分支
git branch -d feature/xxx # 删除本地分支
git push origin --delete feature/xxx # 删除远程分支
提交代码:
bash
# 三步提交法
git add . # 添加所有修改
git add file1 file2 # 添加指定文件
git commit -m "描述" # 提交到本地
git push origin branch-name # 推送到远程
5. 多仓库管理工具
使用 Git Submodule(子模块):
bash
# 添加子模块
git submodule add https://github.com/user/repo.git path/to/folder
# 克隆包含子模块的项目
git clone --recursive https://github.com/user/main-repo.git
# 或克隆后初始化
git clone https://github.com/user/main-repo.git
cd main-repo
git submodule init
git submodule update
# 更新所有子模块
git submodule foreach git pull
使用脚本批量操作:
bash
# 批量切换分支脚本:switch_all.sh
#!/bin/bash
TARGET_BRANCH=$1 # 传参:要切换的分支名
echo "开始批量切换分支到: $TARGET_BRANCH"
echo "=================================="
REPOS=("app" "sdk" "docs" "module1" "module2")
for repo in "${REPOS[@]}"; do
if [ -d "$repo" ]; then
echo ""
echo "处理仓库: $repo"
echo "----------------"
cd "$repo" || continue
# 检查分支是否存在
if git rev-parse --verify "$TARGET_BRANCH" >/dev/null 2>&1; then
echo "切换到分支: $TARGET_BRANCH"
git checkout "$TARGET_BRANCH"
git pull origin "$TARGET_BRANCH"
else
echo "分支 $TARGET_BRANCH 不存在,检查远程..."
if git ls-remote --exit-code --heads origin "$TARGET_BRANCH" >/dev/null 2>&1; then
echo "从远程拉取分支: $TARGET_BRANCH"
git fetch origin "$TARGET_BRANCH"
git checkout -b "$TARGET_BRANCH" "origin/$TARGET_BRANCH"
else
echo "警告:分支 $TARGET_BRANCH 在远程也不存在"
CURRENT_BRANCH=$(git branch --show-current)
echo "当前分支: $CURRENT_BRANCH"
fi
fi
cd ..
else
echo "警告:目录 $repo 不存在"
fi
done
echo ""
echo "=================================="
echo "批量切换完成"
使用方式:
bash
chmod +x switch_all.sh
./switch_all.sh develop # 切换到 develop 分支
./switch_all.sh main # 切换到 main 分支
./switch_all.sh feature/xxx # 切换到 feature 分支
6. 常见问题解决方案
问题1:切换分支时有未提交的修改
bash
# 方法1:暂存修改
git stash # 保存修改
git checkout other-branch # 切换分支
git stash pop # 恢复修改
# 方法2:强制切换(会丢失未提交的修改)
git checkout -f other-branch
# 方法3:提交当前修改
git add .
git commit -m "临时提交"
git checkout other-branch
问题2:远程分支已删除,本地还在
bash
# 查看所有分支(包括远程已删除的)
git branch -a
# 清理本地缓存的远程分支
git fetch --prune
# 或
git remote prune origin
问题3:冲突解决
bash
# 切换分支前先更新当前分支
git pull origin current-branch
# 如果出现冲突
git status # 查看冲突文件
# 手动解决冲突后
git add .
git commit -m "解决冲突"
7. 工作流建议
每日工作流程:
bash
# 1. 拉取最新代码
git pull origin develop
# 2. 创建功能分支
git checkout -b feature/your-feature
# 3. 开发、提交
git add .
git commit -m "feat: 添加功能"
# 4. 推送到远程
git push origin feature/your-feature
# 5. 创建 Pull Request/Merge Request
多仓库同步流程:
bash
# 创建同步脚本:sync_all.sh
#!/bin/bash
echo "开始同步所有仓库..."
for dir in */; do
if [ -d "$dir/.git" ]; then
echo "同步: $dir"
cd "$dir"
# 获取当前分支
CURRENT_BRANCH=$(git branch --show-current)
echo " 当前分支: $CURRENT_BRANCH"
# 拉取最新
git pull origin "$CURRENT_BRANCH"
# 如果有未提交的修改,暂存
if ! git diff --quiet; then
echo " 有未提交修改,正在暂存..."
git stash
git pull origin "$CURRENT_BRANCH"
git stash pop
fi
cd ..
echo ""
fi
done
echo "同步完成"
8. 实用别名设置(.gitconfig)
在 ~/.gitconfig 中添加:
ini
[alias]
# 查看状态
st = status
ls = log --oneline -20
graph = log --graph --all --oneline
# 分支操作
br = branch
co = checkout
cob = checkout -b
# 清理
cleanup = "!git fetch --prune && git branch --merged | grep -v '\\*\\|main\\|develop' | xargs -n 1 git branch -d"
# 多仓库操作
all = "!f() { for dir in */; do if [ -d \"$dir/.git\" ]; then echo \"=== $dir ===\"; cd \"$dir\" && git $@; cd ..; fi; done; }; f"
使用别名:
bash
git st # 代替 git status
git co develop # 代替 git checkout develop
git all status # 查看所有仓库状态
git all pull # 所有仓库拉取更新
9. 可视化工具推荐
如果命令行不熟悉,可以使用:
- GitHub Desktop - 简单易用
- SourceTree - 功能强大
- VS Code Git 插件 - 集成在编辑器中
- GitKraken - 专业版功能多
10. 紧急情况处理
如果操作混乱了:
bash
# 1. 先保存当前状态
git stash save "紧急备份"
# 2. 回到安全点
git checkout develop
git pull origin develop
# 3. 重新开始
git checkout -b feature/new-start
# 4. 如果需要之前的修改
git stash list # 查看暂存列表
git stash apply stash@{0} # 应用最新的暂存
如果需要重置:
bash
# 软重置(保留修改)
git reset --soft HEAD~1
# 硬重置(彻底删除)
git reset --hard HEAD~1
git reset --hard origin/develop # 与远程一致
记住 :多仓库操作的关键是保持结构清晰 ,使用脚本自动化 ,遇到问题先备份再操作。