Android -Git实战技术总结

一、git Merge和Rebase的项目使用

1.Merge

创建一个新的「合并提交」(Merge Commit),同时保留两个分支的历史路径。父提交指向两个分支的最新提交,形成一个树形结构。

复制代码
git checkout main      # 切换到目标分支
git merge feature      # 合并 feature 分支到 main

Merge 通过创建一个新的「合并提交」(Merge Commit)来整合分支,这个提交同时指向两个分支的最新提交,形成树形结构,完整保留分支的创建和合并历史。

其优点是操作简单、适合团队协作,能清晰展示分支演变过程;缺点是可能使提交历史变得复杂。

例如,将 feature 分支合并到 main 分支后,会保留两条分支路径及合并节点。Merge 适用于需要保留完整时间线的场景,如多人并行开发时快速集成代码。

2.Rebase

将当前分支的提交「复制」到目标分支的末尾,形成一条线性的提交历史。原始提交会被丢弃,生成新的提交对象(哈希值改变)。

复制代码
git checkout feature   # 切换到待变基的分支
git rebase main        # 将 feature 分支的提交移到 main 分支末尾

Rebase 则是将当前分支的提交「复制」到目标分支的末尾,通过丢弃原始提交并生成新的提交对象,形成一条线性的提交历史。

这种方式使提交记录更简洁,适合个人在推送到远程前整理本地分支,但需注意避免对已共享的远程分支执行 rebase,以免导致团队协作冲突。

例如,将 feature 分支变基到 main 分支后,历史记录会变成一条直线,隐藏分支分叉的过程。Rebase 的优势在于生成清晰的线性历史,便于快速浏览和理解代码演进,但其本质是「历史重写」,操作时需格外谨慎。

3.Merge和Rebase 混合开发

概述:用 Rebase 让过程变得整洁,用 Merge 记录最终结果。

个人本地分支(Feature Branch):你在自己的电脑上为开发某个新功能而创建的分支。

团队公共分支(Public Branch) :团队成员共享的分支,通常是 maindeveloprelease 分支。

分支的注意事项

严禁对任何已推送到远程并被多人使用的公共分支(如 main, develop)执行 rebase 操作。

这是混合策略的基石。因为 rebase 会重写提交历史,如果你对一个别人已经拉取并在此基础上开发的分支执行 rebase,会造成所有人的历史记录与远程库产生严重分歧,导致巨大的协作混乱。

第 1 步:本地开发------使用 Rebase 保持分支"新鲜"

场景 :你从 main 分支切出了一个 feature/user-profile 分支进行开发。在你开发期间,其他同事完成了他们的任务并将代码合并到了 main 分支。此时,你的 feature 分支已经落后于最新的 main 分支了。

目标 :将 main 分支的最新更新同步到你的 feature 分支,以便:

  1. 尽早解决可能出现的代码冲突。

  2. 让你的分支历史保持线性,看起来像是"基于最新代码"开发的。

操作 :在你的 feature/user-profile 分支上,执行 rebase

复制代码
# 1. 确保你的本地 main 分支是最新的
git checkout main
git pull origin main

# 2. 切换回你的功能分支
git checkout feature/user-profile

# 3. 将你的分支变基到最新的 main 分支上
git rebase main

或者,更简洁的方式是:

复制代码
git fetch origin # 获取远程所有更新
git rebase origin/main # 直接以远程的 main 分支为基底进行 rebase

效果 : 这个 rebase 操作会把你 feature/user-profile 分支上的所有提交,像"拔起树苗再栽种"一样,整体移动到 main 分支的最新提交之后。 你的提交历史会变成一条干净的直线,没有不必要的合并记录。如果在 rebase 过程中出现冲突,Git 会让你逐个解决,解决完一个提交的冲突后再继续下一个,这个过程更具条理性。


第 2 步:功能完成------使用 Merge 集成到公共分支

场景 :你的 feature/user-profile 功能已经开发、测试完毕,并且已经通过 rebase 与最新的 main 分支保持同步。现在,你准备将它正式集成到 main 分支中。

目标 :在 main 分支上清晰地记录"user-profile 功能在此刻被集成"这一重要事件,并保留整个 feature 分支的开发脉络。

操作 :切换到 main 分支,执行 merge

复制代码
# 1. 切换到目标公共分支
git checkout main

# 2. 拉取最新代码,以防万一
git pull origin main

# 3. 合并你的功能分支 (强烈推荐使用 --no-ff)
git merge --no-ff feature/user-profile

--no-ff 的重要性

  • --no-ff (No Fast-forward) 参数会强制 Git 创建一个新的合并提交 (Merge Commit),即使在可以"快进合并"的情况下也是如此。

  • 这个合并提交非常重要,它像一个里程碑,明确地标记了一个完整功能的汇入点 。从 main 分支的历史记录上看,你能清楚地看到一个功能从分叉到最终合并的完整生命周期。

  • 这极大地增强了历史的可读性,并且如果未来需要回滚整个功能,只需要 revert 这一个合并提交即可,操作非常安全便捷。

策略总结

场景 使用的命令 目的
个人工作时,同步公共分支的最新进展 git rebase <公共分支> 保持个人分支历史的线性、整洁,避免不必要的合并提交,方便自己回顾。
功能完成后,将个人分支集成到公共分支 git merge --no-ff <个人分支> 在公共分支上保留功能的完整上下文,生成一个明确的合并节点,便于团队协作、代码审查和历史追溯。
  • Rebase :好比你在写自己的章节(feature 分支)时,发现主编更新了大纲(main 分支)。你不会直接把大纲合并进来弄乱你的草稿,而是会通读你的章节,然后根据新大纲的精神,重写和调整你的内容,让它完美地衔接在最新大纲之后。你的写作过程(提交历史)看起来会非常流畅。

  • Merge (--no-ff) :好比你最终完成了章节。编辑会正式地将你的章节作为一个独立的单元合并到全书的手稿中,并做一条批注:"此处加入第三章《用户个人资料》"。这个批注就是一个合并提交,它清晰地记录了你的工作成果被接纳的这个事件。

二、Git常用的命令

复制代码
git branch:列出本地所有分支。
git branch feature-new 建立"feature-new"这个分支
git branch -d feature-new 删除"feature-new"这个分支
git checkout:分支切换
git checkout feature-new 切换到 feature-new 分支
git checkout -b bugfix 创建并切换到 bugfix 分支
    当你执行 git checkout 命令切换分支时,Git 会更新 HEAD 引用,使其指向新的分支。HEAD 引用存储在 .git/HEAD 文件中,它通常指向当前分支的引用文件。

//远程仓库与本地仓库的交互
git fetch:从远程仓库获取最新的对象和引用,但不会合并到本地分支。
git pull:相当于 git fetch 和 git merge 的组合,会将远程分支的更新合并到本地分支。
git push:将本地分支的提交推送到远程仓库。
git clone:版本克隆
例如:git clone https://github.com/username/example-repo.git

复制代码
git init: 在本地目录创建一个新的 Git 仓库
提交流程
git add <文件地址> 添加指定文件
git add . :添加所有文件到缓存区
git status:查看缓存区文件
git commit:提交文件
git commit -m "":提交文件并且赋予提醒文本
git commit --amend:对上一次提交进行修改,可用于补充遗漏的文件或者修改提交信息。

复制代码
git remote add <远程仓库名> <仓库地址>:将本地仓库与远程仓库关联。
git push <远程仓库名> <分支名>:把本地分支的修改推送到远程仓库。
将本地的 main 分支推送到 origin 远程仓库:git push origin main
git pull <远程仓库名> <分支名>:从远程仓库拉取指定分支的修改并合并到本地分支。
拉取 origin 远程仓库的 main 分支更新:git pull origin main
git fetch <远程仓库名>:从远程仓库获取最新的分支和提交信息,但不进行合并。

git status:查看当前仓库的状态,包括文件的修改、添加和删除情况。
git log:查看提交历史记录。
git diff:查看工作区与暂存区文件的差异。若要查看暂存区与上一次提交的差异,
可使用 git diff --staged。

三、实战场景

Git 使用场景模块(实战应用指南)

场景 1:日常开发工作流
复制代码
# 开始新功能开发
git checkout -b feature/new-payment-gateway  # 创建并切换到新分支
# 编写代码...
git add .  # 添加所有修改
git commit -m "集成支付宝支付接口"

# 同步远程更新
git fetch origin  # 获取远程最新状态
git rebase origin/main  # 变基到最新main分支

# 推送功能分支
git push -u origin feature/new-payment-gateway
场景 2:紧急修复线上 Bug
复制代码
# 创建热修复分支
git checkout -b hotfix/login-error main

# 紧急修复代码...
git add src/login.js
git commit -m "修复登录页面空指针异常"

# 测试通过后合并到主分支
git checkout main
git merge hotfix/login-error
git push origin main

# 同步到开发分支
git checkout develop
git merge main
场景 3:团队协作开发
复制代码
# 获取同事的最新提交
git fetch --all  # 获取所有远程分支更新
git checkout feature/search-optimization
git pull origin feature/search-optimization  # 拉取同事的提交

# 解决合并冲突
# 在IDE中解决冲突文件...
git add .
git commit -m "合并同事的搜索优化代码"

# 提交合并结果
git push origin feature/search-optimization
场景 4:版本发布与标签管理
复制代码
# 准备发布版本
git checkout release/v1.2.0
git merge --no-ff develop  # 非快进合并

# 创建发布标签
git tag -a v1.2.0 -m "正式发布版本1.2.0"
git push origin v1.2.0

# 合并回主分支
git checkout main
git merge release/v1.2.0
场景 5:代码审查与历史追溯
复制代码
# 查看提交历史(图形化)
git log --graph --oneline --all

# 查看文件修改历史
git blame src/utils.js  # 逐行查看作者

# 比较分支差异
git diff feature/new-ui..main  # 比较特性分支与主分支

# 撤销本地修改
git checkout -- config.yml  # 丢弃未暂存修改
场景 6:复杂合并与重置
复制代码
# 交互式变基(整理提交历史)
git rebase -i HEAD~5  # 修改最近5次提交

# 重置错误提交
git reset --soft HEAD~1  # 撤销提交但保留修改

# 恢复误删分支
git reflog  # 查找删除前的commit ID
git checkout -b recovered-branch <commit-id>