运行以下这条命令之后,它会打开一个vim编辑器,我们就可以修改上一次commit时输入的提交信息。
git commit --amend
接下来你要是想修改描述信息的话,直接键入:i,此时进入了输入模式。
可用键盘上下键转到描述所在的那一行,然后进行修改。
修改完成后,按下 Esc 键退出编辑模式,在键入 :wq 回车退出并保存修改,完成提交。
amend:是补丁的意思,amend不是修改最近一次commit,而是整个替换掉他。amend后生成的commit是一个全新的commit,之前的老的commit会从项目历史中被删除。如果你amend了一个被其他开发者使用的commit,会严重影响其他开发者,所以要注意不要对一个公共的commit使用amend。
执行以下命令,git会进入一个vim窗口,在这个窗口当中我们可以看到HEAD之前的2次提交
git rebase -i HEAD~2 // rebase HEAD之前的2次提交
// 或者
git rebase -i {commitID} // 例如 git rebase -i d95ddfb
HEAD~2:告诉 git 我要改变HEAD之前的2次提交
pick:只是意味着包括提交。重新进行命令时,重新安排pick命令的顺序会更改提交的顺序。如果选择不包括提交,则应删除整行。
reword:该命令与pick相似,但是使用后,重新设置过程将暂停并为您提供更改提交消息的机会。提交所做的任何更改均不受影响。
edit:如果您选择edit提交,则将有机会修改提交,这意味着您可以完全添加或更改提交。您还可以进行更多提交,然后再继续进行变基。这使您可以将大型提交拆分为较小的提交,或者删除在提交中所做的错误更改。
squash:该命令使您可以将两个或多个提交合并为一个提交。提交被压缩到其上方的提交中。Git使您有机会编写描述这两个更改的新提交消息。
fixup:这类似于squash,但是要合并的提交已丢弃其消息。提交仅合并到其上方的提交中,并且较早提交的消息用于描述这两个更改。
exec:这使您可以对提交运行任意的Shell命令。
在vim窗口里,按i进入编辑模式,把想要修改的commit前的pick改成edit。
注意:这一步只是告诉 git 你将要修改哪些提交记录,还不是真正的修改提交信息。
pick 6934312 add 1
pick 5ce6dde add 2
修改为
edit 6934312 add 1
pick 5ce6dde add 2
接着按Esc,输入:wq 保存退出。
退出之后,git 会自动带我们回到我们选择edit的分支提交之后的版本,有冲突要先解决冲突,之后我们再使用 git add . 以及 git commit --amend 进行修改提交结果。
注意:这一步才是真正的修改提交信息内容。
git commit --amend // 以当前代码重新覆盖本次提交
或者:如果不用修改提交信息
git commit --amend --no-edit // 注意--no-edit的意思是不用再修改这个commit的commit信息
git commit --amend 之后,会出现vim窗口,按i进入编辑模式,修改提交信息,接着按Esc,输入:wq 保存退出。
git rebase --continue // 继续rebase,如果有冲突则解决冲突
全部修改完成之后我们执行 git rebase --continue,结束这次 rebase。
注意:如果有多个edit,则多重复几次上面的步骤(git commit --amend 和 git rebase --continue),把剩下要应用的变更应用完成。
直到出现以下提示,才说明全部修改已经完成。
Successfully rebased and updated refs/heads/master.
修改顺序其实很简单,我们只需要修改 git rebase -i 之后弹出的vim窗口里的提交记录信息即可。
pick 8b485bb add 1
pick a75ed74 add 2
修改为(把2行的位置换一下)
pick a75ed74 add 2
pick 8b485bb add 1
小技巧:这个是vi编辑器,首先
Esc,进入命令模式,移动到第一行 按dd,本行就被剪切,pick a75ed74 add 5就变成了第一行,接着按p刚刚剪切的就成了第二行,快速交换顺序
接着 Esc,:wq 保存退出。
我们只需要把pick修改成squash,git就会自动把所有 squash 的 commit 记录合并在一起。
pick 6934312 add 1
pick 5ce6dde add 2
修改为
squash 6934312 add 1
squash 5ce6dde add 2
接着 Esc,:wq 保存退出。
开始执行变更
然后 在弹出来的编辑框里 写提交信息,我们可以修改提交消息,默认是把两个消息都合并
接着 Esc,:wq 保存退出。
git log查看,合并成功。
有的时候一个commit非常巨大,我们可能也会想要将它拆分,其实操作也很简单。比如我们想要把commit 2 拆分成两条,首先,我们在rebase的时候将commit 2 前面的pick修改成edit。
pick 6934312 add 1
pick 5ce6dde add 2
修改为
pick 6934312 add 1
edit 5ce6dde add 2
接着 Esc,:wq 保存退出。
当我们退出的时候,我们会进入到 commit 2 刚刚提交完的状态。由于我们要做的是拆分 commit 2 这个提交,所以我们需要执行 git reset HEAD^,把上一次提交重置。然后再分别add我们想要拆分开来提交的文件,这样就把commit 2拆分成了两个commit插入到了历史记录当中了。
git reset HEAD^
git add test/*
git ci -m 'add test'
git add code/*
git ci -m 'update code'
git rebase --continue
You can fix this with 'git rebase --edit-todo'.
# 用 git rebase --edit--todo 来重新编辑命令
注意:如果我们的commit已经被提交到了远程,是不可以直接 git push 同步的,因为git会校验提交代码的hash值,发现对不上之后会禁止提交。所以如果想要提交到远程的话,只能使用 git push -f 强制覆盖。但是这是一个非常非常危险的操作,如果你 git push -f 了,会覆盖之前的提交记录,导致没人知道你修改了什么,所以只建议在自己独有的分支上如此操作,一定一定要谨慎使用。
1、要修改 id 为 commitid 的 commit。
2、运行 git rebase --interactive commitid^(指定commit的父commit)。
git rebase --interactive commitID^
// 或者
git rebase -i {commitID^} // 例如 git rebase -i d95ddfb
注意:我们要 rebase 到要修改的 commit 的前一个commit,即指定 commit 的父 commit。
3、在跳出的编辑器中,将 commitid 所在行的 pick 改成 edit,保存后退出。
4、进行想要的修改,并且 git add,然后用 git commit --amend --no-edit 进行 commit
注意:--no-edit的意思是不用再修改这个 commit 的 commit 信息。
5、git rebase --continue。这个命令会回到最初的HEAD commit。这里如果有冲突, 需要先解决冲突。
有时候可能会由于某些误操作,某些 git 命令会从您的视图中删除提交,例如:git reset 可能会从您当前的分支中删除提交,因此这些提交会从您的视图中消失,修改提交也会从您的视图中删除提交。
这时候可以使用 git reflog 命令,该命令允许您通过显示 HEAD 指针移动来查找此类提交。它将向您显示 git 最近创建的所有提交。这包括临时创建的提交,或者已经被删除的,在分支上不再可见的提交。
// 查看 HEAD 引用的完整更改历史记录
git reflog
# <output>
cf616d4 HEAD@{1}: reset: moving to 45ca2045be3aeda054c5418ec3c4ce63b5f269f7
# ... snip ...
1f1a73a HEAD@{2}: commit: More chaanges - typo in the commit message
45ca204 HEAD@{3}: commit: These are new changes
cf616d4 HEAD@{4}: commit (initial): Initial commit
# </output>
// 使用 reset 指定 commitID 来选择要恢复的记录
git reset --hard 1f1a73a
如果 rebase 过程中不想 rebase 了,可以使用
git rebase --abort // 终止rebase
--abort 和 --skip 的区别:
git rebase --abort 取消本次操作。是无风险的操作,会回到rebase操作之前的状态,2个分支的commits毫发无损。
git rebase --skip 跳过这个错误,继续本次操作。是高风险的操作,引起冲突的commits会被丢弃(这部分代码修改会丢失)。
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po