如何使下一个git commit准确地表示来自另一个提交的项目状态而没有合并?

时间:2018-08-18 06:39:54

标签: git

我有两个git分支:Alpha和Beta,我需要在分支Alpha上创建下一个提交,以便其项目状态与在Beta Beta上完全相同。没有合并。

我了解每个git提交-在逻辑级别上-是一个完整且不变的项目状态+一些元数据。因此,我只需要分支Alpha即可拥有与Beta一样的文件状态。

这将是另一次提交(具有不同的哈希),并且一个分支提示不会引用另一个。

2 个答案:

答案 0 :(得分:4)

但是我相信应该有一个更简单,更优雅的方式。

有一种不涉及补丁的方法:reset --hard后跟reset --soft

  • 首先,标记分支的当前HEAD:我们将需要移动该HEAD ,而无需修改Alpha,因此我们创建一个名为'{{1 }}',tmp在哪里。

    Alpha
  • 然后我们返回具有正确内容的Beta HEAD提交。

    git checkout Alpha
    git checkout -b tmp
    

这会将索引(和工作树)重置为正确的内容,但同时还会移动HEAD。但是,这会移动git reset --hard Beta 头,而不是tmp头。

  • Alpha HEAD返回到tmp所在的位置,但不修改索引或工作树(它们表示我们需要进行新的提交)

    mAlphaaster
  • git reset --soft Alpha / Alpha HEAD的顶部进行新提交,该提交代表正确的内容(Beta HEAD提交内容)。

    tmp
  • 最后,强制git commit -m "new commit, image of an old one" Alpha所在的位置:稍后再提交一次。

    tmp

现在普通的git branch -M tmp Alpha git checkout Alpha git branch -d tmp 就足够了,任何协作者都可以像往常一样简单地拉动,并且仍然可以获得旧的重置内容。

git push

答案 1 :(得分:4)

Player.h

Weapon.h创建一个新提交,其树与Beta的技巧相同,其父代为Alpha的技巧。

c=$(git commit-tree Beta^{tree} -p Alpha -m 'foo') test $c && git update-ref refs/heads/Alpha $c 使Alpha指向新提交。