25.3.7#Git命令#merge和rebase的区别

1 Git命令大全

sh 复制代码
git init                                                  # 初始化本地git仓库(创建新仓库)
git config --global user.name "xxx"                       # 配置全局用户名
git config --global user.email "xxx@xxx.com"              # 配置全局邮箱
git config --global color.ui true                         # 配置git命令行界面颜色为开启
git config --global color.status auto
git config --global color.diff auto
git config --global color.branch auto
git config --global color.interactive auto                # 配置不同命令的颜色显示为自动
git config --global --unset http.proxy                    # 取消全局http代理配置
git clone git+ssh://git@192.168.53.168/VT.git             # 克隆远程仓库到本地
git status                                                # 查看当前仓库的状态
git add xyz                                               # 将xyz文件添加到暂存区
git add .                                                 # 将当前目录下的所有文件添加到暂存区
git commit -m 'xxx'                                       # 提交暂存区到仓库,并附上提交信息'xxx'
git commit --amend -m 'xxx'                               # 修改最后一次提交,合并新的更改和提交信息
git commit -am 'xxx'                                      # 将添加到暂存区和提交合并为一步,需要文件已跟踪
git rm xxx                                                # 删除文件xxx并从暂存区移除
git rm -r *                                               # 递归删除当前目录下的所有文件并从暂存区移除
git log                                                   # 显示提交历史
git log -1                                                # 显示最近1次提交的历史
git log -5                                                # 显示最近5次提交的历史
git log --stat                                            # 显示提交历史和每次提交的文件更改统计
git log -p -m                                             # 显示提交历史,包括差异对比和合并信息
git show dfb02e6e4f2f7b573337763e5c0013802e392818         # 显示指定提交的详细信息和更改内容
git show dfb02                                            # 显示提交ID以dfb02开头的提交的详细信息和更改内容
git show HEAD                                             # 显示最新提交的详细信息和更改内容
git show HEAD^                                            # 显示最新提交的父提交的详细信息和更改内容
git tag                                                   # 列出所有标签
git tag -a v2.0 -m 'xxx'                                  # 创建带有注释的标签v2.0,并附上说明'xxx'
git show v2.0                                             # 显示标签v2.0对应的提交的详细信息和更改内容
git log v2.0                                              # 显示标签v2.0对应的提交历史
git diff                                                  # 显示工作区与暂存区的差异
git diff --cached                                         # 显示暂存区与最新提交的差异
git diff HEAD^                                            # 显示工作区与上一个版本的差异
git diff HEAD -- ./lib                                    # 显示工作区lib目录与最新提交的差异
git diff origin/master..master                            # 显示远程分支master与本地分支master的差异
git diff origin/master..master --stat                     # 显示远程分支master与本地分支master的差异,仅列出文件
git remote add origin git+ssh://git@192.168.53.168/VT.git # 添加远程仓库地址,命名为origin
git branch                                                # 列出所有本地分支
git branch --contains 50089                               # 列出包含提交ID 50089的所有分支
git branch -a                                             # 列出所有本地和远程分支
git branch -r                                             # 列出所有远程分支
git branch --merged                                       # 列出所有已合并到当前分支的分支
git branch --no-merged                                    # 列出所有未合并到当前分支的分支
git branch -m master master_copy                          # 将本地分支master重命名为master_copy
git checkout -b master_copy                               # 创建并切换到新分支master_copy
git checkout -b master master_copy                        # 创建新分支master并切换,基于master_copy
git checkout features/performance                         # 切换到已存在的分支features/performance
git checkout --track hotfixes/BJVEP933                    # 创建并切换到跟踪远程分支hotfixes/BJVEP933的本地分支
git checkout v2.0                                         # 切换到标签v2.0对应的提交
git checkout -b devel origin/develop                      # 创建并切换到新分支devel,基于远程分支develop
git checkout -- README                                    # 恢复README文件到最新提交的状态
git merge origin/master                                   # 将远程分支master合并到当前分支
git cherry-pick ff44785404a8e                             # 将提交ff44785404a8e的更改应用到当前分支
git push origin master                                    # 将当前分支推送到远程仓库的master分支
git push origin :hotfixes/BJVEP933                        # 删除远程仓库的hotfixes/BJVEP933分支
git push --tags                                           # 将所有标签推送到远程仓库
git fetch                                                 # 从远程仓库获取更新(不会合并到当前分支)
git fetch --prune                                         # 获取更新并删除远程仓库中已不存在的分支
git pull origin master                                    # 从远程仓库获取更新并合并到当前分支
git mv README README2                                     # 重命名文件README为README2
git reset --hard HEAD                                     # 将当前分支重置为最新提交的状态,丢弃所有未提交的更改
git rebase                                                # 变基操作,将当前分支的提交变基到上游分支上
git branch -d hotfixes/BJVEP933                           # 删除已合并的分支hotfixes/BJVEP933
git branch -D hotfixes/BJVEP933                           # 强制删除分支hotfixes/BJVEP933,即使未合并
git ls-files                                              # 列出被git跟踪的所有文件
git show-branch                                           # 显示当前分支的历史
git show-branch --all                                     # 显示所有分支的历史
git whatchanged                                           # 显示文件更改历史
git revert dfb02e6e4f2f7b573337763e5c0013802e392818       # 撤销指定提交的更改
git ls-tree HEAD                                          # 以树状形式显示最新提交的内容
git rev-parse v2.0                                        # 显示标签v2.0对应的提交ID
git reflog                                                # 显示引用日志,包括所有提交和引用变更
git show HEAD@{5}                                         # 显示HEAD的第五个历史状态
git show master@{yesterday}                               # 显示master分支昨天的状态
git log --pretty=format:'%h %s' --graph                   # 以图形方式显示提交历史,自定义格式
git show HEAD~3                                           # 显示HEAD的第三个父提交
git show -s --pretty=raw 2be7fcb476                       # 显示提交ID为2be7fcb476的提交信息,原始格式
git stash                                                 # 将当前更改保存到栈上,恢复到干净状态
git stash list                                            # 列出所有保存的更改栈
git stash show -p stash@{0}                               # 显示第一个保存的更改栈的详细差异
git stash apply stash@{0}                                 # 应用第一个保存的更改栈
git grep "delete from"                                    # 在文件中搜索包含"delete from"的行
git grep -e '#define' --and -e SORT_DIRENT                # 搜索同时包含"#define"和"SORT_DIRENT"的行
git gc                                                    # 执行垃圾回收,清理仓库
git fsck                                                  # 检查仓库完整性

2 rebase与merge的区别

在 Java 开发中,git mergegit rebase 是整合分支的两种核心操作,但它们的实现方式和适用场景有显著差异。以下是详细对比和使用场景分析:


1. 核心区别

特性 git merge git rebase
提交历史 保留分支的拓扑结构,生成合并提交 重写提交历史,形成线性结构
冲突处理 一次性解决所有冲突 可能在每个提交中逐个解决冲突
历史记录清晰度 可能产生复杂的分叉历史 生成线性历史,更易追踪
适用分支 公共分支(如 maindev 私有分支(如本地特性分支)
风险 低(不修改历史) 高(重写历史,需谨慎操作)

2. 工作原理

git merge
  • 操作方式 :合并两个分支的最新状态,生成一个新的 合并提交(Merge Commit)。

  • 示例 :将 feature 分支合并到 main 分支:

    bash

    复制

    git checkout main
    git merge feature
    
  • 结果main 分支的历史中会新增一个合并节点,明确记录分支的合并关系。

git rebase
  • 操作方式 :将当前分支的提交"嫁接"到目标分支的最新提交之后,重写提交历史

  • 示例 :在 feature 分支上执行:

    bash

    复制

    git checkout feature
    git rebase main
    
  • 结果feature 分支的提交会基于 main 分支的最新提交重新排列,形成线性历史。


3. 使用场景

适合 git merge 的场景
  1. 公共分支合并
    • 例如将 feature 分支合并到 maindev 分支时,保留合并记录有助于团队协作和历史追溯。
    • Java 示例:多人协作开发时,合并不同开发者提交的模块代码。
  2. 需要明确分支关系
    • 当分支的合并过程需要明确记录(如解决复杂冲突后的代码整合)。
  3. 避免历史重写风险
    • 公共分支已推送到远程仓库时,禁止使用 rebase,避免破坏他人工作。
适合 git rebase 的场景
  1. 个人特性分支更新
    • 在本地开发时,定期将 main 分支的更新同步到自己的 feature 分支,保持线性提交。
    • Java 示例 :开发新功能时,每天从 main 分支拉取最新代码,避免最终合并冲突。
  2. 清理提交历史
    • 合并多个临时提交为一个有意义的提交(结合 git rebase -i),提高代码可读性。
    • 示例:将多个 "WIP"(Work in Progress)提交整理为清晰的逻辑单元。
  3. 准备 Pull Request
    • 在向团队提交代码前,通过 rebase 确保代码基于最新主分支,简化评审过程。

4. 最佳实践

  1. 公共分支用 merge,私有分支用 rebase
    • 公共分支 (如 maindev):始终使用 merge,保留完整历史。
    • 私有分支 (如 feature/xxx):开发过程中使用 rebase 保持与主分支同步。
  2. 避免已推送分支的 rebase
    • 如果分支已推送到远程仓库,强制推送(git push -f)会导致协作混乱。
  3. 结合 git pull --rebase
    • 更新本地分支时使用 git pull --rebase 代替默认的 merge,避免冗余合并提交。

5. 操作流程图

plaintext

复制

# 典型工作流示例
1. 基于 main 创建特性分支:
   git checkout -b feature/login

2. 开发过程中定期同步 main 分支:
   git fetch origin
   git rebase origin/main

3. 开发完成后整理提交历史:
   git rebase -i HEAD~5  # 合并最近5个提交

4. 合并到 main 分支:
   git checkout main
   git merge feature/login

总结

  • git merge:适合保留分支合并历史,协作友好,操作安全。
  • git rebase:适合优化提交历史,保持线性结构,但需谨慎处理已推送分支。

在 Java 项目中,合理选择两种操作可以显著提升代码库的可维护性。例如,在团队协作中频繁使用 merge 确保历史透明,而在个人开发周期内用 rebase 保持代码整洁。

相关推荐
邵奈一40 分钟前
git报错:error: RPC failed; curl 16 Error in the HTTP2 framing layer
git·网络协议·rpc
*星星之火*2 小时前
【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计
大数据·架构·flink
云纳星辰怀自在3 小时前
Git系列之git tag和Release&Milestone
git
黑客KKKing3 小时前
Refreshtoken 前端 安全 前端安全方面
大数据·前端·网络·安全·web安全
永洪科技3 小时前
共绘智慧升级,看永洪科技助力由由集团起航智慧征途
大数据·数据分析·数据可视化·bi
好记性+烂笔头3 小时前
Hadoop八股
大数据·hadoop·分布式
Python数据分析与机器学习3 小时前
《基于Hadoop的出租车需求预测系统设计与实现》开题报告
大数据·hadoop·分布式·python·算法·数据挖掘·数据分析
StableAndCalm3 小时前
什么是hadoop
大数据·hadoop·分布式
麻芝汤圆3 小时前
在虚拟机上安装 Hadoop 全攻略
大数据·linux·服务器·hadoop·windows·分布式
lqlj22333 小时前
第一个Hadoop程序
大数据·hadoop·分布式