问个git和magit的问题: 合并分支的时候怎么跳过部分commit?

比如, 有的commit是针对该分支的临时方案, 不适用于其他分支, 其他分支可能有更完善的解决方法, 这样合并的时候, 就想自动跳过该commit.

能否实现这样的功能: 在这种特殊的commit的提交信息里写入特定的标识文字, 然后合并分支的时候, 可以自动跳过这样的commit.

git checkout -b tmp叉出一个临时分支(magit里直接用b s)然后用rebase删掉不要的commit记录。最后合并

1 个赞

这样是把想要的内容合并进来了, 但是分支之间的关系状态不对, git会认为这个特定分支(非临时分支)并没有合并到master, 这样时间长了会导致遗漏.

比如对emacs来说, emacs-26这个分支上有不少提交都不适用master, 他们会定期合并, 我看每次合并emacs-26的提交消息里有忽略某某commit的信息, 不知道他们怎么合并的, 有没有自动工具, 如果用你说的方法还是挺麻烦的.

或许可以先 merge,然后在 cherry pick 或 revert?

分支合并之前rebase?

你可以发一封邮件到emacs-devel上去问,抄送给[email protected](emacs的maintainer),这样就不怕没有人回复你了。

可你的确没合并进去啊,你只是cherry pick了特定commit而已

对, 如果有工具能自动revert也可以

rebase就有3楼说的问题

英语太烂了, 每次发个英文邮件都累得半死.

是的, 有点为难git了. 如果能合并后自动revert这些commit也可以.

不知道别人有没有遇到类似的使用场景.

感觉没什么必要,合并时合并所有的,然后 magit rebase 的时候可以选择 drop 掉某些 commit

这样push的时候会不会冲突?

多加一个分支 force push,然后等这个分支稳定了再合入 master

其他可以学不动,英语不行怎么搞技术啊。。

1 个赞

感觉你需要的功能可以通过平时好的commit习惯,如果有多个commit都是关于一个功能的,可以在需要的时候通过rebase interactive合并这些commit成为一个commit。

这样的话就没有多少commit,可以再通过cherry pick选择需要的commit。

P.S. 这样的功能其实可以通过magit的commit list view,然后magit filter下commit,再copy这些commit的revision id,然后一次性cherry pick。当然不一定有对应的filter功能,cherry pick也不一定支持多个revision id。不过可以尝试写几个函数实现你的需求。

阅读问题不大, 说不行

平时提交太频繁了, 一天二三十次. 如果这样合并的话, 一般得两三天提交一次才行. 其实这种commit倒是不多, 就是同一个问题不同分支用了不同的解决方法, 跟emacs一样, 同一个问题, 稳定分支会用非常保守(改动最小)的解决方法, 而master会用更完善的解决方法. 有冲突.

cherry pick会导致git认为该分支没有合并到master里, 如果查看两个分支之间相差的commit列表可能会有很多重复的

也是个办法, 想看看有没有更简单的办法

假设存在一个特殊分支b1,和一个正常分支dev。

那么正常的合并逻辑,应该是dev的commit合并到到b1。不管是用cherry-pick、merge、rebase都不会存在你说的要跳过某个commit的问题。

反过来,代码先提交到b1,然后合并dev(貌似这样有点蠢,既然都是特殊分支了,为什么要在这个分支上改动,再合并dev?)。直接cherry-pick不就行了么。

总的来说就一句话,特殊分支的代码不应该拿去给其他分支合并,只会合并其他分支代码。

跟emacs的分支对比,特殊分支是稳定分支即emacs-26,正常分支是开发分支即master。

像emacs隔一段时间把稳定分支合并到master并跳过部分commit,好像挺常见

刚试了一下, emacs的emacs-26应该是正常merge到了master, 我执行merge的时候, 提示"Already up to date."

emacs最近的几次merge:

commit 040b305752de07d9b564536afeb6a2d2b67e48b9
Merge: e7f16f00e1 4e59ad59a2
Author: Glenn Morris <[email protected]>
Date:   Thu Aug 29 11:11:24 2019 -0700

    ; Merge from origin/emacs-26

    The following commit was skipped:

    4e59ad5 Bump Emacs version to 26.3

commit e7f16f00e17c81b9550b4a96540b77bae6a4fc5d
Merge: 8e8ebd44ae 70829f8c22
Author: Glenn Morris <[email protected]>
Date:   Thu Aug 29 11:11:23 2019 -0700

    Merge from origin/emacs-26

    70829f8 ; ChangeLog.3 update

    # Conflicts:
    #       ChangeLog.3

commit 8e8ebd44ae292687007f36ee87119a91b3679184
Merge: 5a3e501edd a6d0172e83
Author: Glenn Morris <[email protected]>
Date:   Thu Aug 29 11:11:22 2019 -0700

    ; Merge from origin/emacs-26

    The following commit was skipped:

    a6d0172 * etc/AUTHORS: Update.

连续好几次merge, 里面提到跳过了部分commit, 但是看master的commit历史里有跳过的commit的hash, 应该是手工编辑了. 还搞不明白, 怎么到指定的commit停下来, 手工编辑