学习知识,有时候找对资料真的很重要。
推荐资料:git使用简易指南
git官方英文文档地址:https://git-scm.com/docs
首先了解本地工作区(Working Dir),缓存区(Index),
常用问题:
git reset --soft // 还原 HEAD
git reset --mixed // 还原 HEAD、Index ,此项为默认参数
git reset --hard // 还原 HEAD、Index、Working Directory
hard参数会对你工作区的修改不可毁灭的影响,在工作区修改没有commit的情况下,还是尽量不要用的好。
用git reset 回退到上一次commit后,push到远端报如下错误是什么原因?
Your branch is ahead of 'origin/master' by 1 commit
这是git的安全机制,当工作区版本和远端版本不一致造成的。git一般都是团队工作的,如果git轻易就让你将回退推送到远端,那其它同事在回退分支后的开发工作就都是无用功了。
如果是你一个人操作,你想远端也回退到上个版本,就按如下操作:
git reset HEAD~1 //和git reset HEAD^等效
git status //查看确认下,显示的是不是都是你不想要的
git clean -fd //删除所有提交的文件及文件夹
git push -f //强制推送
如果仅仅只是修改了文件,就选择如下命令执行:
git checkout 文件名 //撤销指定文件的修改
git checkout . //撤销所有文件的修改
git checkout -- 文件名A 文件名B //撤销几个文件的修改,注意一定要带上中间的破折号。
git checkout 作用就是拉取缓存区(Index)的内容,覆盖工作区(Working Dir)的内容
但如果是新增了文件或文件夹,就选择如下命令执行:
git clean -nf //提前查看要删除的文件列表,养成良好习惯,避免删掉了自己心爱的代码
git clean -nd //也是提前查看,这里不仅显示文件,还显示文件夹
git clean -f 文件名 //删除工作区指定的新增文件
git clean -f //删除工作区所有的新增文件
git clean -fd //删除所有新增的文件夹及文件
git checkout对于新增的untracked文件是不起作用的。
这里有git clean相关命令的博文链接: git clean相关用法
git status //先看一下文件状态,add之前是红色,add之后是绿色
git reset HEAD //如果后面什么都不跟的话 就是上一次add 里面的全部撤销了
git reset HEAD //fileA 就是对某个文件进行撤销了。
如果理解了上面--mixed参数,就应该理解这里的执行命令了。
git reset HEAD^ //或git reset HEAD~1, 就是回退到commit之前的版本
如果想回退到好多次commit之前,那又该如何操作呢?
git reflog //先查看commit历史记录
git reset 版本号 //是不是用hard参数,自己看着办
git checkout . //如果没有使用hard参数,就手动从暂存区把回退的版本代码更新到工作区
//假定你现在就在B分支下
git add . //把所有改动暂存
git stash //把暂存的文件提交到git的暂存栈
git checkout 本该提交代码的分支
git stash pop //将暂存栈中的代码放出来
但如果在B分支下开发的代码,已经commit了,那该怎么办?
//假定你现在就在B分支下
git reset head^ //将暂存区及Head回退到上一版本,这样工作区就保留了你在B分支下开发的代码
git stash //把暂存的文件提交到git的暂存栈
git checkout 该提交代码的分支
git stash pop
如下图示供参考:
git branch //查看分支
git branch A //创建A分支
git checkout A //切换到A分支
//使用下面命令,创建及切换一步到位git checkout -b 分支名
然后改动文件,改完后git add, git commit.
再切换到主分支,合并A分支。
git merge A
最后git push。
分支不要了,就删除它:
git branch -d A 删除A分支
直接看图吧。总结下来就是:
如果怕提交误删的文件,就用git add . 命令。
//2019-03-24更新备注
现在git都是2.x版本,避免提交删除的文件,就用 git add --ignore-removal .
之前不太了解,git stash太多,却忘记pop,导致自己纳闷怎么写好的代码就动不动就不翼而飞了。
git stash list一查,才发现自己把自己坑得有多惨。
下面这个链接很不错,先记着,有时间多试试。
(1)git stash save "save message" // 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。
(2)git stash list //查看stash了哪些存储
(3)git stash show //显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
(4)git stash show -p // 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p
(5)git stash apply //应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}
(6)git stash pop :命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}
(7)git stash drop stash@{$num} :丢弃stash@{$num}存储,从列表中删除这个存储
(8)git stash clear :删除所有缓存的stash
git reflog与git log相比,可以看到删除的commit记录
git push --set-upstream origin 新分支名