如何将Git中一个分支的更改移动到另一个分支?

123

我该如何将我的工作和更改从 master 分支移动到一个新创建的分支,并在移动后保持 master 分支不变?

6个回答

198
如果更改没有提交,您可以将更改存储在主分支中。
git stash

然后检出该分支

git checkout -b newbranchname

把更改放在这里

git stash pop

如果更改已提交: 然后创建一个分支:
git checkout -b newbranch

切换回主分支:
git checkout master

回到上一个提交:
git reset --hard head^1

附注:只有在没有创建新文件,仅修改现有文件的情况下才有效。


13
这应该被接受为正确答案,因为原帖没有指明工作是否已经提交。 - divergent
1
这很好用,但我不确定 git stashgit stash pop 是什么或者它们的作用是什么。我有点困惑。 - Edison Pebojot
5
git stash用于保存最近一次提交后所做的更改,而git stash pop用于将这些更改恢复到工作区。 - xpioneer
这对我来说完美地运作了,我没有提交。我在使用git时最常犯的错误是忘记开始一个新分支。 - user3481644

67
你可以使用 git branch branchname 命令创建一个新的分支,该分支将指向当前提交(commit)(如果想要直接检出,则可以使用 git checkout -b branchname)。这将基本上复制你的主分支(master branch),因此你可以在那里继续工作。
如果你已经成功复制了分支,可以使用 git reset --hard commit 命令将 master 分支重置为其原始点,其中commit是主分支上应该是最后一个提交的哈希值(hash)。
例如,你有这样的一种情况:
---- 1 ---- 2 ---- 3 ---- 4 ---- 5 ---- 6
                   ^                    ^
              original                master
            master commit

你已经检出了提交为 6master 分支,并想要创建一个新的名为 ticket 的分支,指向那个 6,同时将 master 重置为 3

所以您已经检出 master 分支上的提交 6 并且想要创建一个新的名为 ticket 的分支,该分支指向提交 6,同时将主分支 master 重置为提交 3。

git branch ticket
git reset --hard 3
git checkout ticket

那么现在你正在 ticket 分支,指向提交的版本号是 6 ,而主分支 master 指向版本号为 3 的提交。


3
如果您的新分支应该基于 master 分支,那么这个方法就可行。如果您需要它在不同的开发线上,您需要了解 git-rebase - che
2
git checkout 中的 -b 告诉 Git 在检出分支之前创建该分支。它基本上是 git branch namegit checkout name 的快捷方式;当您想要开始在新分支上工作时,通常会使用它。 - poke
嗯...在创建新分支/切换之前,我可能没有提交过。 - Ramy
6
如果您还没有提交任何更改,您可以使用git stash将工作保存到其他地方。 - poke
我遇到了这种情况。我从需要移动的提交中制作了补丁,然后将它们应用到正确的分支上,然后重置了不应该存在的那个分支。 - Ecropolis
显示剩余4条评论

6
如果你在意识到应该切换分支后提交了2次代码,那么只需执行以下操作:
git branch work_branch
git reset --hard HEAD~2

将数字2替换为您想要返回的提交数。此时,您仍在主分支上,如果您想要切换到分支以继续工作,只需git checkout work_branch

如果您想了解如何使用类似HEAD~2的引用遍历回退您的提交树的语法,请参见git rev-parse --help


嗨,@Mark Fisher,你说的“2倍”是什么意思? - atw
1
@adrianmann - 我的意思是,如果您完成了两个独立的工作部分,添加更改并提交每个更改,那么您的历史记录将显示为Start -> A -> B,其中A和B是两个提交。 - Mark Fisher

3
我通过以下方法解决了这个问题:
步骤1:从受感染的"master"分支创建一个新的分支,命名为"master_infected";
步骤2:现在使用"hard reset"命令从受感染的"master"分支中删除污染的提交。
 git reset --hard HEAD~2  
    
< p > (回退到HEAD之前的两个commits,因为我这里有两个有问题的commits。所以对于你的情况可能会不同)

现在我的master_infected分支包含了我想要保留的代码(如我所说的污染代码),而master分支现在处于安全模式。


2
从你应该有的地方创建一个新分支,然后将错误分支上的更改挑选到新分支中。
假设你没有将它推送到其他地方并且已经对其进行了其他更改,那么你可以删除错误的分支。

-1
git add --all
git commit -m <commit-message>
git branch -m master <feature-branch-name>
git push --set-upstream origin <feature-branch-name>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接