git 常用操作

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. 可视化工具推荐

如果命令行不熟悉,可以使用:

  1. GitHub Desktop - 简单易用
  2. SourceTree - 功能强大
  3. VS Code Git 插件 - 集成在编辑器中
  4. 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  # 与远程一致

记住 :多仓库操作的关键是保持结构清晰 ,使用脚本自动化 ,遇到问题先备份再操作。

相关推荐
Bigger1 天前
为什么你的 Git 提交需要签名?—— Git Commit Signing 完全指南
git·开源·github
武子康1 天前
大数据-235 离线数仓 - 实战:Flume+HDFS+Hive 搭建 ODS/DWD/DWS/ADS 会员分析链路
大数据·后端·apache hive
DianSan_ERP2 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
够快云库2 天前
能源行业非结构化数据治理实战:从数据沼泽到智能资产
大数据·人工智能·机器学习·企业文件安全
AI周红伟2 天前
周红伟:智能体全栈构建实操:OpenClaw部署+Agent Skills+Seedance+RAG从入门到实战
大数据·人工智能·大模型·智能体
B站计算机毕业设计超人2 天前
计算机毕业设计Django+Vue.js高考推荐系统 高考可视化 大数据毕业设计(源码+LW文档+PPT+详细讲解)
大数据·vue.js·hadoop·django·毕业设计·课程设计·推荐算法
计算机程序猿学长2 天前
大数据毕业设计-基于django的音乐网站数据分析管理系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
大数据·django·课程设计
B站计算机毕业设计超人2 天前
计算机毕业设计Django+Vue.js音乐推荐系统 音乐可视化 大数据毕业设计 (源码+文档+PPT+讲解)
大数据·vue.js·hadoop·python·spark·django·课程设计
十月南城2 天前
数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略
大数据·数据库·数据仓库·hive·hadoop·spark
中烟创新2 天前
灯塔AI智能体获评“2025-2026中国数智科技年度十大创新力产品”
大数据·人工智能·科技