热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gitpull报错及解决办法gitstash

gitpull命令等同于先做了gitfetch,再做了gitmerge,当gitmerge后有可能会报错:Yourlocalchangeswouldbeoverwrittenbym

git pull 命令等同于先做了git fetch ,再做了git merge, 当git merge后有可能会报错:Your local changes would be overwritten by merge. Commit, stash or revert them to proceed

报错原因是你对本地的代码进行了更改,而未对代码进行提交、存放或还原

解决方法:使用git stash先将更改的代码暂存起来

 

什么是stash:stash翻译为存放、贮藏

git stash命令可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。

使用git stash将未提交的代码保存之后,现在仓库的状态是和上一次提交的内容是完全一样的

此时再进行git merge temp就不会报错了

 

git stash用法详解:

 

 

 git stash 工作树模型:HHEAD提交.I是存储单元的提交.W是工作树中的提交.

git stash常用命令:

1 git stash等同于git stash save存储的修改列表.
2 git stash list查看.
3 git stash show用于校验,
4 git stash apply用于重新存储.

 


应用举例

通过几个实际的示例来了解一下git stash的强大.


开发到一半,同步远端代码

当你的开发进行到一半,但是代码还不想进行提交 ,然后需要同步去关联远端代码时.如果你本地的代码和远端代码没有冲突时,可以直接通过git pull解决.但是如果可能发生冲突怎么办.直接git pull会拒绝覆盖当前的修改.

遇到这种情况,需要先保存本地的代码,进行git pull,然后再pop出本地代码:

1 git stash
2 git pull
3 git stash pop

 


工作流被打断,需要先做别的需求

当开发进行到一半,老板过来跟你说"线上有个bug,你现在给我改好,不然扣你鸡腿".当然,你可以开一个新的分支,把当前代码提交过去,回头再merge,具体代码如下

1 繁琐的工作流示例
2 # ... hack hack hack ...
3 git checkout -b my_wip
4 git commit -a -m "WIP"
5 git checkout master
6 edit emergency fix
7 git commit -a -m "Fix in a hurry"
8 git checkout my_wip
9 git reset --soft HEAD^
10 # ... continue hacking ...

我们可以通过git stash来简化这个流程

1 繁琐的工作流示例
2 # ... hack hack hack ...
3 git checkout -b my_wip
4 git commit -a -m "WIP"
5 git checkout master
6 edit emergency fix
7 git commit -a -m "Fix in a hurry"
8 git checkout my_wip
9 git reset --soft HEAD^
10 # ... continue hacking ...

 


提交特定文件

如果对多个文件做了修改,但是只想提交几个文件,或者想先暂时保存几个修改,测试其他文件的执行结果.可以通过git stash save --keep-index来进行.

1 # ... hack hack hack ...
2 git add --patch foo //只将第一部分加入管理the index
3 git stash save --keep-index //将其余部分保存起来
4 edit/build/test first part
5 git commit -m 'First part' //提交全部的git管理中的代码
6 git stash pop //继续进行存储代码的工作
7 # ... repeat above five steps until one commit remains ...
8 edit/build/test remaining parts
9 git commit foo -m 'Remaining parts'

 


恢复被错误clear/drop的存储

如果因为失误对存储仓库进行了clear或者drop操作,在一般机制下是不能恢复的.但是可以通过以下指令来获取仍在仓库中的,但是已经不可获取的存储列表

1 git fsck --unreachable |
2 grep commit | cut -d\ -f3 |
3 xargs git log --merges --no-walk --grep=WIP

 


git stash 的具体用法

git stash通过在指令后添加其他的附件选项,实现复杂的定制化操作,下面我们来对具体用法进行讲解.


save, push

1 save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] []
2
3 push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-m|--message ] [--] [

…​]

 

savepush命令都可以用于存储修改.并且将git的工作状态切回到HEAD也就是上一次合法提交上.后面的是选填项.

如果给定具体的文件路径,git stash只会处理路径下的文件.其他的文件不会被存储

--keep-index(简写为-k)只会存储为加入git管理的文件

--include-untracked为追踪的文件也会被缓存,当前的工作空间会被恢复为完全清空的状态.如果不使用--include-untracked而是用--all,那么除了未加入管理的文件,被git忽略(ignore)的文件也会被缓存.

--patch命令可以让我们选择当前修改和HEAD提交diff部分.


list

list []展示当前存储库中的存储单元列表.每个元素包含的信息有索引位置,存储时所在的分支,存储前的提交的描述.举例

1 stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation
2 stash@{1}: On master: 9cc0589... Add git-stash

 

show

show []展示存储单元和最新提交的diff结果.如果没有给定参数时,会对比最新的存储单元.


pop

 

pop [--index] [-q|--quiet] []移除单个存储单元.和git stash save的作用相反.


Your local changes would be overwritten by merge. Commit, stash or revert them to proceed

推荐阅读
author-avatar
前世梦0708
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有