目录标题
-
- [一、Git 初始化与基础配置](#一、Git 初始化与基础配置)
- 二、文件操作与提交
- 三、分支管理
- 四、远程仓库操作
- 五、标准工作流程
-
- [Dev → Main 合并流程](#Dev → Main 合并流程)
- 六、问题解决方案
-
- 1、未提交更改时的分支切换
- 2、远程分支关联问题
- 3、受保护分支推送问题
- 4、文件分割提交到不同分支
- 5、基于公共祖先+cherry-pick
- [6、解决 daily 分支上的 cherry-pick 错误](#6、解决 daily 分支上的 cherry-pick 错误)
- [7、Git 提交信息修改指南(本地未推送)](#7、Git 提交信息修改指南(本地未推送))
- 七、完整项目初始化流程
- 八、实用技巧
-
- [1、 查看关联关系](#1、 查看关联关系)
- 2、安全拉取
- [3、Git Cherry-pick 顺序指南](#3、Git Cherry-pick 顺序指南)
一、Git 初始化与基础配置
1、版本与状态检查
# 检查 Git 版本
git --version
# 查看文件状态(简短格式)
git status -s
# 查看提交记录(单行显示)
git log --oneline
2、仓库初始化
# 初始化本地 Git 仓库
git init
# 克隆远程仓库
git clone <远程仓库地址>
# 关联远程仓库
git remote add origin <仓库地址>
二、文件操作与提交
添加与提交文件
# 添加所有文件到暂存区
git add .
# 提交到本地仓库
git commit -m "feat: 添加新功能"
# 提交所有修改(包括已跟踪文件的修改)
git commit -m "fix: 修改功能"
三、分支管理
1、分支查看与切换
# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 查看所有分支(本地+远程)
git branch -a
# 切换分支
git checkout main
# 创建并切换到新分支(创建分支并切换到该分支(只会创建本地分支dev,没有关联远程))
git checkout -b 分支名
# 重命名当前分支
git branch -M main
2、分支关联与同步
# 创建本地分支并关联远程分支
git checkout -b dev origin/dev
# 查看本地与远程分支关联关系
git branch -vv
# 建立本地分支与远程分支的跟踪关联
git branch --set-upstream-to=origin/develop develop
四、远程仓库操作
1、推送代码
# 推送到远程仓库(首次推送设置默认分支)
git push -u origin master
# 推送到指定分支
git push origin main
# 推送本地分支到远程(如:develop分支)
git push origin develop
2、拉取与同步
# 拉取远程仓库更新
git pull origin master
# 获取远程最新分支信息(不合并)
git fetch origin
# 强制拉取并合并(允许不相关历史)
git pull origin develop --allow-unrelated-histories
五、标准工作流程
Dev → Main 合并流程
# 1. 确保本地dev分支是最新代码
git checkout dev
git pull origin dev
# 2. 切换到main分支并合并dev
git checkout main
git merge dev
# 3. 推送合并后的main到远程
git push origin main
# 4. 切换回dev分支继续开发
git checkout dev
六、问题解决方案
1、未提交更改时的分支切换
git中 本地有更改没有提交,不能切换分支吗?(如何解决)
-
方法1:提交修改:如果当前修改已经完成,可以使用 git add 和 git commit 命令将其提交到当前分支,之后工作区变"干净"即可切换分支
-
方法2: 储藏修改(推荐):如果工作尚未完成,不想提交,可以使用 git stash 命令将当前修改临时储藏起来。储藏后工作区会恢复到上一次提交的状态,此时可以切换分支。待切换回原分支后,使用 git stash pop 即可恢复储藏的修改
方法1:提交修改(已完成的工作)
git add .
git commit -m "描述修改内容"方法2:储藏修改(推荐用于未完成的工作)
git stash # 储藏当前修改
git checkout 目标分支... 在其他分支工作
git checkout 原分支
git stash pop # 恢复储藏的修改
2、远程分支关联问题
你在本地合并后无法推送代码到GitLab的main分支,主要是因为该分支被设置为受保护分支,而你的账户权限不足以直接向其推送代码。怎么办?
通过合并请求(推荐):在GitLab界面上(或者其他代码管理库),从你的特性分支向main分支发起合并请求。由具备Maintainer或Owner角色的人员审查并通过你的合并请求。
# 当远程分支存在但本地无法关联时:
# 1. 获取远程最新分支信息
git fetch origin
# 2. 创建本地分支并关联远程
git checkout -b main origin/main
# 3. 或者为现有分支建立关联(将本地 develop 分支与远程分支 origin/develop 建立跟踪关联(upstream tracking)(当存在本地分支))
git branch --set-upstream-to=origin/develop develop
3、受保护分支推送问题
# 当没有权限直接推送到受保护分支(如main)时:
# 1. 推送到特性分支
git push origin feature-branch
# 2. 在GitLab/GitHub上创建合并请求(Merge Request)
# 3. 等待有权限的维护者审查并合并
4、文件分割提交到不同分支
如果本地修改了很多文件,部分文件上传dev分支,部分文件上传daily分支,并且daily分支是基于dev分支的(需要创建的),那么命令行操作如下:
# 假设已修改文件:
# - base1.js, base2.css (基础修改,属于活动a)
# - daily1.js, daily2.css (daily特有,属于活动b)
# 1. 确认当前在dev分支
git checkout dev
git pull origin dev
# 2. 查看所有修改
git status
# 3. 提交基础文件到dev分支
git add base1.js base2.css
git commit -m "feat(a): 更新基础页面到dev"
git push origin dev
# 4. 创建或切换到daily分支
git checkout -b daily # 如果不存在
# 或 git checkout daily # 如果已存在
# 5. 确保daily分支基于最新dev
git merge dev # 如果daily已存在,合并最新dev
# 6. 提交daily专属文件
git add daily1.js daily2.css
git commit -m "feat(b): 添加daily专属功能"
git push origin daily
5、基于公共祖先+cherry-pick
关于git操作,目前gitlab有2个分支, dev分支(以前代码+活动a) daily(以前代码+活动a+活动b),现在想要创建一个分支要求(以前代码 + 活动b) 。
1、找到"以前代码"的基准点
(需要找到活动a开始之前的最后一个提交。)
git log --oneline dev --decorate
示例:
e4f5g6h (HEAD -> dev) feat: 添加活动A功能
m1n2o3p chore: 初始化项目
这里m1n2o3p就是我们要找的"以前代码"。
2、创建基于"以前代码"的新分支
# 1. 切换到基础提交
git checkout m1n2o3p
# 2. 创建并切换到新分支
git checkout -b feature-b-only
# 或者一步完成
git checkout -b feature-b-only m1n2o3p
验证
# 查看当前分支
git branch
# 输出:* feature-b-only
# 查看提交历史
git log --oneline -3
# 输出应该只显示到基础代码,没有活动a或活动b
3、找出活动b的所有提交
现在我们需要找到daily分支上有但dev分支上没有的提交。
# 直接比较两个分支
git log --oneline daily ^dev
# ^dev 表示"在daily分支上但不在dev分支上"的提交
示例输出:这些就是活动b的所有提交。
> a1b2c3d feat: 添加活动B功能
> b2c3d4e fix: 修复活动B的bug
4、提取活动b的提交信息(可选)
# 1. 将活动b的提交哈希保存到文件
git log --reverse --format="%H" daily ^dev > activity_b_commits.txt
# 2. 查看文件内容
cat activity_b_commits.txt
# 输出类似:
# b2c3d4e
# a1b2c3d
# 注意:--reverse 确保按时间顺序排列(从旧到新)
# 这对cherry-pick很重要!
5、执行cherry-pick(逐个cherry-pick(推荐,便于处理冲突))
# 1. 确保在新分支上
git checkout feature-b-only
# 2. 按时间顺序cherry-pick(从旧到新)
# 假设活动b有两个提交:b2c3d4e(旧)和 a1b2c3d(新)
git cherry-pick b2c3d4e
# 如果没有冲突,会自动提交
# 如果有冲突,继续看下面的"处理冲突"部分
git cherry-pick a1b2c3d
6、处理cherry-pick过程中的冲突
# 执行cherry-pick后如果有冲突会显示:
# Auto-merging some_file.js
# CONFLICT (content): Merge conflict in some_file.js
# error: could not apply jkl012... feat: 活动B-1
# hint: After resolving the conflicts, mark them with
# hint: "git add/rm <pathspec>", then run
# hint: "git cherry-pick --continue".
# hint: You can instead skip this commit with "git cherry-pick --skip".
# hint: To abort and get back to the state before "git cherry-pick",
# hint: run "git cherry-pick --abort".
查看冲突状态
git status
# 输出会显示:
# Unmerged paths:
# (use "git add <file>..." to mark resolution)
# both modified: some_file.js
# 方法1:手动编辑冲突文件
# 打开有冲突的文件,会看到类似:
<<<<<<< HEAD
当前分支的代码(来自基础代码)
=======
要cherry-pick的代码(来自活动b)
>>>>>>> feat: 活动B-1
# 你需要:
# 1. 删除 <<<<<<< HEAD, =======, >>>>>>> 这些标记
# 2. 保留正确的代码(应该是活动b的修改)
# 3. 保存文件
# 1. 添加解决后的文件
git add some_file.js
# 2. 继续cherry-pick
git cherry-pick --continue
# 3. 如果需要写提交信息,会打开编辑器
# 可以保留默认信息,保存退出
验证
# 查看提交历史
git log --oneline -10
# 应该显示:基础代码 + 活动b的提交
6、解决 daily 分支上的 cherry-pick 错误
上述如果弄错分支了,在daily分支上进行了,然后,并且本地分支变成了 (daily|CHERRY-PICKING),然后有好几个文件被改动了。
# 1. 中止当前的 cherry-pick
git cherry-pick --abort
# 2. 验证状态已恢复
git status
# 应该显示 "On branch daily" 和干净的工作区
# 3. 查看分支状态
git branch
# 应该只显示 daily 分支(没有 CHERRY-PICKING 标记)
7、Git 提交信息修改指南(本地未推送)
本地 git commit 时候 提示信息写错了,如何撤回 ,注意要安全操作,本地修改还没有上传远程。
# 修改最近一次提交的信息
git commit --amend
# 这会打开编辑器(如vim),你可以修改提交信息
# 保存退出后,提交信息就被修改了
# 或者直接指定新信息(不打开编辑器)
git commit --amend -m "新的提交信息"
七、完整项目初始化流程
# 1. 初始化本地仓库
git init
# 2. 关联远程仓库
git remote add origin <你的GitLab仓库地址>
# 3. 创建并切换到开发分支
git checkout -b develop
# 4. 添加所有文件(排除.gitignore中指定的文件)
git add .
# 5. 初始提交
git commit -m "初始项目提交"
# 6. 拉取远程分支(如存在)并合并
# 从远程仓库的origin别名下的develop分支获取最新的提交历史记录,但不合并到当前分支
git fetch origin develop
# 拉取远程develop分支的内容,并与当前分支合并;如果两个分支的历史记录不相关,则使用--allow-unrelated-histories选项允许合并
git pull origin develop --allow-unrelated-histories
# 7. 推送到远程develop分支
git push origin develop
八、实用技巧
1、 查看关联关系
# 查看所有分支及其追踪的远程分支
git branch -vv
2、安全拉取
# 先获取更新信息,再决定是否合并
git fetch origin
git log origin/develop # 查看远程更新内容
git merge origin/develop # 确认后合并
3、Git Cherry-pick 顺序指南
cherry-pick的顺序至关重要!必须按提交的时间顺序进行(从旧到新)。
为什么顺序重要?
依赖关系:后续提交可能依赖于前面提交的代码修改
冲突减少:按顺序cherry-pick可以最大程度减少冲突
逻辑正确性:确保代码修改以正确的顺序应用
使用 --reverse 参数(推荐)
# 查看daily分支有但dev分支没有的提交,按从旧到新排序
git log --reverse --oneline daily ^dev
# 输出示例:
# abc123 feat: 活动b-第一个功能
# def456 feat: 活动b-第二个功能
# ghi789 fix: 活动b-修复bug
# 顺序:abc123 → def456 → ghi789
如果顺序错了怎么办?
# 如果发现顺序错了,需要重置
git cherry-pick --abort
# 重置分支到开始状态
git reset --hard 基础提交哈希
# 重新按正确顺序cherry-pick
记住这个黄金法则:cherry-pick的顺序 = 提交产生的顺序 = 时间从旧到新
使用提示:
- 在执行重要操作前,建议先使用
git status确认当前状态 - 推送代码前,先拉取最新代码避免冲突
- 定期使用
git log --oneline查看提交历史,保持清晰的提交记录
这个指南涵盖了从基础配置到高级操作的完整Git工作流程,帮助您更高效地进行版本控制管理。