如何git cherry-pick commit声明我们的历史包含它

时间:2013-03-05 09:49:31

标签: git github cherry-pick git-cherry-pick

我做了以下事情:

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 repo。但是在合并之后,它被指示它在那里,虽然我的文件中没有任何内容发生变化。

这让我觉得确实可以声明一个分支中包含的一些提交,尽管它们没有应用完全,因为它们应用于上游。

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

2 个答案:

答案 0 :(得分:3)

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

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

但是你可以添加ask git将消息放入挑选的提交消息中:

  

从提交<original-sha1>

中挑选出来

来自documentation

  

-x

     

录制提交时,在原始提交消息中附加一行“(从提交中挑选樱桃)”以表示   承诺这一变化的是从中挑选出来的。这只是为了   樱桃挑选没有冲突。如果你这样做,请不要使用此选项   从你的私人分支机构挑选樱桃,因为信息是   对收件人没用。另一方面,如果你采摘樱桃   在两个公开可见的分支之间(例如,向后移植修复   维护分支,用于开发分支的旧版本),   添加此信息非常有用。

答案 1 :(得分:2)

Git不允许你这样做。 Git散列唯一标识提交及其所有历史记录。这意味着,当你挑选一个提交时,你将一个补丁应用到另一个历史记录中,因此没有办法(除了在一些怪物碰撞的怪异场合)哈希将是相同的

执行合并时仍然看到原始哈希值的原因是这里情况完全不同。合并不是具有单个父提交的正常提交。相反,它有两个(甚至更多)父提交,将不同的开发链组合在一起。因此保留了合并头的原始历史。