前言
看完了廖雪峰老师的git讲解,写篇文章总结一下,希望以后用得着的时候进来看看
最简单的
首先git分为工作区——暂存区——
git add:所有修改放到暂存区(Stage)
git commit -m "提交信息":一次性把暂存区的所有修改提交到分
支
git status :查看工作区状态
git diff:可以查看工作区和暂存区修改内容
git log :显示提交日志(显示commitId,Author,Date 提交信息)
git log --pretty=oneline:显示一条线日志(只显示commitId和提交信息)
版本回退
git reset --hard head^ :还原到上个版本^个数对应上几个版
本
git reset --hard <commitId>: 还原到特定版本
git reflog :查看命令版本历史,回到未来哪个版本
git diff HEAD -- <file> :查看工作区和版本库里面最新版本的区别
撤销修改
git checkout -- <file> 在工作区的修改全部撤销
git reset HEAD <file>暂存区的修改撤销掉(unstage),重新放回工作区
再严重点已经提交到版本库的话并且没有推送到远程,那就用前面的版本命令会退到制定版本就ok。
删除文件
1.如果你用的rm删除文件,那就相当于只删除了工作区的文件,如果想要恢复,直接用git checkout -- <file>就可以 2.如果你用的是git rm删除文件,那就相当于不仅删除了文件,而且还添加到了暂存区,需要先git reset HEAD <file>,然后再git checkout -- <file> 3.如果你想彻底把版本库的删除掉,先git rm,再git commit 就ok了
分支操作
注意点:
一般我们写一个新功能时,会创建一个新的分支(假设dev)。然后在dev分支下开发,开发完成后 执行add,commit后切换到当前分支,此时在当前分支下是看不到dev上新功能的代码的,所以需要merge dev分支到当前分支,最后删除dev分支。
问题:这里我发现 假如在dev分支上开发完成后不执行add,commit操作直接切换到原来分支,是可以看到dev上的功能代码的,那么那这样的话,干嘛其他分支还要add和提交呢??也不需要切换到主分支之后在进行合并操作了呀???直接在主分支push操作就可以了呀?
回答:你在dev分支修改了文件,但是你没有提交到仓库,实际上就是相当于你在本地手动修改了这个文件,仓库并不能保存你做的改动,所以在master分支能看到文件被改动了(相当于你没用dev分支直接修改了这个文件一样),所以你可以用master分支add、commit
git checkout -b <dev> :创建并切换分支,相当于以下两条命令
git branch <dev>:穿件分支dev
git checkout <dev>:切换到分支dev
git branch :列出所有分支,当前分支前面会标一个*号
git branch -d <dev>:删除当前分支
git merge <dev>:合并某分支到当前分支git log --graph命令可以看到分支合并图
合并dev
分支,默认是Fast forward模式(
看不出来曾经做过合并),
请注意--no-ff
参数,表示禁用Fast forward ,
因为本次合并要创建一个新的commit,所以加上-m
参数,把commit描述写进去。
git merge --no-ff -m "merge with no-ff" dev
冲突解决
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
处理紧急bug
git stash : 当前工作现场“储藏”起来
git stash list :列出储藏列表
git stash apply: 恢复后,stash内容并不删除
git stash drop:删除储藏
git stash pop:恢复的同时把stash内容也删了
git cherry-pick <commit>:把bug提交的修改“复制”到当前分支,避免重复劳动。
git branch -D <name>:丢弃一个没有被合并过得分支
先说几个名词 未被追踪的文件:指的是新建的文件或文件夹且还没加入到暂存区(新建的还没有被git add 过得) 未加入到暂存区的文件:指的是已经被追踪过,但是没有加入到暂存区(已经执行过git add/commit的但是这次修改后还没有git add) 举例: readme.md 已经被git add/git commit过,但是呢 我这次只是修改了,而且没有修改完,不能commit test 新建的文件夹,没有被git add/git commit过 有个急事需要处理,这时候我需要切换分支,去处理紧急任务,比如文中的举例去修改bug, 正确的步骤: git add test(让git去追踪这个新文件) git stash保留现场 如果我不执行这两个命令,那么我在修改BUG完成之后 git status,就会发现readme.md 没有添加到暂存区,同时又多了个test文件,但是自己的readme.md没有完成,万万不可以提交,这样导致bug的修改代码也提交不了。所以你需要 git stash,这样你在提交修改bug代码的时候 ,就不会看见readme.md 和 test。可以安心提交修改bug的代码。git stash
不能将未被追踪的文件(untracked file)压栈,也就是从未被git add
过的文件,也就是你在使用git status
命令看到的提示Untracked files
所列出的文件,所以在git stash
之前一定要用git status
确认没有Untracked files
远程库推送
git remote -v:
查看远程库信息
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交;
你本地已经建立了dev分支,但是还没有和远程dev分支关联的时候采用使用git checkout -b branch-name origin/branch-name
或者
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
;
从远程抓取分支,使用git pull
,如果有冲突,要先处理冲突
tag打标签
-
命令
git tag <tagname>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id; -
命令
git tag -a <tagname> -m "blablabla..."
可以指定标签信息; -
命令
git tag
可以查看所有标签。 -
命令
git push origin <tagname>
可以推送一个本地标签; -
命令
git push origin --tags
可以推送全部未推送过的本地标签; -
命令
git tag -d <tagname>
可以删除一个本地标签; -
命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。