git提交代码的正确步骤_Git 合并多个提交的正确方式

1. 应用场景

对于一个项目,你可能会多次提交代码,每次提交都对应一个commit sha

68647277f73e064692f65c168d57c191.png

当完成项目,要进行分支合并的时候,只想保留一个或某几个commit,这时候就需要合并commit了。

2. 如何合并

这里介绍两种方式,第一种是git rebase,第二种是git rebase --autosquash,后者在git commit时是有条件的。

1) git rebase

第一步,开启交互模式

git rebase -i <commit_sha>

注意,这里的<commit_sha>是你针对此项目第一个提交的前一个提交的commit。

举个例子:

下面是工作中的提交记录:

52c1fb3f809e8e233aca6cd483168e6f.png

这时我们想要把前七个commit合并成一个,即:

e8e9f5f54ea231e5b9142ae7538fb504.png

其中commit_sha是第一个提交的前一个提交的哈希。 因此,在我的示例中,命令为:

git rebase -i 6394dc

第二步,摘取合并

这时候会弹出一个框,列出了你想要合并的所有commit。注意列出的顺序是从老到新的。

21ceef5fc705255ffefb18a2d3535a15.png

更改commit_sha最前面的单词,我们打算把这七个合并成一个commit,那么更改如下:

a37016790b55be3d16ec133fe9f61062.png

保存退出后,又弹出一个新的框,让我们更改commit信息,编辑完后退出就好了。最后完成的效果如下:

c5b66c10739bad1604eed423b13ef6cb.png

2) git rebase --autosquash

顾名思义,就是会自动帮你压缩commit。但是你在git commit的时候需要使用特殊命令:

git commit --fixup=<commit_sha>

这里的commit_sha是指你对哪个commit进行了更改,所以必须先至少存在一个对该项目的提交。

举个例子:

下面是工作中的提交记录:

5abf0bad29f85c791ac3677d4572b146.png

我现在有有了一个新的改动,那么在提交时,就需要用如下命令表明我是对上一个commit进行了更改:

git commit --fixup=d94e78

产生的效果是这样的:

6137340de2d6c64d34da45fd91ca5e22.png

这时候又有了一个新的改动,那么提交时的命令不变:

git commit --fixup=d94e78

产生的效果:

18413edc4639b3f7f526da8b8176bc4e.png

接下来我们进行合并操作:

git rebase --autosquash -i <commit_sha>

注意,这里的commit_sha是older commit6394dc

Git这时会很机智的补全单词,不需要手动输入了。

fddbb2cf5f3f8a1c367237ef1d17f236.png

直接保存退出,重新编辑提交信息即可。

以上两种方式,一种是提交时轻松,合并时麻烦,另外一种相反。可以根据喜好来选择使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Git-2.23.0/win64/32/mac os 等 多个系统的安装包 , Git 2.23发行说明 ====================== 自v2.22起的更新 ------------------- 向后兼容性说明 *“format-patch”的“--base”选项计算了patch-id 不稳定方式的必备补丁,已更新为 以与“git patch-id --stable”兼容的方式进行计算。 *默认情况下,“git log”命令的行为就像--mailmap选项一样 得到了。 用户界面,工作流程和功能 *已经教授“git fast-export / import”对来处理提交 使用UTF-8以外的编码的日志消息更好。 *在最近的Git版本中,每个工作树的引用都暴露在外 refs / worktrees / / hierarchy,表示工作树名称 必须是有效的refname组件。代码现在清理名称 给予工作树,确保这些参考文件格式正确。 *“git merge”学习了“--quit”选项,可以清理正在进行中 合并,同时离开工作树和索引仍然一团糟。 *“git format-patch”学习配置以设置默认值 它的--notes = 选项。 *显示具有潜在拼写错误的args的代码 解释为commit-ish已得到改进。 *“git clone --recurse-submodules”学会了设置子模块 忽略超级项目gitlink中记录的提交对象名称 而是使用恰好位于最前端的提交 通过传递新的远程跟踪分支从一开始 “--remote-submodules”选项。 *模式“git diff / grep”用于提取功能和单词 Matlab的边界已扩展到覆盖Octave,更多 或更少的等价物。 *“git help git”很难发现(好吧,至少对某些人而言) 人)。 *模式“git diff / grep”用于提取功能和单词 Rust的边界已被添加。 *“git status”可以告诉非标准默认值 “ - [no-] ahead-behind”选项带有新的配置变量 status.aheadBehind。 *获取结果时会报告“git fetch”和“git pull” 非快进更新,让用户注意到异常情况。 这些命令学会了“--no-show-forced-updates”选项以禁用 这个安全功能。 *引入了两个新命令“git switch”和“git restore” 分裂“检查分支机构以推进其历史”和 “检查索引和/或树的路径 推进当前历史“脱离单一”git checkout“ 命令。 *“git branch --list”学会了总是将分离的HEAD输出为 无论如何,第一项(当HEAD分离时) 的语言环境。 *条件包含机制学习基于选择 HEAD目前所在的分支机构。 *“git rev-list --objects”学习了“--no-object-names”选项 压制用作分组提示的对象的路径 包装对象。 *一个新的tag.gpgSign配置变量将“git tag -a”变成 “git tag -s”。 *“git multi-pack-index”学习了expire和repack子命令。 *“git blame”学会了“忽略”历史上的承诺,其中 效果(以及它们的存在)被忽略了。 *“git cherry-pick / revert”学会了一个新的“--skip”动作。 *来自备用对象库的引用提示可用作 现在可达性计算的起点。 *“git status”输出中的额外空行已减少。 *存储库中的提交可以用多个来描述 现在提交图形文件,它允许提交图形文件 逐步更新。 *“git range-diff”输出已经过调整,以便于识别 显示补丁所显示的文件的哪一部分。 绩效,内部实施,发展支持等 *更新“git rebase”的支持部分以删除应该的代码 不再使用。 *开发人员支持,以模拟测试中未满足的先决条件 确保测试时其余测试仍然成功 已跳过先决条件。 *“git update-server-info”学会了不用#重写文件 相同的内容。 *指定在运行时查找动态库的路径的方法 已经简化了。传递-R / path /到/ dir的旧默认值 替换为新的默认值以传递-Wl,-rpath,/ path / to / dir, 这是最近GCC的用途。那些需要建立的人 旧的GCC仍然可以使用“CC_LD_DYNPATH = -R” *准备在拓扑步行器中使用可达性指数 在一个范围(A..B)。 *一个专门针对有抱负的git-core的新教程 开发人员已被添加。 *自动检测如何告知HP-UX aCC动态链接使用的位置 来自运行时的库。 *“git mergetool”及其测试现在产生更少的子进程。 * Dev支持更新以帮助跟踪测试。 *使用MSVC构建的支持已更新。 *“git fetch”从一组遥控器中获取学会运行的 auto-gc只在最后一次。 *少数Windows构建补丁已经被上流。 *用于读取序列器机器使用的状态文件的代码 对于腐败或陈旧,“git status”已变得更加强大 州档案。 *已经优化了具有多种模式的“git for-each-ref”。 *了解了遍历内核存储库的tree-walk API 更多代码路径中的实例。 *当多步骤樱桃采摘或恢复中的一步被重置或 已提交,命令行提示脚本未能注意到 目前的状况,已得到改善。 *许多GIT_TEST_ *环境变量控制着各个方面 我们的测试是如何运行的,但有一些是“非空的是真的,空的 或者未设置是假“而其他人遵循通常”有一些 拼写真实的方法,如是,等等,以及拼写方法 虚假,不,不,等等。“惯例。 *调整dir-iterator API并将其应用于本地克隆 优化代码路径。 *我们一直在尝试c89之外的一些语言功能; 该 编码指南文件没有谈论它们,而是有 全面禁止他们。 *已引入测试助手以优化测试准备 存储库有很多简单的提交,还有一些测试 脚本已更新为使用它。
官方发行说明: 过滤器规范“--filter = sparse:path = <path>”用于 创建一个惰性/部分克隆已被删除。使用blob 仍支持稀疏规范的项目的一部分 “--filter = sparse:oid = <blob>”选项。 用户界面,工作流程和功能 *“git checkout --no-overlay”可用于触发新模式 检查出树的路径,允许路径 匹配当前索引和工作树中的pathspec 并且不在树上。 *“git log --format = ...”中的%(预告片)格式化现在允许 可选择按关键字选择预告片,仅显示值, 等等 *四个新的配置变量{author,committer}。{name,email} 已经介绍过更具体地覆盖用户。{name,email} 案例。 *命令行完成(在contrib /中)学会了tab-complete “git submodule absorbgitdirs”子命令。 *“git branch”学习了一个新的子命令“--show-current”。 *“diff --cc”的输出没有显示原始路径 合并涉及重命名。一个新选项添加​​了路径 原始树木输出。 *已经教过命令行完成(在contrib /中) 完成更多子命令参数。 *来自“git bisect”的最终报告用于显示疑似 使用原始“diff-tree”的罪魁祸首,没有输出 合并提交。这已更新为使用更现代和 人类可读的输出仍然很简洁。 *“git rebase --rebase-merges”取代旧的“--preserve-merges” 选项; 后者现在标记为已弃用。 *使用--recurse-submodules进行克隆时给出的错误消息 已更新。 *完成帮助程序代码现在关注存储库本地 配置(如果可用),允许--list-cmds兑现 例如,completion.commands的特定于存储库的设置。 *“git mergetool”学会了提供Sublime Merge(smerge)作为其中之一 它的后端。 *当磁盘索引时调用新的钩子“post-index-change” 文件更改,可以帮助例如虚拟化工作树 实现。 *“git difftool”现在可以在存储库外运行。 *“git checkout -m <other>”是关于携带差异的 检查时HEAD和工作树文件之间的转发 另一个分支,忽略了HEAD与之间的差异 指数。该命令已经被教导在索引和中止时中止 HEAD是不同的。 *“index-pack”步骤中添加了一个进度指示器 经常让用户在“git clone”期间等待完成。 *“git submodule”学习允许的“set-branch”子命令 子模块。*。要修改的分支设置。 *“git merge-recursive”后端最近学到了一种新的启发式方法 根据同一目录中其他文件的方式推断文件移动 移动。因为这本身就不那么强大的启发式算法 基于文件本身的内容相似性(而不是 根据其邻居正在做的事情,它有时会给出一个 最终用户意外的结果。这已经降低了 将重命名的路径保留在索引中较高/冲突的阶段中 用户可以检查并确认结果。 *“git tag”学会了建议它可能是一个建议 创建指向的带注释或签名的标记时出错 另一个标签。 *学习“git pack-objects”命令报告数量 它通过trace2机制打包的对象。 *结束时编辑器中显示的冲突路径列表 当剪刀线在剪刀线上方显示出冲突的合并 清理模式设置为“剪刀”,即使它被评论 就像更新的路径列表和其他信息一样 帮助用户更好地解释合并。 * trace2跟踪工具学会了自动生成文件名 当被告知登录目录时。 *“git clone”在交谈时学会了一个新的--server-option选项 协议版本2。 *默认情况下,裸连接位图是创建的 现在存储库; 还创建了路径名哈希缓存 默认为避免在重新包装时产生蹩脚的增量。 *“git branch new A ... B”和“git checkout -b new A ... B” 教导说,在他们的语境中,符号A ... B表示“合并 这两个提交之间的基础“,就像”git checkout A ... B“ 在该提交中分离HEAD。 *更新“git difftool”和“git mergetool”以便组合 {diff,merge}。{tool,guitool}配置变量用作 以合理的顺序相互后备设置。 *“git difftool”的“--dir-diff”模式在“--no-index”中没用 模式; 它们现在被明确标记为互不兼容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值