Git替换本地分支并将我的分支重新设置在新分支之上

Posted

技术标签:

【中文标题】Git替换本地分支并将我的分支重新设置在新分支之上【英文标题】:Git replace the local branch and rebase my branch on top of the new one 【发布时间】:2022-01-09 02:16:12 【问题描述】:

我很确定这个问题的答案可以在 SO 上找到,至少在几个不同的帖子上是零零散散的。我有一个由不同分支创建的分支。我在我的分支中做了一些提交,然后另一个分支的所有者强制将一些提交推送到我的分支上。在那之后,我又做了一些提交。

现在我被要求获取他的干净版本(我认为他的意思是替换我的本地分支),然后将我的分支重新设置在新分支(他的?)之上,以便他的提交(“强制推送"的) 将消失。我认为他想要的是永远不会在我的分支历史中看到他的提交。

执行此操作的步骤是什么?我发现很多参考文献

git fetch
git reset --hard @u
git rebase -i origin/master

但不确定结果,因为我似乎无法摆脱他的承诺。对于任何需要我正在谈论的内容的视觉图片的人,这里是:

任何建议将不胜感激。顺便说一句,我正在使用 Git Bash。

TIA, 埃德

编辑:根据要求,这里是“git log --graph --oneline --all”命令的输出(对不起,我必须涵盖所有的 cmets,因为有些可能包含敏感信息):

【问题讨论】:

如果我理解正确,听起来它应该是一个相当简单的交互式变基,丢弃不需要的提交。可能只是git rebase -i FIRST_COMMIT_TO_REMOVE~,并将有问题的提交标记为drop。见***.com/a/42522493 @Hasturkun 感谢您的建议。请参阅我对尼古拉的第二条评论。我需要摆脱提交,但保留其中包含的代码更改。 如果你想保留他的改动,你可以squash或者fixup把这些统一到一个新的提交中(虽然我不得不说,你的意图有点不清楚,听起来像你想要的这些已从历史中删除,这意味着它们将不存在)。我会提前提到,如果打算让他的提交发生在您的提交之后(或相反),您还可以选择重新排序提交。 【参考方案1】:

提示,将git log --graph --oneline --all 的输出与您的 HEAD 一起发布,以便我们更好地了解正在发生的事情。

如果我理解正确,您应该尝试以下操作:(确保您不强制推送某些内容。在 reset 上使用哈希码作为参数)

git reset his-last-commit(在他提交后取消提交最近的编辑)

git stash(保存它们)

git reset --hard your-commit(这会删除他的提交)

git stash pop(这会将您最近的编辑应用到顶部)

如果这不起作用,您应该尝试git cherry-pick

【讨论】:

“git reset --hard your-commit”命令中我的“your-commit”是哪一个?在他添加 4 次提交之前,这会是我的最后一次提交吗?另外,如果这是我在他添加他的东西之前的最后一次提交,那么这个“reset --hard”不会导致他的更改丢失吗? “我认为他想要的是永远不会在我的分支历史中看到他的提交。”这不是意味着它应该失去他的变化吗? 不,他不想丢失他的更改,因为它们很重要。他只是希望这 4 个提交远离分支的历史。他确实提到他想要的可以通过变基来实现,所以@Hasturkun 的建议可能是有道理的

以上是关于Git替换本地分支并将我的分支重新设置在新分支之上的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Git 中完全用远程分支替换本地分支?

您如何获取 git diff 文件,并将其应用到作为同一存储库副本的本地分支?

批处理文件以循环通过远程 Git 分支并将每个分支中的类似 CSV 文件复制到本地目录

您如何在合并的更改之上重新调整当前分支的更改?

RHEL上的Git设置

git:如何从远程分支获取并合并到本地分支?