【问题标题】:How can I rebase local branch into origin without merging?如何在不合并的情况下将本地分支重新设置为原点?
【发布时间】:2021-03-12 15:08:46
【问题描述】:

我有以下情况

o--A--B--C <-origin/master
 \-D--E <-master

我想实现以下目标

o--A--B--C--D--E <-origin/master

并将标签保留在DE

如果我做一个变基,那么 DE 将被合并导致 D'E'

o--A--B--C--D'--E' <-origin/master

标签也不会被移动,仍然指向提交的哈希DE

更新 1

如果我在C 有文件A.txt,在D 有文件B.txt,则rebase 将在提交D' 处保留A.txtB.txt。如何进行变基但保留我在D. 所拥有的所有文件结构和内容?

【问题讨论】:

  • D 和 E 将永远留在那里,没有什么可以改变这一点。重新定位然后手动移动标签可能是最好的选择。变基也不会合并任何东西……是什么让你认为它会合并?
  • 问题标题错误。根据帖子的描述,您希望将本地 master 重新定位为 origin 的 master,但标题却相反。
  • 在变基过程中存在冲突,也会导致新的哈希。
  • @OHLÁLÁ git 中每个修改历史的命令都会创建一个新的哈希。这是无法避免的
  • @OHLÁLÁ 我假设您的意思是“但 A.txt 不存在于 D”。因此,当您将 D 重新定位到 C 以创建 D' 时,A.txt 将保留在那里,因为有人添加了它。如果您不再需要它,请删除它并提交删除。 (您可以使用删除将 D' 修改为 D'',或者添加另一个带有删除的提交。

标签: git rebasing


【解决方案1】:

如果节点 D 和 E 有标签,它们将不会随变基一起移动。 D 和 E 是哈希的占位符名称,不是 git 标签。

我认为您可能错误地使用了 tag 这个词,或者只是随意使用。但是git tag 正是您想要的。

【讨论】:

    【解决方案2】:

    首先让我们就merge 的含义达成一致。你写道:

    如果我做一个变基,那么 D 和 E 将被合并产生 D' 和 E'...

    这里没有merged这个词,而是说replayed更有意义。您的案例中的实际合并会导致两个父级(来自每个分支)的新提交。

    没有办法变基保持 D 和 E 提交 ID 不变。

    您必须选择变基或合并。如果你变基,你的提交 ID 会改变,然后你可以为 D' 和 E' 制作新标签(也许丢弃你以前的 D 和 E 标签)。

    如果你合并,D 和 E 的提交 ID 将保持不变,你可以使用现有的标签,但你将有一个合并提交,你的历史不会是一条直线。

    【讨论】:

    • (只要 D 和 E 可以到达,它们不会保持原样吗?)
    • @evolutionxbox 你是在说他们坐在一边,没有他们在 origin/master 中吗?我怀疑这会非常有用。 ;)
    猜你喜欢
    • 1970-01-01
    • 2017-03-30
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2018-05-20
    相关资源
    最近更新 更多