如果我已经开始重新设置基准,如何将两个提交合并为一个?
我正在尝试将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
而您想要合并前两个提交,只需执行以下简单步骤即可:
- 首先是安全方面的检查,在另一个分支中的第二个最后提交。 您可以为分支命名。
git checkout 77df2a40e53136c7a2d58fd847372 -b merged-commits
- 现在,只需将您从上一次提交
git cherry-pick -n -x ac72a4308ba70cc42aace47509a5e
更改樱桃选择到该新分支中,即可:git cherry-pick -n -x ac72a4308ba70cc42aace47509a5e
。 (解决冲突,如果出现的话) - 因此,现在,您在最后一次提交中所做的更改就在您的第二次最后提交中。 但是您仍然必须提交,因此首先添加刚刚选择的更改,然后执行
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楼
重新设置:您将不需要它:
最常见情况的一种简单方法。
在大多数情况下:
实际上,如果您只需要将几个最近的提交合并为一个即可,而无需drop
, reword
和其他reword
工作。
您可以简单地执行以下操作:
git reset --soft "HEAD~n"
- 假设
~n
是提交的编号,以轻轻未提交(即~1
,~2
,...)
然后,使用以下命令修改提交消息。
git commit --amend
这与squash
和一pick
长squash
。
它适用于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
如果我已经开始重新设置基准,如何将两个提交合并为一个?相关推荐
- excel单元格下拉选项怎么设置_excel同列不同行内容合并到一个单元格怎么办?...
前段时间火了一阵子的<琉璃>让人欲罢不能,借着这个东风,写下了我这个公众号的第一篇小文.希望他可以成长! 言归正传,我这里有一个人物清单表,现在我想把下面每个单元格里的内容合并到一个单元格 ...
- xp如何在桌面显示计算机,WinXP系统如何设置一台电脑两个显示器?
一般情况一台电脑只配一个显示器,在我们平时的工作.娱乐基本上都是这样的搭配.使用WinXP系统用户,想设置一台电脑两个显示器.其中一个显示器玩游戏,另一个显示器就用聊天和看电影.要如何设置?下面就和大 ...
- DSX-8000CH光纤测试跳线设置基准法
DSX-8000CH光纤测试跳线设置基准法 正如大家所知,一级测试是最普遍使用的测试方式,就是用一个光源和一个光功率计,在光纤的一端接上光源,并在光纤的另一端接上光功率计,由于这根光纤是有损耗的,因而 ...
- pandas使用drop_duplicates函数基于subset参数指定的数据列子集删除重复行、并设置keep参数保留重复行中的最后一个数据行
pandas使用drop_duplicates函数基于subset参数指定的数据列子集删除重复行.并设置keep参数保留重复行中的最后一个数据行 目录
- 正确设置语言,加速WP应用提交
App Hub在7月18日进行了更新.有些用户反馈新增的默认语言选项有点令人费解.本文简单做个介绍,帮助开发者正确设置语言,加速WP应用提交快速.这次的系统更新后,App Hub可以检 ...
- win10定时关机c语言,Win10系统怎么定时关机?Windows10设置定时关机的两种方法
最近,有位刚刚升级win10系统的用户反映自己在使用完电脑后经常会忘记手动关机,因此为了能够更好地保护电脑,希望在新系统中设置定时关机.这该如何操作呢?接下来,小编就向大家分享Windows10设置定 ...
- MySQL调优(七):滴滴一面二面题,服务器参数设置,redolog两阶段提交
某同学的滴滴一面二面 1.自我介绍不要念稿 2.对项目描述要准确,不要看起来不懂装懂:态度问题.一些问题没接触过很正常.不要所有问题都抢着说,要展示态度. 服务器参数设置 thread_cache_s ...
- 双显示器设置:如何设置一台电脑两个显示器
双显示器设置:如何设置一台电脑两个显示器 - 来源:互联网 作者:佚名 时间:04-11 09:00:18 [大 中 小] 点评:双显示器设置,如何设置一台电脑两个显示器:一般来说一台电脑通常只配一个 ...
- Android点击图片随机,android 设置图片随机出现-两种方式
android 设置图片随机出现-两种方式, 第一种方式:得到图片对应的Drawable实例,通过setImageDrawable(drawable)实现 //ImageView对应的id ivBg ...
最新文章
- Java项目:教材管理系统(java+SSM+jsp+mysql+maven)
- linux 下 php 扩展
- struts2:JSP页面及Action中获取HTTP参数(parameter)的几种方式
- leetcode 35. 搜索插入位置 思考分析
- 非结构化WEB数据库与图书馆多媒体信息资源的组织利用
- Qt文档阅读笔记-单元测试中构建标准检测程序(CPU、Linux性能、内存泄漏等)
- 怎么恢复php格式关联,SCN与数据恢复关联
- vue computed使用_前端发展方向指南—Vue运行机制
- 阿里云张献涛:公共云不断向外延伸,一云多态是未来趋势
- 暴力破解QQ空间设置的问题
- 第二届(2017)中国IT武林大会暨2017年度中国IT年度人物颁奖盛典
- 哈工大C语言程序设计精髓MOOC 第十二周编程题
- 基于 Node.js + Koa 构建完整的 Web API 项目
- 跨平台测试框架--STAF介绍
- 当代最值得收藏的画家作品_当代最具收藏价值的画家:许敬如作品欣赏
- 外贸软件进出口内贸综合型管理解决方案
- 一文带你了解什么是websocket
- linux中的ubiq命令用途,学习Linux命令(一)
- 围观!物联网卡的销售渠道有哪些?
- docker 制作本地镜像_docker如何制作自己的镜像