GITLAB:如何将整个分支推送到另一个分支

GITLAB: How to push ENTIRE branch to another one

我的目标很容易解释,但我找不到任何方法来做到这一点。 假设我有 3 个分支机构。 A、B 和 C

A -------.
          \--------.----------- B
                     \
                      .-------------- C

我只是想将整个分支 "C" 推送到分支 "B"。让我解释一下:我不想保留我在 B 创建 C 之后所做的任何事情它。我只是希望 B 具有与分支 C 完全相同的代码。

我怎样才能安全地做到这一点?

两者之间的差异超过 10,000 个文件,因此无法手动选择。

我尝试了几种方法,包括 git 合并 "theirs" 策略,但我仍然遇到很多冲突。

无论潜在冲突文件的数量或代码差异如何,这三个命令中的任何一个

# if you don't need to checkout the branch immediately
git branch -f B C

# if you DO want to checkout the branch immediately
git checkout -B B C

# if you branch B is ALREADY checked out
git reset --hard C

将使 B 指向与 C 相同的提交,使它们完全相同,代码和历史。没有冲突解决,没有合并,它是即时的。

请注意,这被认为是对 B 最近历史的重写,因此如果您与任何人共享分支 B,则不要使用它。

它还会在 C 分支后取消引用 B 上的任何提交,因此如果您有任何疑问,请事先使用 [= 备份 B 24=]

git branch backup-B B

最后...您忘记备份而后悔了吗? git reflog 将列出 HEAD 之前的位置,你会在那里找到 B,用 git reset --hard <old position hash> 恢复它,或者用 [= 为 inspection/reuse 添加句柄23=]

如果您只想放弃 B 独有的所有更改,请将其删除:

git branch -d B

签出 C 并从中创建一个新的 B

git checkout C
git branch B

B 现在与 C 完全相同。

结帐 B 然后重置 HEAD

git checkout B
git reset --hard C

没有theirs策略。有一个 -X theirs 选项 ,但这不是策略。 Git称它为"strategy option",这个名字不好听:听起来像是一个提供策略的选项,但实际上,它是一个一些other策略,-s选项中的那个,这里默认为-s recursive。我将 -X 称为 "eXtended option" 以帮助避免将其与 -s 选项混淆。

有关 为什么 没有 -s theirs 的说明,即使曾经有过,请参阅 this answer by VonC

此处其他答案中的各种重置方法(git checkout -Bgit reset --hard 等)通常是可行的方法。但是,如果您想轻松地产生 -s theirs 策略的 效果 ,请参阅 jthill's answer to Is there a "theirs" version of "git merge -s ours"?