背景资料:
由于现有系统的工作流程受到限制,我们需要建立一个有点非正统的git过程.
(patch) A-B---F
| |
(hotfix) C-D-E
|
(dev) 1-2-3-G
Run Code Online (Sandbox Code Playgroud)
在补丁分支上,有一些提交.这里的文件与dev上的文件类似但不完全相同(同步脚本按照许多文件中的设置顺序切换,使它们在功能上相同时显示为已更改).
此分支需要修复,以便创建并处理修补程序分支.然后,这个分支合并回补丁,到目前为止,非常好.
需要将相同的修补程序部署到dev分支,以使其与修补程序保持相对同步,但尝试合并修补程序分支会导致git尝试合并来自A和B的所有不相关和"未更改"的文件,而不是只有C,D和E.
题:
看起来,cherry-pick做了我们想要的只是从选择的提交中获得更改,但我真的想要一种方法来同时挑选给定分支中的所有提交,而不必每次都查找提交ID .
假设这是我的git历史
Z / A -- C -- D \ / B
我的HEAD目前在Z.我想樱桃挑选B和C.如果我的理解是正确的,我应该这样做:
git cherry-pick B
git cherry-pick C -m 1
git commit --allow-empty
Run Code Online (Sandbox Code Playgroud)
它在我的情况下工作,因为C是一个无操作(因此之后的空提交,我需要提交其他原因),但我想知道后面的参数是什么-m.以下是我从文档中读到的内容:
-m父号
- 主线父母号码
通常你不能挑选合并因为你不知道合并的哪一边应该被认为是主线.此选项指定主线的父编号(从1开始),并允许cherry-pick重放相对于指定父级的更改.
在我的情况下,C有两个父母,但我怎么知道哪一个是1和2,更重要的是当我选择1或2时什么时候重要?
我一直在尝试使用
git log --no-merges --cherry-pick --right-only master...my-branch
Run Code Online (Sandbox Code Playgroud)
生成my-branch中但不在master中的提交列表(根据git-log文档).但是,列表中仍有许多等效的提交.如果我显示它们和它们的补丁,除了commit id之外没有区别.
git show 16cbd0e47406a4f7acbd6dc13f02d74d0b6a7621 >patcha
git show c53c7c32dcd84bfa7096a50b27738458e84536d5 >patchb
diff patcha patchb
1c1
< commit 16cbd0e47406a4f7acbd6dc13f02d74d0b6a7621
---
> commit c53c7c32dcd84bfa7096a50b27738458e84536d5
Run Code Online (Sandbox Code Playgroud)
甚至将git patch-id它们视为等效:
git show c53c7c32dcd84bfa7096a50b27738458e84536d5 | git patch-id
2b5504fb9a8622b4326195d88c7a20f29701e62b c53c7c32dcd84bfa7096a50b27738458e84536d5
git show 16cbd0e47406a4f7acbd6dc13f02d74d0b6a7621 | git patch-id
2b5504fb9a8622b4326195d88c7a20f29701e62b 16cbd0e47406a4f7acbd6dc13f02d74d0b6a7621
Run Code Online (Sandbox Code Playgroud)
怎么不git log --cherry-pick把这些作为重复?
在我解决了混乱之后,如何使用SourceTree继续采摘樱桃.如果我正在进行rebase并且我遇到冲突,那么当我点击提交后解析它们时,SourceTree让我继续该rebase.但如何继续樱桃采摘操作?
我知道这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) 我正在接受跟随错误,而樱桃采摘一个gerrit ...有没有人知道这意味着什么,为什么有人会看到它?
error: addinfo_cache failed for path 'ROE/NAS/src/abc.c
Run Code Online (Sandbox Code Playgroud) 在Git中,cherry-pick至少在没有冲突时保留原始提交的作者,时间戳等.但有没有办法确定哪些用户执行了将该提交带到新分支的樱桃选择?
我有一个在TFS中启动的项目,然后转移到Git.不幸的是,将它移动到Git的人只是检查当前文件而不是使用git-tfs.我试图在我使用git-tfs从TFS中提取的提交之后,在Git中重新设置他的新提交.
要做到这一点,我只是简单地在git-tfs提交之上重新提交他的提交.(我意识到这会弄乱远程Git分支机构,但我们是一个小团队,它会没事.我也尝试过挑选樱桃,但我遇到了同样的问题.)
我遇到的问题是一组看起来像这样的冲突:
<<<<<<< HEAD
namespace OurNiftyProject
{
public enum CardType
{
Visa = 0,
MasterCard = 1
}
}
||||||| merged common ancestors
=======
namespace OurNiftyProject
{
public enum CardType
{
Visa = 0,
MasterCard = 1
}
}
>>>>>>> Add a bunch of stuff.
Run Code Online (Sandbox Code Playgroud)
看来这是添加这些文件的TFS端提交和添加它们的Git端提交之间的冲突(因为Git repo开始为空).
逻辑上可能是跳过这个提交,但也有一些文件(比如几百个中的十个)是新的.当然,那些不会引起冲突.
为什么Git不能自己弄清楚两个文件是否相同?即使我在使用--ignore-whitespacerebase时使用,Git仍会显示几十个这样看似相同的文件.我对如何解决这个问题感到茫然.
我正在编写一个用于迁移git repos的脚本.关于樱桃挑选冲突,我跑
git add .
git cherry-pick --continue
Run Code Online (Sandbox Code Playgroud)
这会调出vim,提示我保存提交消息并冻结脚本.我正在寻找一个命令行选项,--no-edit或者--porcelain来解决这个问题.
丑陋的终端黑客也可能受到欢迎;)
我正在尝试找到一种方法来在挑选它们时检查提交。不幸的是,我找不到与cherry-pick操作一起使用的 git hook。在精心挑选的提交上执行脚本的可能解决方案是什么?