我是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 命令,它允许我在当前之上复制一些提交。然而,它确实解决了一些我不关心的冲突。樱桃挑选的替代方案是什么,它只是将选择的提交复制到当前提交之上?
我可以手动执行此操作:选择所需的提交,复制其文件,将它们保存到非托管文件夹中,选择当前提交(将作为新提交的基础),将存档文件复制到 git 工作文件夹中。另外,我必须复制提交消息。这是我目前为避免变更冲突而做的巨大麻烦。哪个命令可以帮助我自动实现目标?
我有两个分支dev和a。我需要将功能合并a到 中dev,但我的队友在一个文件中创建了某些功能,但尚未准备好合并。如果我只是使用我的合并和解析,git 会将此文件中的更改标记为无效,并且不会允许这些更改稍后合并,而是在我尝试重新合并分支时快进。如果我不解决冲突,git 将拒绝执行合并。
我解决此问题的策略是在旁边创建一个分支并抑制损坏的功能,然后合并到该分支中。问题是 git 命令变得有些复杂,所以我需要专家的帮助。
我希望如果可能的话将这种类型的操作概括为 git 扩展,我会调用一些达到git-cherrymerge.
步骤如下:
我不是filter-branchor方面的专家rebase,看起来我可以通过滥用它们来严重破坏历史。
我想我的问题是
我有两个主要分支,staging并且master. 我有一些提交,并且我已将这些更改推送到一个分支,假设xyz其基本分支正在暂存,并为分支创建了拉取请求staging。所有这些提交都被压缩为一个提交。
是否可以挑选这个压缩的提交并将此挑选应用于从 开始的新分支master,以便我master也可以为分支创建相同的拉取请求。
我在挑选一系列提交时遇到问题,并且不断发生冲突,无法弄清楚问题出在哪里。冲突不应该发生,因为提交是精心挑选的,添加/修改了接收分支中不存在的代码。
走走:
我挑选的提交来自一个名为 的分支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) 我想挑选从分支到另一个分支的单一提交.我希望文件重命名很常见,但仍希望能够在没有人为干预的情况下应用更改.
由于内置的cherry-pick命令没有接缝来检测重命名(至少在我的测试用例中),特别是与修改重命名的文件结合使用时.
我尝试了一下,最后想出了一个涉及两个rebase操作的解决方案.
让我们假设我有一个名为target的分支指向我想要应用cherry-pick的提交.我想要挑选的提交由名为source的分支指向.
然后我执行以下命令:
git rebase --strategy="recursive" --strategy-option="rename-threshold=30" target sourceTemp (可能使用另一个阈值;测试文件非常小,因此更改相对较大)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.
创建新的分支补丁后,将D重新映射到M上
A - B <--- target
/
M - D' <--- patch
\
C - D <--- source
Run Code Online (Sandbox Code Playgroud)合并C和D'以获取源代码
合并B和D'以获取目标的修补版本
A - B …Run Code Online (Sandbox Code Playgroud)我有一个与挑选提交和冲突有关的问题.
'Pro Git'一书解释了提交是一种快照,而不是补丁/差异.
但挑选樱桃可能会表现得像补丁一样.
以下示例,简而言之:
创建3个提交,每次编辑文件的第一行(和单行)
将分支重置为首次提交
test1:尝试樱桃挑选第三次提交(冲突)
测试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) 我有一个包含两个提交的pull请求,其中一个我愿意合并.
但是,pull请求已经关闭(未合并),并且从fork repo中删除了相应的分支.
有没有办法挑选那个提交?或者更一般地说,有没有办法合并一个关闭拉取请求而无法访问fork分支?
是否可以从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所有存储库一一挑选。但是,我相信会有一种更容易/更快捷的方式来挑选所有尚不知道的待处理的拉取请求;)
提前致谢
我了解到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不仅会应用这一提交,而且还会应用从普通提交开始的所有先前提交?如果是,则这些行中的唯一区别是在合并的情况下,新提交将具有来自这些分支的两个父提交。
cherry-pick ×10
git ×10
github ×3
merge ×2
pull-request ×2
git-rebase ×1
git-squash ×1
overriding ×1
renaming ×1