git - 犯错后如何建立正确的MR?

标签 git

我有一个小问题。 (也许先检查底部,不知道如何最好地描述它)

我有分支 x、分支 y 和分支 master。 X 和 y 不 protected ,我可以强制推送它们。

我已经在分支 x 中创建了一些工作,现在我有要 merge 的请求。

然后我从 x 创建了分支 y 并在该分支上做了一些其他工作。当我完成 y 上的工作时,分支 x 中进行了一些更改,因此我决定将这些更改重新设置到我的分支 y 中。

但是我做错了!我已将 y 重新设置为 x!经过一番咒骂后,我设法为 x 创建了新的提交,并在其中恢复了我的更改。

之后,我按照自己的意愿完成了从 x 到 y 的 git rebase。

现在事情变得复杂了。

不知何故,我不知道如何(或不记得)丢失了分支 y 中的更改。它看起来像 x 没有改变。所以我在分支 y 中执行了 git reset HEAD~ 并使用之前的更改创建了新的提交。

现在我有了分支 x 和 y,就像我想让它们在 y 上成功 rebase 一样。

现在我们来谈谈我的问题:)

当我现在在我的 master 上使用 y 创建 merge 请求时,看起来没问题。就像 x + y 一样。一切都很好。

但我想创建 MR 不是在 master 上而是在 x 上。我想将我的 y merge 到 x,以便其他人可以查看它并进行代码审查。

但在这里我没有对 y 所做的所有更改!为什么?如果我想出示正确的 MR,该怎么办?

最佳答案

But I have done wrong! I have rebased y into x! After some cursing...

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 来说,如果您正在分支 X 上工作并希望引入分支 Y 中的更改,您可以:

  1. merge 分支Y分支X
  2. rebase 分支X分支Y

在这两种情况下,您都在修改分支 X,但方式不同。也许 merge 对正在发生的事情更加明显,因为您在图中看到 merge 提交并且双方的更改一起应用。通过 rebase ,首先 X 被设置为恰好 Y,然后 X 上不在 Y 上(或 Y 无法到达的)上的每个提交都会按顺序重放,“在top of” 该起点,即 Y。(这就是为什么我们说“onto”。)通过 rebase,您的历史记录将保持线性,而无需添加 merge 提交(默认情况下)。

...I managed to create new commit for x where I've reverted my changes... Somehow, I don't know how (or don't remember) I lost my changes in branch y.

当您恢复时,您将通过新提交撤消更改。此外,如果您撤消更改并尝试恢复相同的提交 ID,它们将被忽略,因为它们已经存在于分支上。要再次引入它们,您需要“恢复还原”或更改提交 ID 并再次引入它们。这可能是为什么这些变化似乎已经消失的原因,尽管它们仍然存在于历史中。

But I want to create MR not on master but on x. I want to merge my y to x, so other people can look at it and do code review.

由于这些是您自己的分支,我建议您首先将它们重写为您想要的方式,强制将它们推回并设置 MR 进行审查。您可以使用上面的 git reset --hard 命令将两个分支 X 和 Y 设置回尝试 rebase 之前的状态,然后:

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

关于git - 犯错后如何建立正确的MR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75289509/

相关文章:

git - 如果特定文件发生更改,我如何自动收到警告?

git 子模块、gitslave、git 子树或更简单的解决方案

ios - 最佳实践 : how to add an external framework to xcode project which is under version control?

git - 如何在git中 merge 特定文件

Github V3 API : list contributors

node.js - 将代码推送到远程 Docker

git - 如何将远程分支 merge 到本地分支?

git - 如何获取谷歌代码存储库的最新快照(不是克隆)

具有修改和未跟踪内容的 git 子模块 - 为什么以及如何删除它?

git - 在大型源代码树中测量 "closeness"