GIT:将本地更改添加到非当前分支

时间:2011-01-07 09:05:25

标签: git git-branch

我经常遇到一些局部更改,但发现我在错误的分支上进行了更改,因此我需要在提交之前切换分支。问题是当局部更改时我无法切换分支。反正有吗?

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

3 个答案:

答案 0 :(得分:16)

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

git checkout -m other-branch

答案 1 :(得分:9)

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

答案 2 :(得分: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

然后在原始存储库中删除临时提交,并删除相关的修改(除非您希望将它们保留在两个分支中)。

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

这更复杂并且涉及历史重写,但是当您的项目非常庞大并且编译时间是一个限制因素时,了解该技术可能会很棒。请注意,您可以重用克隆的存储库,因此无需每次都删除/重新创建它(如果编译时间很长,那么存储库可能很大,克隆它可能需要一些时间)。