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

news/2025/3/10 17:30:06/

1 Git命令大全

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

2. 工作原理

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

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

    bash

    复制

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

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

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

    bash

    复制

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


3. 使用场景

git_merge__149">适合 git merge 的场景
  1. 公共分支合并
    • 例如将 feature 分支合并到 maindev 分支时,保留合并记录有助于团队协作和历史追溯。
    • Java 示例:多人协作开发时,合并不同开发者提交的模块代码。
  2. 需要明确分支关系
    • 当分支的合并过程需要明确记录(如解决复杂冲突后的代码整合)。
  3. 避免历史重写风险
    • 公共分支已推送到远程仓库时,禁止使用 rebase,避免破坏他人工作。
git_rebase__159">适合 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/login2. 开发过程中定期同步 main 分支:git fetch origingit rebase origin/main3. 开发完成后整理提交历史:git rebase -i HEAD~5  # 合并最近5个提交4. 合并到 main 分支:git checkout maingit merge feature/login

总结

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

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


http://www.ppmy.cn/news/1578135.html

相关文章

手机屏幕摔不显示了,如何用其他屏幕临时显示,用来导出资料或者清理手机

首先准备一个拓展坞 然后 插入一个外接的U盘 插入鼠标 插入有数字小键盘区的键盘 然后准备一根高清线,一端链接电脑显示器,一端插入拓展坞 把拓展坞的连接线,插入手机充电口(可能会需要转接头) 然后确保手机开机 按下键盘…

WebSocket(WS)协议系列(三)加密

平时看到两种形式:ws 和 wss。他们有什么联系吗? ws 和 wss 都是 WebSocket 协议的两种形式,它们分别代表了不同的传输层协议。它们之间的主要区别在于加密和安全性。 ws: WebSocket 协议 ws 代表 WebSocket 协议(不加密的&…

小迪安全-27-php开发,tp框架,路由访问,对象操作,内置过滤,核心漏洞

下载一个thinkphp的框架 thinkphp就是一个mvc架构 5.0.2即可 绑定一下域名到 就可以访问了 而输出的地方在这里 而这种框架有使用手册和规范操作,代码写法也跟原生不一样,例如数据库配置 只需要在这里输入好即可,都不用自己再去写链接 这是…

Vue项目通过内嵌iframe访问另一个vue页面,获取token适配后端鉴权(以内嵌若依项目举例)

1. 改造子Vue项目进行适配(ruoyi举例) (1) 在路由文件添加需要被外链的vue页面配置 // 若依项目的话是 router/index.js文件 {path: /contrast,component: () > import(/views/contrast/index),hidden: true },(2) 开放白名单 // 若依项目的话是 permission.js 文件 cons…

deepseek在pycharm中的配置和简单应用

对于最常用的调试python脚本开发环境pycharm,如何接入deepseek是我们窥探ai代码编写的第一步,熟悉起来总没坏处。 1、官网安装pycharm社区版(免费),如果需要安装专业版,需要另外找破解码。 2、安装Ollama…

vue3中子组件获取父组件的name,父组件不做修改动作

在 Vue 3 中,子组件若要获取父组件的 name,且父组件不做额外操作,可以借助 getCurrentInstance 来实现。getCurrentInstance 方法能获取当前组件实例,进而访问其父组件实例及其属性。 示例代码 父组件(ParentComponent…

人工智能里的深度学习指的是什么?

深度学习(Deep Learning, 简称DL)是机器学习领域的一个重要分支,它通过构建和训练深层神经网络模型,从大量数据中自动学习和提取特征,以实现复杂任务的自动化处理和决策。以下是关于深度学习的详细介绍: 一…

阿里发布新开源视频生成模型Wan-Video,支持文生图和图生图,最低6G就能跑,ComFyUI可用!

Wan-Video 模型介绍:包括 Wan-Video-1.3B-T2V 和 Wan-Video-14B-T2V 两个版本,分别支持文本到视频(T2V)和图像到视频(I2V)生成。14B 版本需要更高的 VRAM 配置。 Wan2.1 是一套全面开放的视频基础模型&…