标签: cherry-pick

Git Cherry-Pick

我是git的新手,我知道git cherry-pick是如何工作的,但这是我的问题:

最近,我团队中的某个人更改了master中的目录结构,但没有更改另一个分支中的目录结构.

现在,当我对分支中的代码进行更改时,我想将它们(cherry-pick)带入master.这很好,直到master和branch中的目录结构相同.

topDir/some/subdir/file - master
topDir/some/other/subdir/file - branch

文件,其更改将被添加到master中是相同的,但不包含它所包含的目录结构.当我尝试以通常的方式进行樱桃选择时,我得到一个错误:

git checkout master git cherry-pick commit error:pathspec topDir/some/other/subdir/file不存在

现在,在这种情况下采摘樱桃的最佳方式是什么?任何指针都非常感谢.


好.我只是注意到,在同一个场景中,当我做一个挑选时,git足够聪明,可以从提交中正确选择其中一个文件,但不能识别另一个.

要使用我在原始帖子中提到的相同示例:在同一个提交中,topDir/some/subdir/file1,topDir/some/subdir1/file2.

我转到master,它有"file1"和"file2",只是在一个不同的目录结构中:topDir/src/some/subdir/file1 topDir/src/some/subdir1/file2.

现在,如果我做一个挑选,​​git足够聪明,可以获取file1中的更改​​,即使这是在不同的dir结构中,但不会获取file2的更改.有什么指针吗?如果有人希望我更清楚,我会很高兴.

所以,我所做的解决问题的方法是做一个樱桃选择,手动更改一个git没有拿起,以及"git commit -C.

git cherry-pick

3
推荐指数
1
解决办法
5593
查看次数

优先选择的替代方案

git 中有一个cherry-pick 命令,它允许我在当前之上复制一些提交。然而,它确实解决了一些我不关心的冲突。樱桃挑选的替代方案是什么,它只是将选择的提交复制到当前提交之上?

我可以手动执行此操作:选择所需的提交,复制其文件,将它们保存到非托管文件夹中,选择当前提交(将作为新提交的基础),将存档文件复制到 git 工作文件夹中。另外,我必须复制提交消息。这是我目前为避免变更冲突而做的巨大麻烦。哪个命令可以帮助我自动实现目标?

git overriding cherry-pick

3
推荐指数
1
解决办法
2301
查看次数

部分合并的 Git 工作流程?

我有两个分支deva。我需要将功能合并a到 中dev,但我的队友在一个文件中创建了某些功能,但尚未准备好合并。如果我只是使用我的合并和解析,git 会将此文件中的更改标记为无效,并且不会允许这些更改稍后合并,而是在我尝试重新合并分支时快进。如果我不解决冲突,git 将拒绝执行合并。

我解决此问题的策略是在旁边创建一个分支并抑制损坏的功能,然后合并到该分支中。问题是 git 命令变得有些复杂,所以我需要专家的帮助。

我希望如果可能的话将这种类型的操作概括为 git 扩展,我会调用一些达到git-cherrymerge.

步骤如下:

  1. 将用户指定的提交(也许这可以通过某种策略自动化)重放到临时分支上
  2. Git filter-branch 删除损坏的文件
  3. 压缩临时分支,添加自动提交消息
  4. 将临时分支合并到目标分支(这里是dev)

我不是filter-branchor方面的专家rebase,看起来我可以通过滥用它们来严重破坏历史

我想我的问题是

  1. 这会起作用还是有更好的规范方法来做到这一点?
  2. 我应该按什么顺序执行哪些 git 命令,以避免意外损坏我的存储库历史记录。

git version-control merge cherry-pick git-filter-branch

3
推荐指数
1
解决办法
314
查看次数

樱桃选择一个压扁的提交

我有两个主要分支,staging并且master. 我有一些提交,并且我已将这些更改推送到一个分支,假设xyz其基本分支正在暂存,并为分支创建了拉取请求staging。所有这些提交都被压缩为一个提交。

是否可以挑选这个压缩的提交并将此挑选应用于从 开始的新分支master,以便我master也可以为分支创建相同的拉取请求。

git cherry-pick git-squash

3
推荐指数
1
解决办法
2296
查看次数

挑选一系列提交不起作用,但个别挑选工作

我在挑选一系列提交时遇到问题,并且不断发生冲突,无法弄清楚问题出在哪里。冲突不应该发生,因为提交是精心挑选的,添加/修改了接收分支中不存在的代码。

走走:

我挑选的提交来自一个名为 的分支FeatureX,提交看起来像这样:

>> git log --oneline

cbd0d94ca312 (HEAD -> FeatureX) Version 6
e1da344f20b7 Version 5
a9875369a8e4 Version 4
44d7975d975f Version 3
6955a667be84 Version 2
c7c70076c435 Version 1
Run Code Online (Sandbox Code Playgroud)

现在,我有另一个名为 的分支MainCode,我想在该分支上从FeatureX分支中挑选上述提交。如果我单独挑选它们:

>>git cherry-pick c7c70076c435
[MainCode 7850ed1c4a4d] Version 1
 Date: Sat Jun 13 19:59:04 2020 -0700
 2 files changed, 321 insertions(+), 1 deletion(-)
 create mode 100644 STHelper.cs

>>git cherry-pick 6955a667be84
[MainCode df98023a9ac9] Version 2
 Date: Tue Jun 16 15:36:24 2020 -0700
 1 file changed, 68 …
Run Code Online (Sandbox Code Playgroud)

git version-control github cherry-pick

3
推荐指数
1
解决办法
154
查看次数

当重命名文件很常见时,替代git cherry-pick

我想挑选从分支到另一个分支的单一提交.我希望文件重命名很常见,但仍希望能够在没有人为干预的情况下应用更改.

由于内置的​​cherry-pick命令没有接缝来检测重命名(至少在我的测试用例中),特别是与修改重命名的文件结合使用时.

我尝试了一下,最后想出了一个涉及两个rebase操作的解决方案.

让我们假设我有一个名为target的分支指向我想要应用cherry-pick的提交.我想要挑选的提交由名为source的分支指向.

然后我执行以下命令:

  1. create branch sourceTemp指向与源相同的提交(因为我想保留分支源)
  2. git rebase --strategy="recursive" --strategy-option="rename-threshold=30" target sourceTemp (可能使用另一个阈值;测试文件非常小,因此更改相对较大)
  3. git rebase --onto target sourceTemp~ sourceTemp

这仅适用于分支源中最后一次提交引用到目标的更改.

我也把测试放在github上:

https://github.com/fraschfn/cherry-pick

我想知道的是,如果这种方法是可行的,或者只是在我简单的测试设置中有效的话!

更新:替代方法

我将补丁重新绑定到目标的合并基础:

开始的情况

    A - B     <--- target
   /
  M 
   \
    C - D     <--- source
Run Code Online (Sandbox Code Playgroud)

我想樱桃挑选D到B.

  1. 创建新的分支补丁后,将D重新映射到M上

      A - B     <--- target
     /
    M - D'      <--- patch
     \
      C - D     <--- source
    
    Run Code Online (Sandbox Code Playgroud)
  2. 合并C和D'以获取源代码

    合并B和D'以获取目标的修补版本

       A - B …
    Run Code Online (Sandbox Code Playgroud)

git renaming git-rebase cherry-pick git-cherry-pick

2
推荐指数
1
解决办法
4865
查看次数

cherry-picking commit - 提交快照或补丁?

我有一个与挑选提交和冲突有关的问题.

'Pro Git'一书解释了提交是一种快照,而不是补丁/差异.

但挑选樱桃可能会表现得像补丁一样.


以下示例,简而言之:

  1. 创建3个提交,每次编辑文件的第一行(和单行)

  2. 将分支重置为首次提交

  3. test1:尝试樱桃挑选第三次提交(冲突)

  4. 测试2:尝试樱桃挑选第二次提交(OK)


mkdir gitlearn
cd gitlearn

touch file
git init
Initialized empty Git repository in /root/gitlearn/.git/

git add file

#fill file by single 'A'
echo A > file && cat file
A

git commit file -m A
[master (root-commit) 9d5dd4d] A
 1 file changed, 1 insertion(+)
 create mode 100644 file

#fill file by single 'B'
echo B > file && cat file
B

git commit file -m B
[master 28ad28f] B …
Run Code Online (Sandbox Code Playgroud)

git cherry-pick

2
推荐指数
1
解决办法
344
查看次数

从没有叉分支的闭合拉请求樱桃采摘

我有一个包含两个提交的pull请求,其中一个我愿意合并.

但是,pull请求已经关闭(未合并),并且从fork repo中删除了相应的分支.

有没有办法挑选那个提交?或者更一般地说,有没有办法合并一个关闭拉取请求而无法访问fork分支?

git github cherry-pick pull-request git-cherry-pick

2
推荐指数
1
解决办法
235
查看次数

可以从github上挑选所有PR(pull request)吗?

是否可以从github上挑选所有待处理的PR?

假设我有来自4个不同的分支存储库的4个PR等待审核。我需要将所有这些都应用于最新的源代码。

PR#65 Do something
PR#61 Notify this
PR#55 Fix that
PR#42 Show there
Run Code Online (Sandbox Code Playgroud)

我知道我可以将git remote add所有存储库一一挑选。但是,我相信会有一种更容易/更快捷的方式来挑选所有尚不知道的待处理的拉取请求;)

提前致谢

git github cherry-pick pull-request git-cherry-pick

2
推荐指数
1
解决办法
2968
查看次数

Git Cherry-Pick vs合并分支

我了解到Cherry-pick是为应用一些中间提交而发明的,但之间确实存在任何区别:

git cherry-pick last_commit_from_branch
Run Code Online (Sandbox Code Playgroud)

git merge some_branch
Run Code Online (Sandbox Code Playgroud)

据我了解,git不仅会应用这一提交,而且还会应用从普通提交开始的所有先前提交?如果是,则这些行中的唯一区别是在合并的情况下,新提交将具有来自这些分支的两个父提交。

git merge cherry-pick

2
推荐指数
1
解决办法
4155
查看次数