标签: githtml
[TOC]git
本文是git系列博客的第二篇。本文对指令按照使用场景(建库,查看,修改,分支)进行分类概括,介绍指令基本含义和用法,方便查阅。github
参考我前面的博客:git在各操做系统平台下的安装和配置数据库
工做区:就是你在电脑里能看到的目录,好比个人learngit文件夹就是一个工做区。segmentfault
版本库:工做区有一个隐藏目录.git,这个不算工做区,而是Git的版本库。服务器
暂存区:Git的版本库里存了不少东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为咱们自动建立的第一个分支master,以及指向master的一个指针叫HEAD。app
咱们把文件往Git版本库里添加的时候,是分两步执行的:学习
第一步是用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区;fetch第二步是用
git commit
提交更改,实际上就是把暂存区的全部内容提交到当前分支。网站
由于咱们建立Git版本库时,Git自动为咱们建立了惟一一个master分支,因此,如今git commit就是往master分支上提交更改。
简单理解:须要提交的文件修改统统放到暂存区,而后,一次性提交暂存区的全部修改。
详细知识见工做区和暂存区和[Git 基础 - 记录每次更新到仓库
](https://git-scm.com/book/zh/v...
创建远程库(为空,不要加README.md,否则后面会push不上去)
本地新建文件夹
git init
初始化仓库,能够发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的。勿人为瞎改
远程库的名字就是origin
,这是Git默认的叫法
git remote add origin git@github.com:michaelliao/learngit.git
这个命令是在本地的learngit仓库下执行的。这两个地方的仓库名不须要相同,由于会经过在本地的仓库目录下执行这条命令(命令中包含远程库的名字)已经将二者创建了联系
git push -u origin master
把本地库的全部内容推送到远程库上。把本地库的内容推送到远程,用git push
命令,其实是把当前分支master推送到远程。因为远程库是空的,咱们第一次推送master分支时,加上了-u参数(推送和关联),Git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在之后的推送或者拉取时就能够简化命令。
git push origin master
每次本地提交后,推送最新修改到远程库
假设github上面已经有一个远程库,可是本地没有,须要克隆到本地,远程库的名字叫gitskills
git clone git@github.com:michaelliao/gitskills.git
克隆一个本地库,则在当前文件夹下会多一个gitskills
的文件夹。
cd gitskills
进入克隆下来的本地库,默认的名字是和github上的同样的
git push origin master
推送分支,就是把该分支上的全部本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上
git status
查看仓库当前的状态
git diff 文件名
查看对文件作什么修改
git diff 版本号1 版本号2 --stat
查看两个版本的差别的文件列表,包括被修改行数和增删图。参数改成--name-status
前面显示修改说明字母(A,M等),无行数
git log
显示从最近到最远的提交日志
git log --pretty=oneline
简化日志输出的显示信息,commit id
很长,详细显示见这里
git reflog
记录你的每一次命令,最早显示的是这个命令执行以后的版本的版本号的前七位,这样就算你清屏了或者重启了,也能找到某个版本的版本号,就能够轻松回退到那个版本
git branch
查看当前所在的分支。git branch
命令会列出全部分支,当前分支前面会标一个*
号
git log --graph --pretty=oneline --abbrev-commit
用带参数的git log能够看到分支的合并状况。用git log --graph
命令能够看到分支合并图
git remote
查看远程库的信息
git remote -v
显示更为详细的信息
git add readme.txt
添加,可是不提交
git commit -m "提交描述"
提交,只有add后提交才有效。"改文件->add文件->再改->提交",则第二次修改无效,不会被提交,只会成功提交第一次的修改。
git checkout -- 文件名
把没暂存(即没add)的干掉,或者说,丢弃工做区,回到到暂存状态
git reset HEAD 文件名
把暂存的状态取消,工做区内容不变,但状态变为“未暂存”。
简单来讲,没有add过的修改,只须要git checkout -- 文件名
便可撤销;add 过的修改,先git reset HEAD 文件名
变成没add 过的修改,再git checkout -- 文件名
撤销。操做示例能够看这张图
git reset --hard HEAD^
会回退到上一个版本
git reset --hard 某版本号前几位
经过命令行上的历史信息(假如你没清屏的话),找到某版本 的版本号回到指定版本。不必定要所有的版本号,就像这个命令的例子,只要前面的约七、8位这样就能够。
git checkout -b dev
建立一个新的分支:dev,而且会切换到dev分支。因此这条命令有两个做用。git checkout命令加上-b
参数表示建立并切换,至关于如下两条命令:git branch dev
和git checkout dev
git branch dev
,新建分支是新建指针,指向当前commit
git checkout dev
切换到dev分支
git checkout master
dev分支的工做完成,咱们就能够切换回master分支(此时在dev分支的修改在master上是看不到的)
git merge dev
这是在master分支上执行的命令,做用是:把dev分支上的工做成果合并到master分支上
git branch -d dev
删除已合并的分支。删除分支就是删除指针
git branch -D dev
Git友情提醒,dev分支尚未被合并,若是删除,将丢失掉修改,若是要强行删除,须要使用git branch -D dev
命令
git rebase master
变基。在当前分支(非master)下执行该命令,则至关于把当前分支和mater分支合并,和merge操做相似,但提交历史不一样,rebase操做的log更干净。具体可参考Git 分支 - 变基
假设在master分支和feature1分支对同一文件作了修改
git merge feature1
在master分支上执行该命令,与feature1分支合并。这种状况下,Git没法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,果真冲突了!Git告诉咱们,readme.txt文件存在冲突,必须手动解决冲突后再提交。git status
也能够告诉咱们冲突的文件
合并分支时,若是可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。若是要强制禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就能够看出分支信息
git merge --no-ff -m "merge with with no-ff" dev
准备合并dev分支,注意--no-ff
参数表示禁用Fast forward,由于本次合并要建立一个新的commit,因此加上-m参数,把commit描述写进去
Git还提供了一个stash功能,能够把当前工做现场“储藏”起来,等之后恢复现场后继续工做
git stash
保存工做现场
git stash list
查看工做现场
git stash apply
恢复工做现场,可是恢复后,stash内容并不删除,有多个工做现场时能够git stash apply stash@{0}
恢复特定的现场
git stash drop
删除stash的内容
git stash pop
恢复的同时也把stas内容删除了
这部分只介绍经常使用的几个操做
git fetch origin
这个命令查找 “origin” 是哪个服务器,从中抓取本地没有的数据,而且更新本地数据库,移动 origin/master
指针指向新的、更新后的位置
git push (remote) (branch)
推送本地的分支来更新远程仓库上的 同名分支。如前文提到的git push origin master
就是将本地master分支推送到远程master分支;复杂一点的,git push origin serverfix:awesomebranch
将本地的 serverfix分支推送到远程仓库上的awesomebranch分支
git push origin --delete serverfix
或者git push origin :remotebranch
,删除远程的serverfix分支
git pull
在大多数状况下它的含义是一个git fetch
紧接着一个git merge
命令。具体可参考Git远程操做详解和Documentation git-pull