【问题标题】:How do I move unpushed committed code to another branch?如何将未推送的已提交代码移动到另一个分支?
【发布时间】:2017-07-20 13:25:58
【问题描述】:

所以我有以下情况:

我在本地提交了一些工作,没有推送到远程存储库。我想把这个本地代码移动到另一个分支,因为如果我拉,会有修改会破坏我在本地放置的所有工作。

这是git status 在旧分支上的输出:

On branch <branch_name>
Your branch is ahead of 'origin/<branch_name>' by 1 commit.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean

这是git status 在新创建的分支上的输出:

On branch <branch_name>
nothing to commit, working directory clean

【问题讨论】:

  • 其他分支是否已经存在,还是需要现在创建一个?
  • 我已经使用“git checkout -b ”创建了它
  • 类似,唯一不同的是我没有拉任何新的修改。

标签: git


【解决方案1】:

如果只是一次提交,你可以简单地做

git reset HEAD~1
git stash
git checkout anotherbranch
git stash pop

如果你想把它放在一个新的分支中,另一种方法是

git branch newbranch
git reset --hard HEAD~1

【讨论】:

  • 完全按照医生的规定!非常感谢!
  • 如果您使用第二种方法并且几乎没有未提交的更改,请记住存储您的更改。否则未提交的更改将消失❗️
【解决方案2】:

如果您在提交后创建了分支,它应该包含您想要移动的提交。您可以使用git log 验证这一点,您应该会看到您的提交是日志中的第一个。

在您不再希望提交的分支上进行git reset --hard HEAD~。这将从分支中删除提交并重置分支,以便您现在可以毫无问题地拉取。 (确保您的提交在另一个分支上,因为这样做之后您的提交将消失)。

如果提交不在您的其他分支上,您可以删除该分支并使用 git checkout -b &lt;branch name&gt; 从原始分支重新创建它,或者您可以使用 git cherry-pick &lt;SHA of your commit&gt; 将其挑选到您的分支中,这将制作一个副本你的分支上的提交。然后就可以按照上面的步骤重置原来的分支了。

【讨论】:

  • 我签出了新的分支,然后执行了“git log”。看来它的日志与旧分支相同,因此我不需要采取任何其他操作。
【解决方案3】:

就我而言,答案是:

  1. 创建一个具有当前状态的新分支:
    git checkout -b new-branch
    
  2. 返回到要从中删除未推送提交的分支
    git checkout -
    
  3. 删除未推送的提交
    git reset --hard origin
    

【讨论】:

    【解决方案4】:

    你有选择:

    1. 从当前分支分支,创建一个包含所有提交的新分支,然后将旧分支重置为原始提交
    2. Cherry 选择新分支的提交
    3. 在启用快进的情况下将当前分支合并到新分支中
    4. 在旧分支之上重新建立新分支

    我相信还有更多选择。这取决于您的具体情况,哪个最好。

    【讨论】:

      【解决方案5】:

      现状:

      (如果我理解正确的话):

      This is what you want:
      
      
      Branch A -> |<---Commit A--->| 
                              \  
      Branch B                  ->|<---Commit B--->|   
      
      
      But This is what you currently have:
      
      
      Branch A -> |<---  Commit A --->|  ->   |<---  Commit B --->|   
      

      怎么去那里?

      现在分支 A 的 ref 指向提交 B SHA。我们需要它指向提交 A。我们如何做到这一点?

      1. 首先进入分支 A:

      git checkout branch-A

      1. 一旦您在分支 A 上,我们想要强制重写分支 A 引用指向的提交 - 我们想要进行重置 - 但我们仍然希望在文件被暂存之前保留它们 - 这样我们就可以传输他们到一个新的分支。为了做到这一点,我们必须使用带有 --mixed 标志的 git reset hard。 HEAD~1 表示您正在重置为恰好落后于您当前位置的一次提交。

      git reset HEAD~1 --mixed

      1. 既然您在这里,只需创建一个新分支:

      git checkout -b new-branch-name

      1. 然后,立即提交这些更改:

      git commit -am ‘fix ABC bug’

      瞧!真的很简单!

      更好的解决方案

      另一种方法是将分支 A 上的 --hard 重置为 HEAD~1,并简单地从提交 b 中签出一个新分支 - 最新提交。在这种情况下,我们不会添加任何不必要的提交。

      【讨论】:

        猜你喜欢
        • 2012-12-03
        • 1970-01-01
        • 2011-05-06
        • 2015-10-16
        • 2015-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-19
        相关资源
        最近更新 更多