当前位置: 首页 > news >正文

Git分支管理完全指南:从创建到合并与冲突解决

目录

1. Git分支基础概念

主分支与子分支

2. 分支查看与切换

查看当前分支

3. 分支创建与管理

本地分支操作

4. 文件提交与分支关系

5. 分支合并策略

本地有分支的情况

本地没有远程分支的情况

6. 分支冲突解决

解决方案

7. Git Stash:临时保存工作现场

8. 最佳实践建议


1. Git分支基础概念

在Git版本控制系统中,分支是开发过程中不可或缺的部分,它允许开发者在不影响主代码的情况下进行功能开发或问题修复。

主分支与子分支

  • ​master分支​​:主分支,通常代表项目的稳定版本
  • ​子分支​​:从主分支或其他分支派生出来的分支,用于特定功能开发或问题修复

2. 分支查看与切换

查看当前分支

# 查看当前所在分支(HEAD指向当前分支)
git log# 另一种查看当前分支的方法
cat .git/HEAD# 查看所有分支
git branch# 查看包括远程分支在内的所有分支
git branch -a

3. 分支创建与管理

本地分支操作

# 创建并切换到新分支
git checkout -b 分支名# 仅创建分支
git branch 分支名# 切换分支
git checkout 分支名# 切换到最近使用的分支
git checkout -# 删除分支(-D强制删除)
git branch -d 分支名

​注意事项​​:

  • 不能删除当前所在的分支
  • 不能删除未合并或已发生变化的分支
  • 创建分支时,子分支会包含主分支当前的所有内容

4. 文件提交与分支关系

文件在不同分支间的可见性规则:

  1. ​未提交的修改​​:所有分支都能看到状态(假象)
  2. ​已提交到特定分支​​:仅在提交的分支上可见
  3. ​暂存区(add)但未提交​​:所有分支都能看到状态
# 将文件添加到暂存区
git add .# 提交到本地仓库
git commit -m '注释'# 推送到远程主分支
git push# 推送到特定远程分支
git push origin 分支名

5. 分支合并策略

本地有分支的情况

# 切换到主分支
git checkout master# 合并指定分支到当前分支
git merge 分支名# 推送到远程仓库
git push

本地没有远程分支的情况

# 拉取远程分支信息
git pull# 在master分支下拉取特定远程分支
git pull origin 分支名# 常规拉取
git pull# 推送主分支
git push origin master

6. 分支冲突解决

当多个分支修改同一文件的不同部分时,合并会产生冲突。

​典型场景​​:

  • dev1修改文件并提交
  • dev2修改同一文件的不同部分并提交
  • 尝试合并这两个分支时出现冲突

解决方案

  1. ​在正确分支上合并并修改​

    • 合并后手动解决冲突(保留正确内容,删除错误内容)
    • 提交修改
    • 删除无用的冲突分支(因其内容已不正确)
  2. ​在错误分支上合并并修改​

    • 合并后手动解决冲突(保留另一分支的正确内容)
    • 提交修改
    • 此时两分支内容将一致

​可视化冲突日志​​:

git log --graph

7. Git Stash:临时保存工作现场

当需要切换分支但当前修改尚未完成时,可以使用stash功能临时保存工作进度。

# 将当前修改存入堆栈
git stash# 包含未跟踪文件
git stash -u# 查看堆栈中的保存项
git stash list# 恢复最近的stash并删除堆栈记录
git stash pop

​特点​​:

  • 使用stash后,git status看不到修改状态
  • 修改内容暂时不可见
  • 可在适当分支上恢复stash内容

8. 最佳实践建议

  1. ​分支命名​​:使用有意义的名称,如feature/login、bugfix/navbar等
  2. ​频繁合并​​:定期将主分支变更合并到开发分支,减少冲突
  3. ​小步提交​​:小而频繁的提交更容易管理和解决冲突
  4. ​清理分支​​:合并后及时删除不再需要的分支
  5. ​使用pull request​​:在团队协作中,通过PR进行代码审查后再合并
http://www.dtcms.com/a/283428.html

相关文章:

  • Java的Gradle项目,使用SLF4J+Log4j2+log4j2.xml
  • 深度隐匿源IP:高防+群联AI云防护防绕过实战
  • C++-linux系统编程 10.内核原理基础
  • 用python程序通过指纹识别开关车门
  • 开源 python 应用 开发(六)网络爬虫
  • 健康生活,从细节开始
  • 线程学习day1---基础知识+pthread_create、self、exit、cancle、join
  • pymongo库:简易方式存取数据
  • Android 15 Settings 搜索框增加暗码功能实现
  • Windows10系统上Node.js的安装及环境配置
  • lua(xlua)基础知识点记录一
  • gem install报错解析
  • 小程序中状态管理Redux
  • ROCK Robotic R3 Pro -替代L2,适配多款无人机,支持机载、手持、车载以及船载
  • DrissionPage:一款让网页自动化更简单的 Python 库
  • 使用defineExpose暴露子组件的属性和方法、页面生命周期onLoad和onReady的使用
  • 【AI论文】可追溯证据增强的视觉基础推理:评估与方法论
  • OSS文件上传解析失败,错误:文件下载失败的排查与解决
  • 61.第二阶段x64游戏实战-抓取Lua分析本地和跨图寻路
  • Harbor 和 Helm
  • 陆面、生态、水文模拟与多源遥感数据同化的实践技术应用
  • ACL实验(思科设备)
  • 游戏开发中防止“范围蔓延”
  • Oracle 数据库常见等待事件参数详解
  • YOLO算法原理
  • 2025年中国品牌全球化发展分析:中国品牌在社交渠道、电商平台及官网流量方面显著增长
  • 测试开发工作日常用的提示词分享
  • 探秘京东外卖幕后:地图轨迹技术探寻
  • Java+Ollama 本地部署 DeepSeek-R1 对话机器人:从 0 到 1 实战指南
  • 动态规划的无后效性与马尔可夫性质相似关系的说明