我收到一个奇怪的错误:
git cherry-pick a0cd8fe
fatal: bad revision 'a0cd8fe'
这是为什么?
请注意,合并到的分支a0cd8fe已被删除。这就是我收到此错误的原因吗?
我从远程存储库中获取了一个特定的错误修复。现在我有两个选择:
git checkout FETCH_HEADgit cherry-pick FETCH_HEAD我不确定这两种情况下发生了什么。我已经尝试了第一个版本,在我看来,通过这种方式,我将远程存储库中的更改放入了本地存储库,但我的本地更改似乎丢失了(我在代码中没有看到它们)。但是,第二个选项似乎可以满足我的需要(我在代码中看到了我的更改和来自远程存储库的更改)。
虽然看起来我得到了我需要的东西,但我仍然想更好地了解这两种情况下会发生什么。
我看过这个问题和答案,但我不明白答案,因为我不知道以下短语是什么意思:
gitcherry-pick 中是否有内置选项来保留原始作者和提交者?不使用脚本,在挑选多个提交时尤其需要。
查看官方文档 ,我没有看到任何选项,我错过了什么吗?
我如何挑选 commitC4和C5?

我\xe2\x80\x99已经尝试过git cherry-pick C4..C5,但我只得到C4. \n我想我不\xe2\x80\x99真正理解这个范围的事情是如何工作的。
我知道git cherry-pick和git apply终端系统。但是今天我遇到了一些问题。我通过使用两个修订版的差异来应用一个补丁。我使用以下命令:
git diff HEAD> diff.patch
git apply diff.patch
我的补丁申请失败了一个文件。
然后,我只是想尝试挑选 commit-id2。它被成功挑选。
可能是什么原因?任何人都想对同一事物有所了解。
我想从我的currentrepo 中的特定提交添加一些特定的更改到我的upstreamrepo。
运行这样的东西:
git push upstream <commit SHA>:<remotebranchname>
添加提交加上所有以前的更改
运行类似
git checkout -b new-branch
git pull <remote> <upstream branch> branch is
git cherry-pick <commit hash>
git push <remote> new-branch
Run Code Online (Sandbox Code Playgroud)
还写入所有以前的更改。
我只想将该提交的特定更改写入upstreamrepo,因此它不包括我的currentrepo 中先前提交所做的更改,这些更改不在upstream.
有很多关于在计算器上的信息的cherry-pick和rebase,但没有回答这个非常具体的问题。
我职业生涯的大部分时间都在使用 Perforce,并且仍在习惯 git,所以我想我要么没有意识到我的场景与以下帖子中的场景不匹配,要么我错过了一些隐式步骤对于普通 git 用户来说是显而易见的,但对我来说却不是。
\n似乎每当我精挑细选时,我最终都会得到一个没有任何更改的分支(不过这是有道理的,因为它们已经致力于掌握,对吗?\xe2\x80\x94那么我如何创建这个“主题分支”我看到有人提到了?)现在我运行了几个我不完全理解的命令(例如git remote add ...),并且还可能将原作者的存储库与我的分叉存储库互换,所以它变得很难说是否因为我弄乱了我的环境而无法正常工作。
@Omer 的回答效果很好。然后我做了一个
\ngit reset --hard HEAD\nRun Code Online (Sandbox Code Playgroud)\n清理。原作者合并了 PR,我同步到它:
\ngit remote add upstream git://github.com/<author>/<repo>.git\ngit pull upstream master\nRun Code Online (Sandbox Code Playgroud)\n gitcherry-pick 允许简单地通过指示哪个合并父级应该用作基线来选择简单的合并。例如:
git cherry-pick -m 1 1234abcdef
Run Code Online (Sandbox Code Playgroud)
我有一堆提交想要挑选,其中一些可能是合并,而其他则不会。我希望能够使用 git rebase 来挑选所有这些提交,如下所示:
git rebase -i --onto myBranch myBranch
Run Code Online (Sandbox Code Playgroud)
并将选择列表放入交互式文件中:
p 1234
p 3224
... a bunch more picks
p abcde
Run Code Online (Sandbox Code Playgroud)
而且,如果 git rebase 在这些提交中遇到合并,我想指定相当于cherry-pick 的-m 1选项,以指示应针对第一个父级选择更改。
我尝试了一些与合并相关的选项来变基,但最终总是收到错误:
commit 3c4ffe04532 is a merge but no -m option was given.
Run Code Online (Sandbox Code Playgroud)
(即使我指定 -m 来变基。)
我意识到我可以使用cherry-pick 编写一个脚本,但我喜欢现有的行为rebase -i(它运行在命令列表中,如果遇到无法处理的情况则暂停)。我非常想直接利用该逻辑,但我一直无法找到正确的方法来巧妙地使用 rebasepick命令来填补这一空白。
有没有办法让 rebase 采用cherry-pick 的-m #行为pick?
为了以另一种方式陈述我的目标并帮助澄清问题 - 我想使用 git-rebase 的--i功能来协调一系列git cherry-picks,以便可以手动解决流程中的任何合并冲突,然后可以使用--continue …
我想挑选从分支到另一个分支的单一提交.我希望文件重命名很常见,但仍希望能够在没有人为干预的情况下应用更改.
由于内置的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)我有一个包含两个提交的pull请求,其中一个我愿意合并.
但是,pull请求已经关闭(未合并),并且从fork repo中删除了相应的分支.
有没有办法挑选那个提交?或者更一般地说,有没有办法合并一个关闭拉取请求而无法访问fork分支?
git ×10
git-cherry-pick ×10
git-rebase ×3
cherry-pick ×2
pull-request ×2
git-commit ×1
git-fetch ×1
git-fork ×1
github ×1
renaming ×1