我经常遇到一些局部更改,但发现我在错误的分支上进行了更改,因此我需要在提交之前切换分支。问题是当局部更改时我无法切换分支。反正有吗?
显然,我可以复制更新的文件,切换分支,然后将它们复制回来,但这看起来并不聪明!
答案 0 :(得分:16)
您可以在进行本地修改时切换分支,除非您的本地更改与两个分支之间的差异冲突。在这种情况下,您可以使用-m
或--merge
选项checkout
来执行结帐,并在更改和切换分支所引起的更改之间执行合并。
git checkout -m other-branch
答案 1 :(得分:9)
发生这种情况时我会使用git stash
。它创建工作副本的当前状态(缓存和未缓存文件)的临时提交,并将工作副本还原为当前HEAD。然后您可以切换到另一个分支并执行git stash pop
。
答案 2 :(得分: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
这更复杂并且涉及历史重写,但是当您的项目非常庞大并且编译时间是一个限制因素时,了解该技术可能会很棒。请注意,您可以重用克隆的存储库,因此无需每次都删除/重新创建它(如果编译时间很长,那么存储库可能很大,克隆它可能需要一些时间)。