【问题标题】:Move commit to a new branch without touching index or working tree将提交移动到新分支而不触及索引或工作树
【发布时间】:2023-03-16 19:54:01
【问题描述】:

这里有一个家长问题:Move the most recent commit(s) to a new branch with Git

我接手了一个项目,该项目的工作树充满了仍需要整理的文件——有些是指正在进行的工作任务;其他都完成了。我最近提交了已完成的工作,但这不是用于生产的。如何在不破坏当前树的情况下谨慎地将其移至某个新分支?

I'd like to change

Working tree - A - B - C - D - E

to

Working tree - B - C - D - E
              /
             A

【问题讨论】:

  • A 是最新/最近的提交吗?
  • @Mat - 在这种情况下是的,但是如果你有一个通用的解决方案会很棒!
  • 那么你链接到的问题是这个问题的副本,据我所知,场景完全相同。缺少什么?
  • 暂存和工作树中有很多未提交的文件。

标签: git version-control commit


【解决方案1】:

使用checkout -b "name of branch",您将创建一个新的本地分支。

【讨论】:

  • 看起来不太对劲。这不会移动提交,它不会改变我的工作树吗?
  • 这将创建一个与您现在正在处理的分支处于完全相同状态的分支。
【解决方案2】:
git branch tmp
git reset --soft B

将 HEAD(并且只有 HEAD)移动到 B(在使用“tmp”分支标记 A 之后)

有关reset --soft 的更多信息,请参阅“Practical uses of git reset --soft?”。

【讨论】:

    【解决方案3】:

    先在某处写 A 的 SHA1,以后会用到。

    git checkout <E's SHA1>
    git rebase -i HEAD~6(6 是从 E 到 A 的提交距离加一)

    在编辑器中删除 A 的行并保存。

    现在你有了这个:

     Working tree - B - C - D - E
    

    现在我们要创建一个到 A 的分支,从 B 开始:

    git checkout <B's SHA1>
    git branch BAbranch(或任何你想称呼它的名字)
    git checkout BAbranch
    git cherry-pick <A's SHA1>

    现在你有了这个:

     Working tree - B - C - D - E
    
                      \
    
                         A  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-16
      • 2010-11-26
      • 1970-01-01
      • 2011-07-25
      • 2012-09-22
      • 1970-01-01
      • 2017-02-24
      • 2011-02-23
      相关资源
      最近更新 更多