我想在一个分支中间将几个提交压缩在一起,而不修改前后的提交。
我有:
A -- B -- C -- D -- E -- F -- G
| |
master dev
origin/master
我想把它压缩成
A -- H -- E -- F -- G
| |
master dev
origin/master
其中 H 等同于 B -- C -- D。我希望能够指定 H 的提交消息。 A 是已推送的最后一次提交,因此可以重写之后的所有提交而不会弄乱服务器。这个想法是在我快进 master 之前清理历史。
我该怎么做?
PS:请注意,在我的例子中,我实际上有超过 3 个提交要在中间挤压,但如果我可以用 3 个来完成,我应该可以用更多来完成。
PPS:此外,如果可能的话,我更喜欢 E、F 和 G 保持不变的解决方案(主要是关于提交日期).
最佳答案
您可以进行交互式 rebase 并手动选择要压缩的提交。这将重写您的 dev 分支的历史记录,但由于您没有推送这些提交,因此除了您自己的计算机上可能发生的事情之外,不应有任何负面后果。
从以下内容开始:
git checkout dev
git rebase -i HEAD~6
这应该会 pop 一个窗口,显示以下 7 次提交列表,从 dev 分支的 HEAD 返回 6 步:
pick 07c5abd message for commit A
pick dl398cn message for commit B
pick 93nmcdu message for commit C
pick lst28e4 message for commit D
pick 398nmol message for commit E
pick 9kml38d message for commit F
pick 02jmdmp message for commit G
显示的第一个提交(上面的 A)是最旧的,最后一个是最近的。可以看到默认情况下,每次提交的选项都是pick。如果您现在完成 rebase ,您将只保留每个提交,这实际上是一个空操作。但是因为你想压缩某些中间提交,编辑列表并将其更改为:
pick 07c5abd message for commit A
pick dl398cn new commit message for "H" goes here
squash 93nmcdu message for commit C
squash lst28e4 message for commit D
pick 398nmol message for commit E
pick 9kml38d message for commit F
pick 02jmdmp message for commit G
仔细注意上面发生的事情。通过键入 squash,您告诉 Git 将该提交 merge 到它的上方,也就是紧接在它之前的提交。所以这意味着将提交 D 向后压缩为提交 C,然后将 C 压缩为 B,留下你对于提交 B、C 和 D 只有一次提交。其他提交保持原样。
保存文件(: wq on Git Bash in Windows),rebase完成。请记住,您可能会像预期的那样从中得到 merge 冲突,但解决它们没有什么特别之处,您可以像处理任何常规 rebase 或 merge 一样继续。
如果在 rebase 后检查分支,您会注意到 E、F 和 G 提交现在有了新的哈希值,日期等。这是因为这些提交实际上已经被新的提交所取代。这样做的原因是您重写了历史,因此一般的提交不再与以前相同。
关于Git squash 在分支中间提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39023360/
文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g
我在ruby表单中有一个提交按钮f.submitbtn_text,class:"btnbtn-onemgt12mgb12",id:"btn_id"我想在不使用任何javascript的情况下通过ruby禁用此按钮 最佳答案 添加disabled:true选项。f.submitbtn_text,class:"btnbtn-onemgt12mgb12",id:"btn_id",disabled:true 关于ruby-on-rails-如何在Rails中添加禁用的提交按钮,我们在St
保存成功后可以回滚吗?让我有一个带有属性名称、电子邮件等的用户模型。例如u=User.newu.name="test_name"u.email="test@email.com"u.save现在记录将成功保存在数据库中,之后我想回滚我的事务(不是销毁或删除)。有什么想法吗? 最佳答案 您可以通过交易来做到这一点,请参阅http://markdaggett.com/blog/2011/12/01/transactions-in-rails/例子:User.transactiondoUser.create(:username=>'Nemu
我有一个使用Jekyll托管在GitHub上的静态网站。问题是,我真的不需要master分支,因为存储库唯一包含的是网站。这样我就必须gitcheckoutgh-pages,然后gitmergemaster,然后gitpushorigingh-pages。有什么简单的方法可以摆脱gh-pages分支并直接从master推送? 最佳答案 Theproblemis,Idon'treallyneedthemasterbranch,astheonlythingtherepositorycontainsisthewebsite.Isthere
我有一个Ruby数组[1,4]。我想在中间插入另一个数组[2,3],这样它就变成了[1,2,3,4]。我可以使用[1,4].insert(1,[2,3]).flatten实现这一点,但是有更好的方法吗? 最佳答案 您可以通过以下方式进行。[1,4].insert(1,*[2,3])insert()方法处理多个参数。因此,您可以使用splat运算符*将数组转换为参数。 关于ruby-如何在数组中间插入一个数组?,我们在StackOverflow上找到一个类似的问题:
在rails开发环境中,cache_classes是关闭的,所以你可以修改app/下的代码,不用重启服务器就可以看到变化。不过,在所有环境中,中间件只会创建一次。所以如果我有这样的中间件:classMyMiddlewaredefinitialize(app)@app=appenddefcall(env)env['model']=MyModel.firstendend我在config/environments/development.rb中执行此操作:config.cache_classes=false#thedefaultfordevelopmentconfig.middleware.
如果有人有兴趣将PDF文件保存在PDFKit中间件gem显示的文件系统中,那么这里是...重写middleware.rb文件的call方法。在覆盖中只需替换这一行:body=PDFKit.new(translate_paths(body,env),@options).to_pdf与pdf=PDFKit.new(translate_paths(body,env),@options)file=pdf.to_file('Your/file/name/path')Mymodel.my_method()#Youcanwriteyourmethodheretousethatfilebody=pdf
我正在尝试使用Rugged以编程方式创建对现有存储库的提交(libgit2的Ruby绑定(bind))。我已尝试遵循RuggedREADME中提供的文档,但我认为它与代码库的当前状态不太匹配。当我尝试运行以下代码时,我不断收到错误消息:require'rugged'#Createaninstanceoftheexistingrepositoryrepo=Rugged::Repository.new('/full/path/to/repo')#grabthecurrentTimeobjectfornowcurr_time=Time.now#writeanewblobtothereposi
我的Rails4应用程序使用了一个自定义Rack中间件。如果客户端未提供有效信息(我'正在开发API)。因此,在每个请求之前它会更改这些header,并且在每个请求之后它会添加一个带有自定义媒体类型信息的自定义X-Something-Media-Typeheader。我想切换到Puma,因此我有点担心这种中间件的线程安全性。我没有使用实例变量,除了我们在每个中间件中遇到的常见@app.call一次,但即使在这里我也复制了一些我在RailsCasts的评论中读到的内容:definitialize(app)@app=appenddefcall(env)dup._call(env)endde
我为你们准备了一个简单的。我想要一个特色内容部分,其中排除了当前文章所以这可以通过delete_if使用MiddlemanBlog:但是我使用的是中间人代理,所以我无法访问current_article方法...我有一个YAML结构,其中包含以下模拟数据(以及其他数据),文件夹设置如下:data>site>caseStudy>RANDOM-ID423536.yaml(由CMS生成)在每个yaml文件中,您会发现如下内容::id:2k1YccJrQsKE2siSO6o6ac:title:Heyplace我的config.rb看起来像这样data.site.caseStudy.eachdo