如何git cherrypick在特定分支中引入的所有更改

Val*_*ion 23 git merge git-cherry-pick

背景资料:

由于现有系统的工作流程受到限制,我们需要建立一个有点非正统的git过程.

(patch)    A-B---F
             |   |
(hotfix)     C-D-E
                 |
(dev)      1-2-3-G
Run Code Online (Sandbox Code Playgroud)

在补丁分支上,有一些提交.这里的文件与dev上的文件类似但不完全相同(同步脚本按照许多文件中的设置顺序切换,使它们在功能上相同时显示为已更改).

此分支需要修复,以便创建并处理修补程序分支.然后,这个分支合并回补丁,到目前为止,非常好.

需要将相同的修补程序部署到dev分支,以使其与修补程序保持相对同步,但尝试合并修补程序分支会导致git尝试合并来自A和B的所有不相关和"未更改"的文件,而不是只有C,D和E.

题:

看起来,cherry-pick做了我们想要的只是从选择的提交中获得更改,但我真的想要一种方法来同时挑选给定分支中的所有提交,而不必每次都查找提交ID .

Cod*_*ard 37

看来,cherry-pick做什么,我们想在只获得了从选择提交更改条款,但我真的很喜欢的方式来摘樱桃在一个给定的分支一次全部提交,而不必每次查找提交IDS.


运用 cherry-pick

git cherry-pick允许您选择在任何分支中对任何其他分支进行的任何提交.在您的情况下,您可以简单地检查主分支,然后检查cherry-pick您希望的任何分支的所有提交(cherry-pick支持范围,以便您可以指定开始和结束提交,而不是列出所有提交).

这样,您可以控制提交在所需分支中的显示方式.

例如:

git cherry-pick ebe6942..905e279
Run Code Online (Sandbox Code Playgroud)
# Find the range of commits you wish to re-add to your branch.
# then use cherry-pick to add them back to the branch
git cherry-pick start..end

# If you wish to include the start commit as well add the ^
# This will result in a cherry-pick of the start commit included as well 
git cherry-pick start^..end
Run Code Online (Sandbox Code Playgroud)

如何找到第一个分支提交?

git log

 # print out the latest commit (first one) of the given branch
 git log  --oneline | tail -1
Run Code Online (Sandbox Code Playgroud)

merge-base

使用该merge-base命令查找分支从原始分支拆分的位置:

git merge-base A B
Run Code Online (Sandbox Code Playgroud)

  • 是的,但这仍然需要我查看日志并找到相关的提交ID.我正在寻找类似`git cherry-pick hotfix`的东西,它会自动找到这个分支中的提交,就像`git cherry-pick D ^ .. E`而不必提供ID. (6认同)
  • `git log <分支> --oneline | head -1` 给出了 `<branch>` 上的最新提交。或者你可以这样做: `gitcherry-pick $(git merge-base AB)..B` (3认同)

Lin*_*nji 13

如果您想从分支 dev 中挑选所有提交。

尝试:

git 樱桃选择 ..dev

  • 这显然选择了所选分支的整个历史记录,包括分支创建之前的更改。考虑一下这并不奇怪,因为对于 git 来说,分支只是指向分支当前提交的指针。这意味着 git 找不到第一个提交。 (3认同)
  • 据我所知并测试,此命令将自动找到两个分支的合并基础。并且只选择合并基础之后的提交。 (2认同)

Jos*_*osh 5

假设您知道希望从分支中选择的提交数量,您可以使用相对提交表示法。

git cherry-pick BRANCH_A~10^..BRANCH_A

这将~10优先选择从 ( ) BRANCH_A 的 HEAD之前的 10 个提交开始的所有提交,包括起始提交 ( ^),并将获取范围 ( ..) 到 BRANCH_A 的 HEAD 的所有提交。


nim*_*cap 5

一个班轮将是:

git cherry-pick $(git merge-base master my/branch)..my/branch
Run Code Online (Sandbox Code Playgroud)

您还可以将其转换为 git 别名或 bash 函数。我更喜欢这样使用它,所以我只改变一个地方:

BRANCH=my/branch; git cherry-pick $(git merge-base master ${BRANCH})..${BRANCH}
Run Code Online (Sandbox Code Playgroud)

  • 正常工作,在我看来,这是这里唯一的解决方案,不会对用户提出如此简单的请求提出不合理的要求。最重要的是,这是一个非常正常和普遍的问题。如果您尝试为项目做出贡献并使用了错误的基础分支,则必须移动它。这就是你需要做的。您不想破坏两个基本分支之间的提交差异,因为您不是这些分支的维护者。 (3认同)