我经常发生在我进行一些本地更改时,才发现我在错误的分支上进行了更改,因此我需要在提交之前切换分支。问题是当有本地更改时我无法切换分支。有没有办法做到这一点?
显然,我可以复制更新的文件,切换分支,然后将它们复制回来,但这似乎并不聪明!
我经常发生在我进行一些本地更改时,才发现我在错误的分支上进行了更改,因此我需要在提交之前切换分支。问题是当有本地更改时我无法切换分支。有没有办法做到这一点?
显然,我可以复制更新的文件,切换分支,然后将它们复制回来,但这似乎并不聪明!
您可以在进行本地修改时切换分支,除非您的本地更改与两个分支之间的差异冲突。在这种情况下,您可以使用-m
or--merge
选项来checkout
执行检出,并在更改和切换分支引起的更改之间执行合并。
git checkout -m other-branch
我git stash
在发生这种情况时使用。它创建工作副本(缓存和未缓存文件)当前状态的临时提交,并将工作副本恢复到当前 HEAD。然后您可以切换到另一个分支并执行git stash pop
.
正如其他人所说,您可以使用stash
or 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
这更复杂并且涉及历史重写,但是当您的项目非常大并且编译时间是一个限制因素时,了解该技术可能会很棒。请注意,您可以重复使用克隆的存储库,因此无需每次都删除/重新创建它(如果编译时间较长,则存储库可能很大,克隆它可能需要一些时间)。