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

ako*_*nov 6 git github cherry-pick git-cherry-pick

我做了以下事情:

git fetch upstream
git cherry-pick xyz
Run Code Online (Sandbox Code Playgroud)

选择的提交已被干净地应用,只是在其中一个文件中它具有与我在上一次提交中已经完成的完全相同的更改,因此不会重新应用这些更改。

代码方面的一切都很好,但我希望在我的历史中拥有提交哈希。在我的历史中,它以一个新名字出现。这甚至可能吗?就我正在阅读的 git merge “ours” 策略而言,它似乎通常是可能的,但是如何为一次提交做到这一点?

我想要这个,所以以后更容易确定提交upstream有哪些我没有的。目前在 githubnetwork视图中,我认为挑选的提交是我没有的单独的东西。

附加信息:@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>
Run Code Online (Sandbox Code Playgroud)

之前的 命令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>
Run Code Online (Sandbox Code Playgroud)

正如您在挑选提交 aa7117d 后所见,没有迹象表明 aa7117d 已经应用于我的 fork 存储库。但是在合并后它被指示它在那里,尽管我的文件中没有任何改变。

这让我认为确实可以声明一个分支中包含的许多提交,尽管它们的应用并不完全像上游应用的那样。

更新 2:我看到问题如何在 Git 中合并特定提交及其最佳答案。因此,解释为什么不可能或没有实施也将不胜感激。

Mic*_*ild 3

Git 不允许你这样做。Git 哈希值唯一地标识一次提交及其所有历史记录。这意味着,当您挑选一个提交时,您会将补丁应用于另一个历史记录,因此没有办法(除了在哈希冲突的某些奇怪情况下)哈希将是相同的。

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