Git版本控制常用命令学习汇总

前言

看完了廖雪峰老师的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>可以删除一个远程标签。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章