2013-03-05 72 views
3

我做了以下内容:如何与git摘樱桃承诺,宣布我们的历史包含它

git fetch upstream 
git cherry-pick xyz 

拾取提交了它有完全相同我已经同变化中的一个文件被除明确应用在之前的提交中完成,因此这些更改不会重新应用。

在代码方面的一切都很好,但我想在我的历史中有提交散列。在我的历史中,它以一个新的名字出现。这甚至有可能吗?至于我读git合并“我们”的策略,似乎一般可能,但如何做到一次提交?

我想要这个,以便稍后确定upstream有什么提交我没有。目前在github network视图我看到樱桃挑选的提交作为单独的东西,我没有。

附加信息: @CharlesB说什么对我有意义。但是merge -s ours怎么做呢?在这种情况下,对我来说cherry-pick并不重要。因为我想采取的变化只有一个,并且在upstream/master的顶端。所以,只是尝试一下,我所做的:git merge -s ours upstream/master

现在做git log --graph --pretty=oneline --abbrev-commit我看到:

* 9e8108b Merge remote-tracking branch 'mgencur/master' for better github netw 
|\ 
| * aa7117d Fix displaying watchers/watching for incorrect user // this commit magically appeared after merge -s ours 
* | ff05f8c Fix displaying watchers/watching for incorrect user // this is commit from cherry-pick of aa7117d 
* | b7ca8ec older commit in my fork 
* | <more commits in my fork> 
|/ 
* 94d6870 Fix obtaining available users for testing purposes 
* <older commits of upstream/master> 

同样的命令以前git merge -s ours一直在寻找这样的:

* ff05f8c Fix displaying watchers/watching for incorrect user // this is commit from cherry-pick of aa7117d 
* b7ca8ec older commit in my fork 
* <more commits in my fork> 
* 94d6870 Fix obtaining available users for testing purposes 
* <older commits of upstream/master> 

,你可以看到挑选aa7117d提交后,没有迹象表明aa7117d已经应用于我的fork回购。但合并后,它表明它在那里,虽然我的文件没有改变。

这使我认为确实有可能声明包含在分支中的许多提交,尽管它们不适用于,因为它们在上游应用了

update2:我看到问题How to merge a specific commit in Git及其最佳答案。因此,解释为什么它不可能实现还是没有实现。

+0

你似乎是在什么摘樱桃和合并是困惑。前者将指定的提交应用于当前分支。这就像导出补丁文件然后应用它的捷径。而已。后者也创建一个新的提交,但那个**有两个父提交**。因此,在另一个分支之上没有提交*补丁*,更像是将开发链合并为一个。这就是为什么你会在历史中看到原始的哈希字符串,但那只是因为它们确实仍然存在,而不是从原始状态修改而来。 – 2013-03-05 15:09:22

+0

@迈克尔 - 野,是啊,我想某种合并/摘樱桃组合。 – akostadinov 2013-03-05 15:26:41

+1

这将永远不会工作。这不仅仅是Git的工作原理。散列唯一标识一个提交,如果你改变它的父提交,散列必须改变。这就是为什么提交哈希在Git中被认为是*加密安全*的原因。如果您可以验证分支机构的散列,则可以有效验证其整个历史记录。任何修改历史记录的操作都会改变哈希值。期。 – 2013-03-05 15:35:04

回答

2

Git不允许你这样做Git哈希值唯一标识一个提交及其历史记录。这意味着,当你摘樱桃的提交您应用补丁到一个新的历史,因此也没有办法(除了一些反常之际在哈希冲突)的哈希值将是相同的。

,你仍然可以看到原来的哈希数字,当你执行合并的原因是,这里的情况是完全不同的。合并不是使用单个父提交的正常提交。相反,它有两个(甚至更多)父提交,将不同的开发链结合在一起。因此,合并后的头部的原始历史被保留下来。

3

根据定义,提交哈希对于每个提交都是唯一的。

当挑选樱桃时,即使您应用相同的修改,也会创建新的提交,因为它具有不同的父提交。

但是您可以添加要求的git将消息樱桃采摘提交消息:

樱桃采摘从提交<original-sha1>

documentation

-x

当记录提交时,a在一行中写着“(樱桃摘自...”)”,以便原来提交信息指示 其呈交从这种变化是精挑细选,这对于 樱桃选秀权不会发生冲突只是做了。如果你是从你的私有分支 樱桃采摘不要使用这个选项,因为如果另一方面您在两个公开可见的分支之间挑选 (例如,向开发分支中的旧版本的 维护分支返回修复), 添加此信息可以使用

+0

请参阅我的问题中的“其他信息”。在我看来,虽然它们并不相同,但可以将某些提交声明为适用于当前分支。也许不是挑选樱桃的命令? – akostadinov 2013-03-05 14:46:37

+0

我不明白你的意思是“申报承诺应用到当前分支”。你的意思是你想在合并操作中选择你想要包含/排除的提交吗? – CharlesB 2013-03-05 15:05:36

+0

查看“我们的”合并策略解释。我希望它们像合并操作一样应用。我想这可以通过一些分支和合并操作来实现。但是如果'cherry-pick'命令自动完成它就会很酷。 – akostadinov 2013-03-05 15:16:31