如何将更改从一个分支移动到另一分支git?


70

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

Answers:


52

您可以使用(或创建一个指向当前提交的新分支git branch branchnamegit checkout -b branchname如果您想直接检出它)。这基本上将复制您的master分支,因此您可以在那里继续工作。

如果您已成功复制了分支,则可以master使用git reset --hard commitwherecommit是提交的哈希值将其重置为原始点,该哈希应该是主节点上的最后一个哈希值。

因此,例如您遇到这样的情况:

---- 1 ---- 2 ---- 3 ---- 4 ---- 5 ---- 6
                   ^                    ^
              original                master
            master commit

所以,你已经签出master的承诺6,并希望创建一个新的分支ticket指向该6复位时master3

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

然后,您ticket指向提交6,而master指向3


2
如果您的新分支应该退出,那将起作用master。如果您需要在其他开发线上使用它,则必须研究git-rebase
che

2
-bgit checkout告诉Git的检查出来之前创建的分支。基本上是git branch name和的捷径git checkout name;当您要开始为某个新分支工作时,通常会使用它。

看起来创建新分支并没有继承我最初掌握的更改。在我的情况下没什么大不了的,但是对未来的了解是一件好事……
Ramy

你什么意思?如果创建分支,则该分支应指向HEAD(如果未指定其他提交)。因此,如果您在master上(并已提交所有内容),那么创建新分支将使您进入同一提交。

4
如果您尚未提交任何内容,则可以git stash用来将工作保存到其他地方。

70

如果未提交更改。

您可以将更改存储在master分支中。

git stash

然后结帐

git checkout -b newbranchname

然后在这里弹出更改

git stash pop

如果更改已提交:

然后创建一个分支:

git checkout -b newbranch

结帐回master分支:

git checkout master

重置为先前的提交:

git reset --hard head^1

2
这应该是公认的答案,因为OP没有指定工作已经完成
分歧

5

如果您在意识到自己应该进入分支机构之后两次提交(说),则只需执行

git branch work_branch
git reset --hard HEAD~2

将2替换为要返回的提交数。此时,您仍将处于掌握状态,如果您想移至分支机构继续工作,只需git checkout work_branch

看看git rev-parse --help您是否想了解如何遍历备份提交树的语法,例如HEAD~2


嗨@马克·费舍尔,“两次”是什么意思?
atw 2015年

1
@adrianmann-我的意思是,如果您做2个单独的工作,添加更改并提交每个更改,那么您的历史记录将类似于Start-> A-> B,其中A和B是2个提交。
马克·费舍尔

2

从应有的位置创建一个分支,然后将错误分支上的更改选择到新分支中。

然后,假设您没有将不良分支推送到其他位置,并且已经对其进行了其他更改,则可以删除该不良分支。


1

我通过以下方法解决了这个问题

步骤1:从受感染的master分支中创建一个新分支,并将其命名为master_infected

步骤2:现在hard reset将受感染的master分支机构删除commits

 git reset --hard HEAD~2  
    

commits之前返回两个,HEAD因为就我而言,我污染了两个commits。所以对于你而言,可能有所不同)

现在,我的master_infected分支包含要保留的代码(正如我所说的受污染的代码),并且该master分支现在处于保存模式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.