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 保持代码整洁。

相关推荐
俊哥大数据1 分钟前
【实战项目5】基于Flink新闻热搜大数据实时分析项目
大数据·flink
俊哥大数据5 分钟前
【实战项目3】基于Flink广告投放业务领域大数据实时分析项目
大数据·flink
Albert Edison11 分钟前
【Git】多人协作一(同一分支下)
git·vscode·svn·github
学好statistics和DS19 分钟前
Git 同步冲突
大数据·git·elasticsearch
俊哥大数据25 分钟前
【实战项目4】Hadoop金融信贷大数据离线分析项目
大数据·hadoop·金融
samLi062026 分钟前
【工具变量】上市公司是否为高科技行业DID数据-含参考文献及代码(1990-2024年)
大数据
智能相对论10 小时前
CES深度观察丨智能清洁的四大关键词:变形、出户、体验以及生态协同
大数据·人工智能
焦耳热科技前沿12 小时前
北京科技大学/理化所ACS Nano:混合价态Cu₂Sb金属间化合物实现高效尿素电合成
大数据·人工智能·自动化·能源·材料工程
min18112345613 小时前
深度伪造内容的检测与溯源技术
大数据·网络·人工智能
武子康13 小时前
大数据-209 深度理解逻辑回归(Logistic Regression)与梯度下降优化算法
大数据·后端·机器学习