Git 合并状态 "Already up to date",提交在 master 中,但更改基本上在下一次提交时被覆盖
Git merge states "Already up to date", commits are in master but changes were essentially overwritten on the very next commit
这很可能是重复的,但我找不到关于这个特定问题的任何确定的信息。所以几周前我很确定我将一个分支合并到我们的 master 分支中,提交在 masters 历史中,但没有合并消息表明分支已合并。在查看我的提交时的历史记录中,更改很明显,但是在下一次提交时查看项目文件时,更改不存在。尝试再次 git 合并当然会出错,并说 "Already up to date" 从技术上讲是的。
将这些更改放入 master 分支的最佳方法是什么?我想我可以创建一个具有相同更改的新分支,然后将该分支合并到主分支中...
所有提交——包括合并提交——都是所有文件的完整快照。因此,如果有人出于某种原因决定更改您更改的文件,以撤消您的更改,并以任何形式(合并或常规提交)提交,那么新的snapshot 以 他们 的方式排列文件。
我们看不到您的存储库,因此很难准确猜测谁做了什么,怎么做的。
(请注意,各种 Git 查看者 "flatten" 当存在合并时,本质上是一个纠结的历史,并且可能会乱序查看提交。将 --graph
添加到您的 git log
命令,如果您使用 git log
查看提交,强制 git log
以 commit-graph 顺序显示提交,并绘制提交关系的粗略 ASCII 图。 )
What is the best way to get these changes into the master branch?
Best见仁见智,但为了easy,可以一直用git cherry-pick
.
git cherry-pick
的工作方式是为提交指定一个名称(例如原始哈希 ID)。1 Git 然后比较提交 parent (单数)。 "before" 和 "after" 快照之间的比较显示了两个快照之间 更改的内容 ,因此 Git 现在可以 re-apply 那些相同的更改您刚刚签出的任何提交。
因此:
git checkout master
git cherry-pick <hash>
用于复制任何给定普通提交的效果。
但是,如果您的合并带来了一些大量提交的影响,您可能想要 git cherry-pick
整个合并。直接的绊脚石是合并提交有 多个 parent。就其本身而言,git cherry-pick
只是将其比喻性的手举在空中然后放弃:它不知道使用哪个 parent,当比较 parent 和 child 以查看 "what happened in this commit".
不过,通常来说,parent 的使用权几乎总是 parent #1。如果 是 正确的 parent,您只需使用它的 -m
选项告诉 git cherry-pick
:
git cherry-pick -m 1 <hash>
要判断 parent #1 是否是正确的提交,您可以自己比较 parent #1 和给定的提交:
git diff <hash>^1 <hash>
^1
后缀告诉 Git:从这个提交移到第一个 parent。 (再次参见脚注 1 和 gitrevisions 文档。)因此 diff
将 parent #1 中的快照与 hash
中的快照进行比较。该比较的结果是 git cherry-pick
将尝试复制的一组更改。
如果 parent #1 是错误的 parent,请依次尝试剩余的每个 parent。由于大多数合并只有两个 parent,因此只剩下 parent #2:
git diff <hash>^2 <hash>
这将显示 second parent 和给定提交之间的区别。
1任何名字都可以;请参阅 the gitrevisions documentation 以获取一长串命名提交的方法。 "true name" 可以说是原始哈希 ID:它总是有效,并且总是命名一个特定的提交。使用它的唯一缺点是名称难以记住且难以键入,但通常很容易从 git log
输出中剪切和粘贴哈希 ID,例如。
这很可能是重复的,但我找不到关于这个特定问题的任何确定的信息。所以几周前我很确定我将一个分支合并到我们的 master 分支中,提交在 masters 历史中,但没有合并消息表明分支已合并。在查看我的提交时的历史记录中,更改很明显,但是在下一次提交时查看项目文件时,更改不存在。尝试再次 git 合并当然会出错,并说 "Already up to date" 从技术上讲是的。
将这些更改放入 master 分支的最佳方法是什么?我想我可以创建一个具有相同更改的新分支,然后将该分支合并到主分支中...
所有提交——包括合并提交——都是所有文件的完整快照。因此,如果有人出于某种原因决定更改您更改的文件,以撤消您的更改,并以任何形式(合并或常规提交)提交,那么新的snapshot 以 他们 的方式排列文件。
我们看不到您的存储库,因此很难准确猜测谁做了什么,怎么做的。
(请注意,各种 Git 查看者 "flatten" 当存在合并时,本质上是一个纠结的历史,并且可能会乱序查看提交。将 --graph
添加到您的 git log
命令,如果您使用 git log
查看提交,强制 git log
以 commit-graph 顺序显示提交,并绘制提交关系的粗略 ASCII 图。 )
What is the best way to get these changes into the master branch?
Best见仁见智,但为了easy,可以一直用git cherry-pick
.
git cherry-pick
的工作方式是为提交指定一个名称(例如原始哈希 ID)。1 Git 然后比较提交 parent (单数)。 "before" 和 "after" 快照之间的比较显示了两个快照之间 更改的内容 ,因此 Git 现在可以 re-apply 那些相同的更改您刚刚签出的任何提交。
因此:
git checkout master
git cherry-pick <hash>
用于复制任何给定普通提交的效果。
但是,如果您的合并带来了一些大量提交的影响,您可能想要 git cherry-pick
整个合并。直接的绊脚石是合并提交有 多个 parent。就其本身而言,git cherry-pick
只是将其比喻性的手举在空中然后放弃:它不知道使用哪个 parent,当比较 parent 和 child 以查看 "what happened in this commit".
不过,通常来说,parent 的使用权几乎总是 parent #1。如果 是 正确的 parent,您只需使用它的 -m
选项告诉 git cherry-pick
:
git cherry-pick -m 1 <hash>
要判断 parent #1 是否是正确的提交,您可以自己比较 parent #1 和给定的提交:
git diff <hash>^1 <hash>
^1
后缀告诉 Git:从这个提交移到第一个 parent。 (再次参见脚注 1 和 gitrevisions 文档。)因此 diff
将 parent #1 中的快照与 hash
中的快照进行比较。该比较的结果是 git cherry-pick
将尝试复制的一组更改。
如果 parent #1 是错误的 parent,请依次尝试剩余的每个 parent。由于大多数合并只有两个 parent,因此只剩下 parent #2:
git diff <hash>^2 <hash>
这将显示 second parent 和给定提交之间的区别。
1任何名字都可以;请参阅 the gitrevisions documentation 以获取一长串命名提交的方法。 "true name" 可以说是原始哈希 ID:它总是有效,并且总是命名一个特定的提交。使用它的唯一缺点是名称难以记住且难以键入,但通常很容易从 git log
输出中剪切和粘贴哈希 ID,例如。