我做了以下事情:
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及其最佳答案。因此,可以理解为什么不可能或者没有实现的解释。
答案 0 :(得分:3)
根据定义,提交哈希值对于每个提交都是唯一的。
挑选时,即使应用相同的修改,也要创建新的提交,因为它具有不同的父提交。
但是你可以添加ask git将消息放入挑选的提交消息中:
从提交
中挑选出来<original-sha1>
-x
录制提交时,在原始提交消息中附加一行“(从提交中挑选樱桃)”以表示 承诺这一变化的是从中挑选出来的。这只是为了 樱桃挑选没有冲突。如果你这样做,请不要使用此选项 从你的私人分支机构挑选樱桃,因为信息是 对收件人没用。另一方面,如果你采摘樱桃 在两个公开可见的分支之间(例如,向后移植修复 维护分支,用于开发分支的旧版本), 添加此信息非常有用。
答案 1 :(得分:2)
Git不允许你这样做。 Git散列唯一标识提交及其所有历史记录。这意味着,当你挑选一个提交时,你将一个补丁应用到另一个历史记录中,因此没有办法(除了在一些怪物碰撞的怪异场合)哈希将是相同的
执行合并时仍然看到原始哈希值的原因是这里情况完全不同。合并不是具有单个父提交的正常提交。相反,它有两个(甚至更多)父提交,将不同的开发链组合在一起。因此保留了合并头的原始历史。