【问题标题】:avoid repeat commits when cherry-pick from master to branch, then merge from branch back to master避免在从 master 到分支的cherry-pick 时重复提交,然后从分支合并回 master
【发布时间】:2012-01-25 01:06:09
【问题描述】:

我在 git 中有两个分支,master/ 和 1.7/。我使用cherry-pick将一些修复从master/移植到1.7/。 (我没有使用合并,因为我只想要一些更改。):

$ git checkout 1.7
$ git cherry-pick -x <initial commit SHA>..<master change 2 SHA>

稍后,我将 1.7/ 合并回 master/,因为我希望将所有已进入 1.7/ 的更改(除了樱桃精选本身)合并回主线:

$ git checkout master
$ git merge 1.7

我的问题是,这会将cherry-picks(最初来自 master/)再次提交到 master/:

$ git log --oneline
8ecfe22 Merge branch '1.7'
fe3a60d master change 2 (cherry picked from commit f5cca9296e45d5965a552c45551157ba
9c25f53 master change 1 (cherry picked from commit 8fae2a68a356f5b89faa8629b9a23b23
f5cca92 master change 2
8fae2a6 master change 1
ffa10bf initial commit

在我的真实存储库中,它甚至导致了合并冲突。

所以我的问题是,我可以避免这种情况吗(如果可以,如何避免)?

重现此行为的完整命令列表:

$ git init
<create Dialog.js file>
$ git add Dialog.js
$ git commit -am "initial commit"
$ git branch 1.7

<edit Dialog.js file>
$ git commit -am "master change 1"
<edit Dialog.js file>
$ git commit -am "master change 2"
$ git log

$ git checkout 1.7
$ git cherry-pick -x <initial commit SHA>..<master change 2 SHA>

$ git checkout master
$ git merge 1.7
$ git log

【问题讨论】:

    标签: git merge cherry-pick


    【解决方案1】:

    当你挑选时,除非你使用快进选项-ff,否则你正在创建新的提交,当你合并回来时,git 必须合并这些提交,即使它们实际上可能是无操作的。

    在这里,Rebase 可能会对您有所帮助,而不是合并:

    git rebase master 1.7
    

    然后现在,合并分支(如果需要。)

    Cherry-pick 最适用于您想要从您原本要丢弃的分支中获得小的更改。您的工作流程应基于适当的合并或变基。

    【讨论】:

    • 是的,我可以想象 rebase 工作,尽管在 git 社区中,在分支上调用 rebase 被认为是一种致命的罪过。还有另一种方法吗?我可以使用“git merge”将更改从 master/ 移动到 1.7/,但以某种方式过滤它合并的更改吗?像类似于 rebase -i 的 -i 选项?如果我这样做了,git 会记住哪些更改来自 master/ 并且以后不会尝试将它们重新合并回 master 吗?
    • 糟糕,上面我的意思是输入“在 public 分支上调用 rebase 被认为是一种致命的罪过”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    相关资源
    最近更新 更多