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

14

通常我会遇到这样的情况,我进行了一些本地改动,结果发现我在错误的分支上进行了修改,因此在提交之前需要切换分支。问题是当本地存在更改时,无法切换分支。是否有任何方法可以解决这个问题?

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

3个回答

16

如果你本地有修改但与两个分支之间的差异不冲突,那么可以在切换分支时进行。如果存在冲突,则可以使用 -m--merge 选项执行 checkout 命令进行切换,并在修改和切换分支所引起的更改之间执行合并操作。

git checkout -m other-branch

9

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


太好了。你只需要确保你的更改已经被暂存了。完美运行。 - helios
非常流畅,肯定是Stash让这件事变得轻松容易的。 - Martin

2
正如其他人所说,你可以使用“stash”或“checkout --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

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


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