在开发一个功能或者修复一个bug时,有时会commit多次代码,这时为了commit历史的完美,会想将多个commit合并为一个,想要实现这个目标,就需要用到 git rebase ,下面记录操作方法,留作笔记。
在合并commit之前,需要先查看commit历史,确定我们需要合并的commit范围。
最通用的方法是 git log。
示例:(上下箭头或者滑动可以控制内容滚动)
xwd@xwd-OptiPlex-7060:~/projects/ai/ai-tiger$ git log
commit 047a3c26864eb204779a231fe49bcda9d260ef62 (HEAD -> 1.3.2, origin/1.3.2)
Author: xingweidong <xingweidong@xkw.cn>
Date: Fri Jun 17 09:17:41 2022 +0800
commit 5
commit b23f0d7558be752f8f82aa738d4ccd3574f83ade
Author: xingweidong <xingweidong@xkw.cn>
Date: Fri Jun 17 09:17:18 2022 +0800
commit 4
commit fbd6ad0e6b05d47e9bbe08c43ca7cfda019ec4b6
Author: xingweidong <xingweidong@xkw.cn>
Date: Fri Jun 17 09:17:05 2022 +0800
commit 3
commit a1f7193e4dd642abe748f4b6a65962e95125015b
Author: xingweidong <xingweidong@xkw.cn>
Date: Fri Jun 17 09:16:21 2022 +0800
commit 2
commit b92721896dd1667af7c158936c6c9fe0979a45aa
Author: xingweidong <xingweidong@xkw.cn>
Date: Fri Jun 17 09:16:08 2022 +0800
commit 1
commit b76386ba5adcbe7db5fff14c8bd9b4a9945c881c (origin/master, origin/HEAD)
如果使用gitlab,按照下图步骤查看commit历史:


如果使用github,按照下图步骤查看commit历史:


这里以上面的commit 1~5 为例,进行说明。
示例操作系统为Ubuntu,如果使用macos,编辑操作同vi,windows系统类似。
例如现在要合并commit 3~5,使用命令:
git rebase -i a1f7193e
-i 代表交互式操作,a1f7193e 是commit2的id,一般取前7位或者更多即可。
输出如下:

从图中可以看到,最上面是我们的commit,按照提交先后,从上到下排列。
图中有一些命令,这里我们只需要关注:
只看说明,可能不容易理解,继续看操作,接下来就好理解了。
上图可以直接编辑,将上图修改成下图:

这里把commit4和commit5前面的pick修改成了s(squash的简写),按 Ctrl + X,出现提示:

输入y,出现提示:

按回车键,出现提示:

到这一步,可以修改提交说明,比如修改成:

按Ctrl + X,出现提示:

按y,出现提示:

按会车键,结束,回到终端命令行:

然后提交到远程仓库,执行命令:
git push -f
-f 表示强制,受保护的分支不可以强制push。
查看远程仓库,多个commit合并为一个了:

我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g
有什么区别:@attr[:field]=new_value和@attr.merge(:field=>new_value) 最佳答案 如果您使用的是merge!而不是merge,则没有区别。唯一的区别是您可以在合并参数中使用多个字段(意思是:另一个散列)。例子:h1={"a"=>100,"b"=>200}h2={"b"=>254,"c"=>300}h3=h1.merge(h2)putsh1#=>{"a"=>100,"b"=>200}putsh3#=>{"a"=>100,"b"=>254,"c"=>300}h1.merge!(h2)pu
关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec
我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co
我正在安装gitlabhq,并且在Gemfile中有对某些资源的“git://...”的引用。但是,我在公司防火墙后面,所以我必须使用http://。我可以手动编辑Gemfile,但我想知道是否有另一种方法告诉bundler使用http://作为git存储库? 最佳答案 您可以通过运行gitconfig--globalurl."https://".insteadOfgit://或通过将以下内容添加到~/.gitconfig:[url"https://"]insteadOf=git://
之前有人问过这个问题,我发现了以下clip关于如何一次设置一个类对象的所有属性,但由于批量分配保护,这在Rails中是不可能的。(例如,您不能Object.attributes={})有没有一种很好的方法可以将一个类的属性合并到另一个类中?object1.attributes=object2.attributes.inject({}){|h,(k,v)|h[k]=vifObjectModel.column_names.include?(k);h}谢谢。 最佳答案 利用assign_attributes使用:without_prote
Activeadmingem已添加到我的rails项目中,但每次我尝试安装railsgactive_admin:install时,我都会收到类似的错误git://github.com/activeadmin/activeadmin.git(atmaster)isnotyetcheckedout.Runbundleinstallfirst.我肯定在运行“railsgactive_admin:install”之前运行了bundle。运行“bundleshow”后,我看到我已将“*activeadmin(1.0.0.pre3f916d6)”添加到我的项目中,但不断收到此错误消息。我的gem文
我一直在尝试使用nanoc用于生成静态网站。我需要组织一个复杂的排列页面,我想让我的内容保持干燥。包含或合并的概念在nanoc系统中如何运作?我已阅读文档,但似乎找不到我想要的内容。例如:我如何获取两个部分内容项并将它们合并到一个新的内容项中。在staticmatic您可以在您的页面中执行以下操作。=partial('partials/shared/navigation')类似的约定在nanoc中如何运作? 最佳答案 这里是nanoc的作者。在nanoc中,部分是布局。因此,您可以拥有layouts/partials/shared/
我很难理解我需要合并两个哈希数组的逻辑,看来我已经问过hisquestionawhileback以不同的方式,我还尝试了其他一些方法,例如此处提供的答案:mergingarraysofhashes任何形式的帮助理解这对我来说都是非常有帮助的。假设我有以下数组,这是方法本身的输出,所以你可以想象那些:timestamp是Time对象[{:timestamp=>2011-12-1900:00:00UTC},{:timestamp=>2011-12-1901:00:00UTC},{:timestamp=>2011-12-1902:00:00UTC},{:timestamp=>2011-12-