我正在尝试将2个提交合并为1个,因此我遵循了git ready中的“使用rebase压缩提交” 。

我跑了

git rebase --interactive HEAD~2

在结果编辑器中,我将pick改为squash ,然后保存退出,但是rebase失败并显示以下错误

没有先前的提交就无法“压扁”

现在我的工作树已达到此状态,我无法恢复。 git rebase --interactive HEAD~2命令失败并显示

交互式基础已经开始

git rebase --continue失败

没有先前的提交就无法“压扁”


#1楼

如果您的主分支git log如下所示:

commit ac72a4308ba70cc42aace47509a5e
Author: <me@me.com>
Date:   Tue Jun 11 10:23:07 2013 +0500Added algorithms for Cosine-similaritycommit 77df2a40e53136c7a2d58fd847372
Author: <me@me.com>
Date:   Tue Jun 11 13:02:14 2013 -0700Set stage for similar objectscommit 249cf9392da197573a17c8426c282
Author: Ralph <ralph@me.com>
Date:   Thu Jun 13 16:44:12 2013 -0700Fixed a bug in space world automation

而您想要合并前两个提交,只需执行以下简单步骤即可:

  1. 首先是安全方面的检查,在另一个分支中的第二个最后提交。 您可以为分支命名。 git checkout 77df2a40e53136c7a2d58fd847372 -b merged-commits
  2. 现在,只需将您从上一次提交git cherry-pick -n -x ac72a4308ba70cc42aace47509a5e更改樱桃选择到该新分支中,即可: git cherry-pick -n -x ac72a4308ba70cc42aace47509a5e 。 (解决冲突,如果出现的话)
  3. 因此,现在,您在最后一次提交中所做的更改就在您的第二次最后提交中。 但是您仍然必须提交,因此首先添加刚刚选择的更改,然后执行git commit --amend

而已。 如果愿意,可以在分支“ merged-commits”中推送此合并版本。

另外,您现在可以在master分支中丢弃背对背的两次提交。 只需将您的master分支更新为:

git checkout master
git reset --hard origin/master (CAUTION: This command will remove any local changes to your master branch)
git pull

#2楼

我经常使用git reset --mixed在要合并的多个提交之前还原基本版本,然后进行新的提交,这样可以让您的最新提交,确保在推送到服务器后您的版本为HEAD。

commit ac72a4308ba70cc42aace47509a5e
Author: <me@me.com>
Date:   Tue Jun 11 10:23:07 2013 +0500Added algorithms for Cosine-similaritycommit 77df2a40e53136c7a2d58fd847372
Author: <me@me.com>
Date:   Tue Jun 11 13:02:14 2013 -0700Set stage for similar objectscommit 249cf9392da197573a17c8426c282
Author: Ralph <ralph@me.com>
Date:   Thu Jun 13 16:44:12 2013 -0700Fixed a bug in space world automation

如果我想将两个提交合并为一个,则首先使用:

git reset --mixed 249cf9392da197573a17c8426c282

“ 249cf9392da197573a17c8426c282”是第三个版本,也是合并之前的基本版本,此后,我进行新提交:

git add .
git commit -m 'some commit message'

总之,希望是每个人的另一种方式。

仅供参考,从git reset --help

 --mixedResets the index but not the working tree (i.e., the changed files arepreserved but not marked for commit) and reports what has not beenupdated. This is the default action.

#3楼

假设您在自己的主题分支中。 如果要将最后2个提交合并为一个并看起来像英雄,请在进行最后2个提交之前分支该提交。

git checkout -b temp_branch HEAD^2

然后壁球在这个新分支中提交另一个分支:

git merge branch_with_two_commits --squash

这将带来更改,但不会提交更改。 因此,只需提交它们,您就完成了。

git commit -m "my message"

现在,您可以将此新主题分支合并回您的主分支。


#4楼

首先,您应该检查您有多少个提交:

git log

有两种状态:

一种是只有两个提交:

例如:

commit A
commit B

(在这种情况下,您不能使用git rebase来做),您需要执行以下操作。

$ git reset --soft HEAD^1$ git commit --amend

另一个是有两个以上的提交。 您想合并提交C和D。

例如:

commit A
commit B
commit C
commit D

(在这种情况下,您可以使用git rebase)

git rebase -i B

并且比用“南瓜”来做。 其余的变薄非常容易。 如果您仍然不知道,请阅读http://zerodie.github.io/blog/2012/01/19/git-rebase-i/


#5楼

如果有多个提交,则可以使用git rebase -i将两个提交压缩为一个。

如果只有两个提交要合并,并且它们是“最近的两个提交”,则可以使用以下命令将两个提交合并为一个:

git reset --soft "HEAD^"
git commit --amend

#6楼

您可以使用取消取消基准

git rebase --abort

当您再次运行交互式rebase命令时,'squash; 提交必须在列表中的选择提交之下


#7楼

摘要

错误讯息

没有先前的提交就无法“压扁”

意味着您可能试图“向下压缩。Git总是将新提交压缩为较旧的提交或“向上”压缩,如在交互式rebase待办事项列表中所看到的那样,即转换为上一行的提交。 将待办事项列表第一行上的命令更改为squash总是会产生此错误,因为第一次提交的内容没有任何东西。

修复

首先回到开始的地方

$ git rebase --abort

说你的历史是

$ git log --pretty=oneline
a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c
b76d157d507e819d7511132bdb5a80dd421d854f b
df239176e1a2ffac927d8b496ea00d5488481db5 a

也就是说,a是第一个提交,然后是b,最后是c。 提交c之后,我们决定将b和c一起压缩:

(注意:运行git log其输出通过管道传送到寻呼机中,在大多数平台上默认情况下less 。要退出该寻呼机并返回到命令提示符,请按q键。)

运行git rebase --interactive HEAD~2给你一个编辑器

pick b76d157 b
pick a931ac7 c# Rebase df23917..a931ac7 onto df23917
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

(请注意,此待办事项列表与git log的输出相反。)

将b的pick更改为squash将导致您看到的错误,但是如果相反,您可以通过将todo列表更改为b将c压入b(较新的提交到较旧的或“向上挤压”)中

pick   b76d157 b
squash a931ac7 c

然后保存退出您的编辑器,您将获得另一个编辑器,其内容为

# This is a combination of 2 commits.
# The first commit's message is:b# This is the 2nd commit message:c

保存并退出后,已编辑文件的内容将成为新组合提交的提交消息:

$ git log --pretty=oneline
18fd73d3ce748f2a58d1b566c03dd9dafe0b6b4f b and c
df239176e1a2ffac927d8b496ea00d5488481db5 a

关于重写历史记录的注意事项

交互式重新基准重写历史记录。 尝试推送到包含旧历史记录的遥控器将失败,因为它不是快速转发。

如果您依据的分支是您自己在其中工作的主题或功能分支,那没什么大不了的。 推送到另一个存储库将需要--force选项,或者,您也可以根据远程存储库的权限,先删除旧分支,然后再推送经过重新构建的版本。 这些可能破坏工作的命令示例不在此答案范围内。

重写一个分支,它是你与其他人的工作没有很好的理由,如泄露密码或其他敏感信息的工作力量到你的合作者,是反社会和会惹恼其他开发商已经发布的历史。 git rebase文档中的“从上游基础恢复中”部分进行了说明,并重点强调。

对其他人基于其工作的分支重新建立基础(或进行任何其他形式的重写)是一个坏主意:该分支下游的任何人都必须手动修复其历史记录。 本节从下游的角度说明如何进行修复。 但是,真正的解决方法是首先避免对上游进行重新调整。


#8楼

因为我几乎所有东西都使用git cherry-pick ,所以对我来说很自然,即使在这里也是如此。

鉴于我已经签出了branchX ,并且在它的顶端有两个提交,我想创建一个合并其内容的提交,我这样做:

git checkout HEAD^ // Checkout the privious commit
git cherry-pick --no-commit branchX // Cherry pick the content of the second commit
git commit --amend // Create a new commit with their combined content

如果我也想更新branchX (我想这是该方法的branchX ),我还必须:

git checkout branchX
git reset --hard <the_new_commit>

#9楼

$ git rebase --abort

如果要撤消git rebase,可随时运行此代码

$ git rebase -i HEAD~2

要重新应用最后两次提交。 上面的命令将打开一个代码编辑器

  • [ 最近的提交将在底部 ]。 将最后一次提交更改为南瓜。 由于壁球将与先前的提交融合。
  • 然后按Esc键并输入:wq保存并关闭

:wq之后,您将进入主动变基模式

注意 :如果没有警告/错误消息,您将得到另一个编辑器;如果有错误或警告将不显示其他编辑器,则可以运行$ git rebase --abort中止操作,如果看到错误或警告,则继续运行$ git rebase --continue

您将看到2提交消息。 选择一个或编写您自己的提交消息,保存并退出[:wq]

注意2:如果运行rebase命令,则可能需要强制将更改推送到远程存储库

$ git push -f

$ git push -f origin master


#10楼

重新设置:您将不需要它:

最常见情况的一种简单方法。

在大多数情况下:

实际上,如果您只需要将几个最近的提交合并为一个即可,而无需dropreword和其他reword工作。

您可以简单地执行以下操作:

git reset --soft "HEAD~n"
  • 假设~n是提交的编号,以轻轻未提交(即~1~2 ,...)

然后,使用以下命令修改提交消息。

git commit --amend

这与squash和一picksquash

它适用于n次提交,但不仅仅是上述提示提示的两次提交。


#11楼

如果要合并两个最近的提交,而只使用较旧的提交消息,则可以使用expect自动执行该过程。

我假设:

  • 您正在使用vi作为编辑器
  • 您的提交都是一行

我使用git version 2.14.3 (Apple Git-98)


#!/usr/bin/env expect
spawn git rebase -i HEAD~2# down, delete word, insert 's' (for squash), Escape, save and quit
send "jdwis \033:wq\r"expect "# This is a"# down 4, delete 3 lines, save and quit
send "4j3d\r:wq\r"interact

如果我已经开始重新设置基准,如何将两个提交合并为一个?相关推荐

  1. excel单元格下拉选项怎么设置_excel同列不同行内容合并到一个单元格怎么办?...

    前段时间火了一阵子的<琉璃>让人欲罢不能,借着这个东风,写下了我这个公众号的第一篇小文.希望他可以成长! 言归正传,我这里有一个人物清单表,现在我想把下面每个单元格里的内容合并到一个单元格 ...

  2. xp如何在桌面显示计算机,WinXP系统如何设置一台电脑两个显示器?

    一般情况一台电脑只配一个显示器,在我们平时的工作.娱乐基本上都是这样的搭配.使用WinXP系统用户,想设置一台电脑两个显示器.其中一个显示器玩游戏,另一个显示器就用聊天和看电影.要如何设置?下面就和大 ...

  3. DSX-8000CH光纤测试跳线设置基准法

    DSX-8000CH光纤测试跳线设置基准法 正如大家所知,一级测试是最普遍使用的测试方式,就是用一个光源和一个光功率计,在光纤的一端接上光源,并在光纤的另一端接上光功率计,由于这根光纤是有损耗的,因而 ...

  4. pandas使用drop_duplicates函数基于subset参数指定的数据列子集删除重复行、并设置keep参数保留重复行中的最后一个数据行

    pandas使用drop_duplicates函数基于subset参数指定的数据列子集删除重复行.并设置keep参数保留重复行中的最后一个数据行 目录

  5. 正确设置语言,加速WP应用提交

            App Hub在7月18日进行了更新.有些用户反馈新增的默认语言选项有点令人费解.本文简单做个介绍,帮助开发者正确设置语言,加速WP应用提交快速.这次的系统更新后,App Hub可以检 ...

  6. win10定时关机c语言,Win10系统怎么定时关机?Windows10设置定时关机的两种方法

    最近,有位刚刚升级win10系统的用户反映自己在使用完电脑后经常会忘记手动关机,因此为了能够更好地保护电脑,希望在新系统中设置定时关机.这该如何操作呢?接下来,小编就向大家分享Windows10设置定 ...

  7. MySQL调优(七):滴滴一面二面题,服务器参数设置,redolog两阶段提交

    某同学的滴滴一面二面 1.自我介绍不要念稿 2.对项目描述要准确,不要看起来不懂装懂:态度问题.一些问题没接触过很正常.不要所有问题都抢着说,要展示态度. 服务器参数设置 thread_cache_s ...

  8. 双显示器设置:如何设置一台电脑两个显示器

    双显示器设置:如何设置一台电脑两个显示器 - 来源:互联网 作者:佚名 时间:04-11 09:00:18 [大 中 小] 点评:双显示器设置,如何设置一台电脑两个显示器:一般来说一台电脑通常只配一个 ...

  9. Android点击图片随机,android 设置图片随机出现-两种方式

    android 设置图片随机出现-两种方式, 第一种方式:得到图片对应的Drawable实例,通过setImageDrawable(drawable)实现 //ImageView对应的id ivBg ...

最新文章

  1. Java项目:教材管理系统(java+SSM+jsp+mysql+maven)
  2. linux 下 php 扩展
  3. struts2:JSP页面及Action中获取HTTP参数(parameter)的几种方式
  4. leetcode 35. 搜索插入位置 思考分析
  5. 非结构化WEB数据库与图书馆多媒体信息资源的组织利用
  6. Qt文档阅读笔记-单元测试中构建标准检测程序(CPU、Linux性能、内存泄漏等)
  7. 怎么恢复php格式关联,SCN与数据恢复关联
  8. vue computed使用_前端发展方向指南—Vue运行机制
  9. 阿里云张献涛:公共云不断向外延伸,一云多态是未来趋势
  10. 暴力破解QQ空间设置的问题
  11. 第二届(2017)中国IT武林大会暨2017年度中国IT年度人物颁奖盛典
  12. 哈工大C语言程序设计精髓MOOC 第十二周编程题
  13. 基于 Node.js + Koa 构建完整的 Web API 项目
  14. 跨平台测试框架--STAF介绍
  15. 当代最值得收藏的画家作品_当代最具收藏价值的画家:许敬如作品欣赏
  16. 外贸软件进出口内贸综合型管理解决方案
  17. 一文带你了解什么是websocket
  18. linux中的ubiq命令用途,学习Linux命令(一)
  19. 围观!物联网卡的销售渠道有哪些?
  20. docker 制作本地镜像_docker如何制作自己的镜像

热门文章

  1. atitit.为什么技术的选择方法java超过.net有前途
  2. java打包成jar文件
  3. angularjs应用总结
  4. atitit.激活一个窗口总结 swing java .net php
  5. 洛谷P1776 宝物筛选
  6. Windows10下python3.5的sklearn库安装
  7. splay详解(三)
  8. HDU 6044 Limited Permutation 读入挂+组合数学
  9. 判断当前用户有无Administrator的权限
  10. 动态合并Repeater控件数据列