文章大纲

工作必备:git综合手札

2019-03-17 22:47:58

学习知识,有时候找对资料真的很重要。

推荐资料:git使用简易指南

git官方英文文档地址:https://git-scm.com/docs


首先了解本地工作区(Working Dir),缓存区(Index),


常用问题:

1. git reset 的三个参数soft,mixed, hard有什么区别?

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 //强制推送


2. 如果修改了项目,但还没git add,发现修改不对,如何回退所有修改?

如果仅仅只是修改了文件,就选择如下命令执行:

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相关用法



3. 如果git add fileA  fileB,命令执行后发现文件添加错了,如何撤销?

git status      //先看一下文件状态,add之前是红色,add之后是绿色 
git reset HEAD //如果后面什么都不跟的话 就是上一次add 里面的全部撤销了 
git reset HEAD //fileA 就是对某个文件进行撤销了。

如果理解了上面--mixed参数,就应该理解这里的执行命令了。



4. 如果代码已经commit了,想立马取消,如何撤销?

git reset HEAD^     //或git reset HEAD~1, 就是回退到commit之前的版本

如果想回退到好多次commit之前,那又该如何操作呢?

git reflog     //先查看commit历史记录
git reset 版本号 //是不是用hard参数,自己看着办
git checkout . //如果没有使用hard参数,就手动从暂存区把回退的版本代码更新到工作区



5.本该在A分支下开发功能,却忘记切换分支了,在B分支下开发了,代码写了很多怎么办?

//假定你现在就在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

如下图示供参考:




6.如何为某个bug的修复创建分支,每次push就只push那些bug解决了的分支,而不用push其它改动了的无关文件。

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分支



7. git add 各种区别。

直接看图吧。总结下来就是:

如果怕提交误删的文件,就用git add . 命令。

//2019-03-24更新备注

现在git都是2.x版本,避免提交删除的文件,就用 git add --ignore-removal .


image


8. git stash的相关用法

之前不太了解,git stash太多,却忘记pop,导致自己纳闷怎么写好的代码就动不动就不翼而飞了。

git stash list一查,才发现自己把自己坑得有多惨。



下面这个链接很不错,先记着,有时间多试试。

git stash 用法总结和注意点

(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


9.git reflog与git log的区别

git reflog与git log相比,可以看到删除的commit记录


10. 本地创建了新分支,如何推送到远端?

git push --set-upstream origin 新分支名




我要评论
评论列表