【问题标题】:GITLAB: How to push ENTIRE branch to another oneGITLAB:如何将整个分支推送到另一个分支
【发布时间】:2020-02-20 14:12:33
【问题描述】:

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

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

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

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

两者之间的差异文件超过 10 000 个,因此手动不是一种选择。

我尝试了几种方法,包括 git merge 与“他们的”策略,但不知何故我仍然有很多冲突。

【问题讨论】:

  • 分支 B 是否与其他人共享?
  • @RomainValeri 我目前正在独自处理这个 repo

标签: git gitlab git-reset


【解决方案1】:

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

# 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

git branch backup-B B

最后...您忘记备份并后悔? git reflog 将列出HEAD 以前的位置,你会在那里找到B,使用git reset --hard <old position hash> 恢复它或使用git branch recovered-B <old position hash> 对其进行检查/重用

【讨论】:

    【解决方案2】:

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

    git branch -d B
    

    结帐C 并从中创建一个新的B

    git checkout C
    git branch B
    

    B 现在与C 完全相同。

    【讨论】:

    • 如果B没有被推送,你需要使用-D而不是-d
    【解决方案3】:

    结帐 B 然后重置 HEAD

    git checkout B
    git reset --hard C
    

    【讨论】:

    • 最佳解决方案如果您还需要检查分支(单线变体git checkout -B B C)。
    【解决方案4】:

    没有theirs 策略。有一个-X theirs 选项,但这不是一个策略。 Git 将其称为“策略选项”,这是一个坏名字:听起来像是提供策略的选项,但实际上,它是一些其他策略的选项, 来自-s 选项,这里默认为-s recursive。我将-X 称为“扩展选项”,以避免将其与-s 选项混淆。

    关于为什么没有-s theirs的描述,尽管曾经有过,请参阅this answer by VonC

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

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 2019-12-10
      • 2021-10-11
      • 2012-12-03
      • 2023-03-11
      • 1970-01-01
      • 2016-11-02
      • 2014-02-17
      • 1970-01-01
      相关资源
      最近更新 更多