2011-01-07 141 views
14

它通常发生在我做了一些本地更改,只是发现我在错误的分支上创建了它,所以我需要在提交之前切换分支。问题是当有局部变化时,我不能切换分支。无论如何要这样做?GIT:将本地更改添加到非当前分支

显然,我可以复制更新的文件,切换分支,然后复制它们,但这看起来并不聪明!

回答

16

您可以在本地修改时切换分支,除非您的本地更改与两个分支之间的差异相冲突。在这种情况下,您可以使用-m--merge选项checkout来执行结帐,并在更改和由切换分支引起的更改之间执行合并。

git checkout -m other-branch 
9

当发生这种情况时,我使用git stash。它创建工作副本当前状态(缓存和未缓存的文件)的临时提交并将工作副本恢复为当前的HEAD。然后你可以切换到另一个分支并做git stash pop

+0

甜。您只需确保您的更改正在进行。完美的作品。 – helios 2013-01-21 01:21:02

2

正如其他人所说,您可以使用stashcheckout --merge。但是,这些选项会导致某些文件的时间戳发生更改。如果您正在编译一个需要很长时间编译的大型项目(我们目前的项目需要半小时才能编译分布式构建),但这可能不是最佳选择。

在这种情况下,您可以使用另一个存储库将提交移动到正确的分支。首先,你需要克隆当前的存储库(这只需进行一次):

$ git clone /path/to/repository repository.clone 
$ cd repository.clone 
$ git remote add origin repository.clone 
$ git fetch origin 

然后在你的当前仓库,你提交你的修改:

$ cd /path/to/repository 
$ git add path/to/modified/files 
$ git commit -m 'Commit message' 

另库,你获取新的承诺,并将其移动到正确的分支:

$ cd ../repository.clone 
$ git fetch origin 
$ git checkout correct-branch 
$ git reset --hard origin/correct-branch 
$ git cherry-pick origin/current-branch 
$ # resolve conflicts if any, commit with -c option in this case 
$ git push origin correct-branch:correct-branch 

然后在原来的仓库,你删除临时提交,并删除相关的修改(除非你想为k把它们都放在两个分支中)。

$ cd /path/to/repository 
$ git reset HEAD^ 
$ # edit file and remove modifications moved to other branch 

这是更为复杂,涉及的历史改写,但是当你的项目真的是大,编译时间是一个限制因素,它可以是巨大的,知道的技术。请注意,您可以重新使用克隆的存储库,因此不必每次都删除/重新创建它(如果编译时间很长,则存储库可能很大,并且克隆它可能需要一些时间)。