git 如何在出现错误后创建适当的MR?

x759pob2  于 2023-05-05  发布在  Git
关注(0)|答案(1)|浏览(89)

我有个小问题(也许先检查底部,不知道如何最好地描述它)
我有分支x,分支y和分支master。X和y不受保护,我可以强制推它们。
我在分支x中创建了一些工作,现在我有合并请求给master。
然后我从x创建了分支y,并在该分支上做了一些其他工作。当我完成y的工作时,在分支x中进行了一些更改,因此我决定将这些更改重定基到分支y。
但我做错了!我已经把y转换成x了!在一些咒骂之后,我设法为x创建了新的提交,我已经恢复了我的更改。
在那之后,我已经完成了git从x到y的重基,就像我想要的那样。

现在事情变得复杂了

不知何故,我不知道(或不记得)我失去了分支y的更改。它看起来像x没有变化。所以我在分支y中重置了HEAD~,并使用以前的更改创建了新的提交。
所以现在我有分支x和y,就像我想让它们在y上成功地变基一样。

这里我们来我的问题:)

当我现在用y在我的master上创建合并请求时,它看起来很好。就像x + y。一切都很好
但我想在x上而不是master上创建MR。我想把我的y合并到x,这样其他人就可以看到它并进行代码审查。
但在这里我没有我对你做的每一个改变!为什么?如果我想显示适当的MR,我该怎么做?

x6h2sr28

x6h2sr281#

但我做错了!我已经把y转换成x了!骂了几句……
Git的一个优点是,一旦你提交了一些东西,它就被锁定了。通过检出以前的提交,可以很简单地返回到以前的任何状态。如果你喜欢这个提交,你可以将任何分支重新指向它,我假设这是你想在你的情况下做的。你所要做的就是找出你之前在哪里:

git reflog # find the commit ID where you want to go back to

git reset --hard <desired-commit-id> # make your current branch point to this commit

此外,这可能看起来很挑剔,但我认为值得一提的是您使用的短语“将y重新设置为x”。(也许这是一个错别字,但我认为指出它可能有助于强调为什么它很重要。)在Git-speak中,如果你正在处理分支X,并希望从分支Y引入更改,你可以:

  1. merge分支Y * 到 * 分支X
  2. rebase分支X * 到 * 分支Y
    在这两种情况下,您都在修改分支X,但方式不同。也许合并会更明显地反映出正在发生的事情,因为您可以在图中看到合并提交,并且来自双方的更改会一起应用。使用rebase,首先X被精确地设置为Y,然后X上的每个不在Y上(或 * 可达 *)的提交被 replayed,按顺序,“在”起始点Y的“顶部”。(这就是为什么我们说“onto”。)使用rebase,你的历史将保持线性,而不添加合并提交(默认情况下)。
    ...我设法为x创建了新的提交,我已经恢复了我的更改...不知何故,我不知道(或不记得)我失去了分支y的更改。
    当你执行revert时,你是在用一个新的提交撤销更改。此外,如果您撤消更改并尝试恢复相同的提交ID,它们将被忽略,因为它们已经存在于分支中。要第二次引入它们,您需要“revert the revert”或更改提交ID并再次引入它们。这可能解释了为什么这些变化似乎消失了,即使它们仍然存在于历史中。
    但我想在x上而不是master上创建MR。我想把我的y合并到x,这样其他人就可以看到它并进行代码审查。
    由于这些是你自己的分支,我建议你把它们都重写成你一开始想要的样子,强制把它们推回去,并设置MR进行审查。您可以使用上面的git reset --hard命令将XY分支设置回尝试变基之前的状态,然后:
git switch Y # checkout Y
git rebase X # Update Y with the new commit(s) on X
git push --force-with-lease # force push Y so you can do a clean MR from Y to X

相关问题