鉴于两个分支已经分歧,并且需要将一个分支(而不是所有内容)的特定提交引入另一个分支,git cherry pick就是这样.
一段时间后,需要完全合并两个分支.git将如何知道它已经过去曾经提交过的提交,以便它不会重新引入它?
我知道这git cherry-pick是一个用于应用指定提交更改的命令,但我认为我并不真正理解它的工作方式.
让我们说一个像这样的回购行为:
git init
echo a>a
git add .; git commit -am 'master add line a'
git checkout -b dev
echo b>>a
git commit -am 'dev add line b'
echo c>>a
git commit -am 'dev add line c'
git checkout master
git cherry-pick dev
Run Code Online (Sandbox Code Playgroud)
我认为cherry-pick命令会运行良好并将文件更改a为:
a
c
Run Code Online (Sandbox Code Playgroud)
但实际上我得到了以下信息:
error: could not apply 08e8d3e... dev add line c
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git …Run Code Online (Sandbox Code Playgroud) 用例:每次我想将提交从一个git分支移动到另一个git分支时,我执行以下操作序列:
git checkout 分支到上合并成git cherry-pick 针对提交git pushgit checkout 工作分支这是唯一的例外 - 每次我执行'git checkout'时,git工作目录内容被更改(预期)并导致我的IDE(IntelliJ IDEA)执行内部状态更新(因为受监视的文件系统子树被外部修改) ).这真的很烦人,特别是在大量小提交的情况下.
我看到两种方法:
我不喜欢第一种方法,因为它可能会忘记移动特定的提交.第二个看起来有点......不自然.
基本上,如果我能说git'将这个提交从名为branchX的分支移动到分支branchX + 1'而没有工作目录更新,那将是完美的.
问题:是否可以执行上述操作?
我正在接受跟随错误,而樱桃采摘一个gerrit ...有没有人知道这意味着什么,为什么有人会看到它?
error: addinfo_cache failed for path 'ROE/NAS/src/abc.c
Run Code Online (Sandbox Code Playgroud) 我有两个分支大师和开发
我需要从master分支中的开发分支获取一些提交ID,所以我通过cherry-pick来实现它,但它显示了一些错误
$> git cherry-pick cf0d52b
error: Commit cf0d52b900f990300c3aa17936ddbae1476d461a is a merge but no -m option was given.
fatal: cherry-pick failed
Run Code Online (Sandbox Code Playgroud)
我没有收到这个错误,为什么会出现这个错误,我将如何摆脱这个错误.
我试图了解如何撤消提交并将更改提交到Git中的其他分支?但我认为不一定要那么难.(答案正在使用branch -f,stash而且我认为我不需要那些.)
我在我的开发部门工作.在脏工作目录中有两个不同的提交.在两个不同的提交中提交所有更改.最后一次提交是WIP(所以开发材料).倒数第二个完成,应该复制到stable分支.
我想象的东西
$ git copy e87568fa stable
Run Code Online (Sandbox Code Playgroud)
但我很确定不是这样.
樱桃采摘与它有关吗?
可以肯定:我希望提交保持不变dev.所以不是mv,但cp它.
我仍然对所有这些GIT选项和命令感到困惑.
我正在尝试使用Gerrit实现'git-flow'类型的工作流程,但我似乎无法弄清楚最后一块拼图.
我的问题有两个先决条件:
我想要解决的是以下内容.考虑这个git情况:
Master 0
\
\
Develop 0-----0-----0-----0
Run Code Online (Sandbox Code Playgroud)
有一个master分支有一个commit和一个develop分支,它是从master分支出来的,有几个额外的提交.过了一会儿,开发分支被合并回master,以创建下一个生产版本.开发人员使用开发和严格变基的主题分支.在推动之前,他们的承诺总是在最新的上游开发之上进行重新设计.这应该导致线性历史记录并且只有快进提交.
现在假设某人从master创建了一个修补程序分支并合并回master:
Master 0--------0 HF
\
\
Develop 0-----0-----0-----0
Run Code Online (Sandbox Code Playgroud)
此提交现在仅合并到主分支,但开发人员需要在他们的开发分支中进行此提交,以在其更改中包含错误修复.通常你会合并master分支来开发develop分支,但考虑到我的前提条件,这是不可能的,因为它会创建一个本地合并提交.
我的问题是:如何将主分支中的新提交合并到本地开发分支中,以便开发人员的任何新更改都包含错误修复?理想情况下,我会修改我的脚本,首先将bugfix更改应用于本地开发分支(合并但没有合并提交),然后重新设置dev的提交并推送.这样,错误修复将自动添加到他们的新更改中,并将被视为这样,作为新提交的一部分,而不是单独的提交.
我一直在考虑可能的解决方案:
我希望我的问题很明确.如果需要进一步澄清,请告诉我.我知道我的工作流程非常严格,但与Gerrit结合使用会非常理想.如果无法完成,那么我可能会允许合并提交......
我遇到了git cherry-pick X会有一些冲突的情况,但也创建了额外的插入(经过验证git diff).
然后我重新跑了git show X > my.patch,然后patch -p1 < my.patch在我的树上做了.我得到了更好的结果,一些冲突,但结果更清晰.
git对樱桃挑选有什么特别之处?我使用git 1.7.0.4.
编辑:
通过更清晰的结果,我的意思是结果树匹配了更多的结果git show X,而git cherry-pick包括更多的代码.
在手册页中git cherry-pick:
...
-x
When recording the commit, append a line that says "(cherry picked
from commit …)" to the original commit message in order to indicate
which commit this change was cherry-picked from. ...
-r
It used to be that the command defaulted to do -x described above,
and -r was to disable it. Now the default is not to do -x so this
option is a no-op.
...
Run Code Online (Sandbox Code Playgroud)
是否有配置设置将本地默认设置为-x,并允许-r禁用它?我找不到一个,但我可能错过了它.
在Git中,cherry-pick至少在没有冲突时保留原始提交的作者,时间戳等.但有没有办法确定哪些用户执行了将该提交带到新分支的樱桃选择?
cherry-pick ×10
git ×9
gerrit ×2
merge ×2
branch ×1
commit ×1
config ×1
git-checkout ×1
git-flow ×1
rebase ×1