我做了以下操作:
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:我看到问题如何在Git中合并一个特定的提交和它的最佳答案。因此,解释为什么它是不可能的或它没有实施也将是赞赏。
根据定义,提交哈希值对每次提交都是唯一的。
当cherry-pick时,你创建了一个新的提交,即使你应用了相同的修改,因为它有一个不同的父提交。
但是,你可以添加请求git在精选的提交消息中添加消息:
select from commit
<original-sha1>
来自文档:
- x
在记录提交时,在原始提交消息中添加一行"(cherry pick from commit…)"以表示这个更改是从哪个提交中挑选出来的。这只是为了没有冲突的樱桃采摘。如果您是?请不要使用此选项从你的私人分支机构中挑选,因为这些信息对收信人毫无用处。另一方面,如果你是在挑三拣四在两个公开可见的分支之间(例如,将修复后移植到维护分支(来自开发分支的旧版本),添加这些信息可能很有用。
Git不允许你这么做。Git哈希唯一标识一个提交和它的所有历史。这意味着,当你选择一个提交时,你应用了一个补丁到另一个历史,因此没有办法(除了在一些特殊的场合,哈希冲突),哈希将是相同的。
执行合并时仍然看到原始哈希数的原因是这里的情况完全不同。合并不是具有单个父提交的普通提交。相反,它有两个(甚至更多)父提交,将不同的开发链结合在一起。因此,合并后的头部的原始历史被保留。