- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我经常 rebase 。偶尔的rebase
尤其成问题(很多 merge 冲突),我在这种情况下的解决方案是 cherry-pick
个人提交到主分支。我这样做是因为几乎每次我这样做时,冲突的数量都要少得多。
我的问题是为什么会这样。
为什么我 cherry-pick
时 merge 冲突较少比当我rebase
?
在我的心智模型中 rebase
和一个 cherry-pick
正在做同样的事情。
rebase 示例
A-B-C (master)
\
D-E (next)
git checkout next
git rebase master
A-B-C (master)
\
D`-E` (next)
git checkout master
git merge next
A-B-C-D`-E` (master)
A-B-C (master)
\
D-E (next)
git checkout master
git cherry-pick D E
A-B-C-D`-E` (master)
A-B-C (master)
\
D-E (next)
\
F-G (other-next)
git checkout next
git rebase master
git checkout master
git merge next
A-B-C-D`-E` (master)
\ \
\ D`-E` (next)
\
D-E
\
F-G (other-next)
git checkout other-next
git rebase master
A-B-C-D`-E`-F`-G` (master)
git checkout master
git cherry-pick F G
A-B-C-D`-E`-F`-G` (master)
最佳答案
更新的答案(请参阅相关更新)
我认为这里发生的事情与选择要复制的提交有关。
让我们注意并搁置,git rebase
可以使用 git cherry-pick
或 git format-patch
和 git am
来复制一些提交。在大多数情况下,git cherry-pick
和 git am
应该达到相同的结果。 ( git rebase
documentation 特别指出上游文件重命名是cherry-pick 方法的一个问题,而不是默认的基于 git am
的非交互式 rebase 方法。另请参阅下面原始答案中的各种括号注释和评论。)
这里要考虑的主要事情是要复制哪些提交。在手动方法中,您首先手动将提交 D
和 E
复制到 D'
和 E'
,然后手动将 F
和 G
复制到 F'
和 G'
。这是最少的工作量,正是我们想要的;这里唯一的缺点是我们必须做的所有手动提交识别。
使用命令时:
git checkout <branch> && git rebase <upstream>
All changes made by commits in the current branch but that are not in <upstream> are saved to a temporary area. This is the same set of commits that would be shown by
git log <upstream>..HEAD
; or bygit log 'fork_point'..HEAD
, if--fork-point
is active (see the description on--fork-point
below); or bygit log HEAD
, if the--root
option is specified.
--fork-point
复杂性有点新,因为 git 2.something,但在这种情况下它不是“事件的”,因为您指定了
<upstream>
参数并且没有指定
--fork-point
。实际的
<upstream>
两次都是
master
。
git log
(使用
--oneline
使其更好):
git checkout next && git log --oneline master..HEAD
git checkout other-next && git log --oneline master..HEAD
D
和
E
— 太好了! - 但第二个列出了
D
、
E
、
F
和
G
。哦哦,
D
和
E
出现了两次!
Note that any commits in HEAD which introduce the same textual changes as a commit in HEAD..<upstream> are omitted (i.e., a patch already accepted upstream with a different commit message or timestamp will be skipped).
HEAD..<upstream>
与我们刚刚运行的
<upstream>..HEAD
命令中的
git log
相反,在那里我们看到
D
-through-
G
。
git log HEAD..master
中没有提交,因此没有可能被跳过的提交。这很好,因为没有要跳过的提交:我们将
E
和
F
复制到
E'
和
F'
,这正是我们想要的。
git log HEAD..master
将向您显示提交
E'
和
F'
:我们刚刚制作的两个副本。这些可能被跳过:他们是考虑跳过的候选者。
git patch-id
中,虽然它实际上是直接在
git rev-list
中实现的,这是一个非常花哨和复杂的命令。然而,这些都没有真正很好地描述它,部分原因是它很难描述。无论如何,这是我的尝试。 :-)
D
和提交
D'
具有相同的补丁 ID!我应该跳过复制
D
因为
D'
可能是复制
D
的结果。”它可以对
E
与
E'
做同样的事情。这通常有效——但是每当从
D
到
D
的复制需要手动干预(修复 merge 冲突)时,
D'
就会失败,并且每当从
E
到
E
的复制需要手动干预时,
E'
也会失败。
D
复制
G
- 实际上非常简单,您可以使用以下命令手动执行此操作:
$ git checkout -q other-next && git rebase master
[here rebase copies D, E, F, and G, perhaps with your assistance]
$ git checkout next
[here git checks out "next", so that HEAD is ref: refs/heads/next
and refs/heads/next points to original commit E]
$ git reset --hard other-next~2
other-next
命名提交
G'
,其父级是
F'
,其父级又是
E'
,这就是我们希望
next
指向的地方。由于
HEAD
指的是分支
next
,
git reset
调整
refs/heads/next
指向提交
E'
,我们就完成了。
A1-A2-A3 <-- featureA
/
...--o--o--o--o--o--o--o <-- master
\
*--*--B3-B4-B5 <-- featureB
\
C3-C4 <-- featureC
featureA
进行 rebase ——三个
A
提交都不依赖于除了早期的
A
提交之外的任何“非主”——而是复制五个
B
提交和四个
C
提交,我们必须复制
*
和
B
的两个
C
提交,但只复制一次,然后将剩余的三个和两个提交(分别)复制到复制提交的尖端。
git status
真正理解它,要困难得多。)
-m
或
--merge
添加到普通
git rebase
,实际上确实使用
git cherry-pick
,而默认的非交互式 rebase 使用
git format-patch
和
git am
代替。后者不太适合重命名检测。特别是,如果上游有文件重命名,1 交互式或
--merge
rebase 的行为可能会有所不同(通常更好)。
git patch-id
相同的提交,通过
git rev-list --left-only --cherry-pick HEAD...<upstream>
或等效的提交已经在上游提交。参见
the documentation for git rev-list
,特别是部分在
--cherry-mark
和
--left-right
上,我认为这使这更易于理解。不过,这对于两种 rebase 应该是相同的;如果您手动挑选,则取决于您是否这样做。)
git diff --find-renames
需要相信那里有重命名。通常,如果存在,它就会相信这一点,但由于它是通过比较树来检测它们的,因此这并不完美。
关于git - 为什么 git cherry-pick 会比 git rebase 产生更少的冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38251859/
有什么区别 import { pick } from 'lodash'; 和 import pick from 'lodash/pick'; (请注意,第二个是'lodash/pick',而不仅仅是'
我试图只让祖先的一些属性暴露在我的后代上。我尝试通过Pick来实现 export class Base { public a; public b; public c; } ex
我这里有 2 个分支,比如 branch1 和 branch2。 branch1 增加了很多新功能,branch2 是稳定的。今天,我只想将 1 个功能从 branch1 merge 到 branch
我正在尝试使用 git rebase -i HEAD~19 删除提交列表。我过去曾成功地使用过此方法,但是当我尝试运行然后退出 vim 而不进行任何更改(:q!)时,我收到此错误: The previ
我正在使用网格主题并尝试完成默认为“选择尺寸”而不是product.liquid 中的“小”的自定义。 (客户看到太多来自订购默认尺寸的人的错误“小”订单)。 解决这个问题: https://docs
我想输入一个名为 pick 的函数,我知道 typescript 内置了 Pick ,现在我想实现实际的源码使用部分,但是我卡住了。 这个函数的作用是pick提供object基于给定字符串的属性并返回
我有一个用例,我认为它非常适合 Typescript 的 Pick类型。 这是一个简化的例子: interface CreditCard { name: string; year: numbe
假设我有分支 A 和 B。 A: a b c d B: a b c e 我想从分支 B 获取提交 e 并将其放在分支 A 的提交 d 下。所以我最后的结果应该是这样的 A: a b c e d 怎么做
我有两个 pandas 数据框,data1 和 data2 它们显示在图表上。我可以点击该点来显示该点的信息。但仅来自一个数据集。如何将它用于两个数据集?我还需要显示来自另一个通过索引访问数据的数组的
我是 git 的新手,我确实了解 git cherry-pick 的工作原理,但这是我的问题: 最近,我的团队中有人更改了 master 中的目录结构,但没有更改另一个分支中的目录结构。 现在,当我在
我在大学里使用 git 大约几年了,老实说,我仍然不知道自己在做什么。 我不确定我的标题是否恰本地描述了我遇到的问题,但基本上,在开发特定功能时,我已经向 master 分支提交了一堆。现在我已完成开
我有两个具有相似架构的存储库: repo1: - file1 - file2 *(this file is non-existent in repo2) - folder - file3
我一直在尝试从一个分支中挑选一个特定的提交到另一个分支。假设我的历史是这样的: A - B - C - D (master) \ X - Y (feature)
如果我将这一行用作数组,我不确定为什么会出现问题以及如何修复它: Pick[] Sandbox . 如果我使用 never 而不是条件类型,那么必填作者字段就会出现另一个问题。 Sanbox 2 沙盒
我不太了解 cherry-pick。只需要清除 cherry-pick 命令在不同分支中生成相同提交的不同哈希码?实际上,我正在挑选不同分支中的哈希码。在这里我注意到它正在生成现有提交的不同哈希码。是
picks :: [a] -> [(a, [a])] picks [] = [] picks (x:xs) = (x,xs) : [(y,x:ys)| (y,ys) <- picks xs] pick
我已经单独尝试了 Num((today()-I_TRAN_DATE)/90 + 1,0) 并且它会返回整数,但是当我尝试将它与 pick 函数结合使用时它似乎不起作用。我知道它还没有完成,但至少应该返
此问题专门针对 Minecraft,但它会影响我计算机上运行的所有 Java 程序。 似乎有什么东西强行设置了 _JAVA_OPTIONS 环境变量。当我运行我的服务器时,我已指定为其分配 4 GB
我想知道是否有办法将一个提交复制到另一个分支而不检查该分支。 例如,我有两个分支:master和 parallel_version . 我在 parallel_version分支,我在这些分支的常见文
给定以下内容: 1 1 4 2
我是一名优秀的程序员,十分优秀!