git 压缩git revert多个commit commit 为一个,是否有非交互式的

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
如果我有一个仓库里有2000个commit,有办法合并比如第1到1000个commit为一个commit吗?通过手动reset再stash的方式10来个还好,数量一大就不合适了!
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
如果是合并连续的commit,用git rebase -i比较适合,把commit标注为squash可以将其并入前一个commit。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
有办法,建议你看看摘樱桃 $ git cherry-pick 应该就会明白了
参考链接:
希望有所帮助~ :)
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。没有更多推荐了,
不良信息举报
举报内容:
使用git rebase合并多次commit
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!IDEA 合并多次commit为一个? - 知乎5被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答81 条评论分享收藏感谢收起拒绝访问 | www.v5bjq.com | 百度云加速
请打开cookies.
此网站 (www.v5bjq.com) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(b43ad-ua98).
重新安装浏览器,或使用别的浏览器posts - 5,&
comments - 1,&
trackbacks - 0
原文地址:http://platinhom.github.io//git-combine_commit/
有时commit多了看着会不爽.所以想合并掉一些commit. 这里是最简单的情况, 一条线下来N个commit, 合并掉末端的(没有branch出去的).
假设有a,b,c,d四个commit, 从新到旧是a, b, c, d (也就是先d-&c-&b-&a). 四个commit的SHA-1分别是a1,b1,c1,d1.
合并commit只能倒退, 就是说把a合到b(老的),顺序是abc可以合并起来成k, 最后成k, d这样.
# git log |head
git rebase -i d1
# if fail, use git rebase --abort
git push --force
git log可以查看commit的情况, 配着head命令可以查看前几个.&git log --pretty=oneline一行一个commit更好了
rebase前需要把状态push掉. 就是说不能有unstaged的修改.
-i&是选择不动的commit, 比他新的commit都有被修改的可能.
执行rebase后如果出错或者merge冲突什么退出来, rebase会被锁定, 再次执行时, 提示有三个选项:
git rebase --abort来忽略之前的rebase尝试,并恢复HEAD到开始的分支.
git rebase --continue就继续上次修改, 一般是rebase中间处理merge冲突后使用.
git rebase --skip是重新开始rebase并跳过现在所进行的处理.
执行rebase后会像commit一样进入编辑状态, 在开始会是几个commit的SHA值, 从上到下是越来越新的commit. 如果没有比-i指定的心的话会出现noop.
开始状态所有出现的commit前面都是pick. 这个pick是对该commit进行的操作, 有:
pick就是说保留该commit, 也可以用缩写p. (黄色)
squash, 使用该commit但合并到前一个老的commit去(常用). 可以用缩写s代替 (绿色).
reword, 和pick类似, 但可以修改commit时的提交信息(中间会弹出来让你修改commit).可以用缩写r代替 (紫红色).
edit, 使用commit, 但停下来进行修改, 可能用于merge冲突.可以用缩写e代替.
fixup, 和squash类似, 但会舍弃commit信息. 可以用缩写f&(红色)
exec, 执行shell命令.可以用缩写x
如果该commit是空commit, 前面会被注释掉#. 会被自动删除.
执行完修改后,:wq退出vi, 这时开始进行rebase操作(1/10 这样倒数). 中间会再次弹出修改文件, 此时是修改commit信息, 可以修改每次commit的信息(如果是fixup会忽略掉commit提交信息). 最后这个合并后的新commit显示的信息可能是多个commit的集合(多行).不想修改或改完后直接:wq退出vi即可.
所以都完成后需要一次强制的push, 要加入--force覆盖掉github上的commit.git push --force
例如我上面-i d1会修改3个commit, 保留最老最上最靠近d1的c (用reword或者pick都可以),其余a1和b1合并掉(squash或者fixup).最后生成一个新commit叫c2(就是3个合在一起了).所以从新到旧有c2, d1.
阅读(...) 评论()

我要回帖

更多关于 git commit 非常慢 的文章

 

随机推荐