在实际开发中,会使用git做为版本控制工具来完成团队协做。所以,对基本的git操做指令进行总结是十分有必要的,本文对一些术语或者理论基础,不从新码字,能够参考廖雪峰老师的博文html
git的通用操做流程以下图(来源于网络)java
主要涉及到四个关键点:git
更细节的来看:github
平常开发时代码实际上放置在工做区中,也就是本地的XXX.java这些文件,经过add等这些命令将代码文教提交给暂存区(Index/Stage),也就意味着代码全权交给了git进行管理,以后经过commit等命令将暂存区提交给master分支上,也就是意味打了一个版本,也能够说代码提交到了本地仓库中。另外,团队协做过程当中天然而然还涉及到与远程仓库的交互。vim
所以,通过这样的分析,git命令能够分为这样的逻辑进行理解和记忆:bash
git管理配置的命令;服务器
几个核心存储区的交互命令:网络
工做区与暂存区的交互;app
暂存区与本地仓库(分支)上的交互;编辑器
本地仓库与远程仓库的交互。
查询配置信息
git config --list
;git config --local --list
;git config --global --list
;git config --system --list
;第一次使用git,配置用户信息
git config --global user.name "your name"
;git config --global user.email "youremail@github.com"
;其余配置
git config --global merge.tool vimdiff
;git config --global color.ui auto
;git config --global core.editor vi
;新建仓库
git init
;git clone <url>
,如:git clone git://github.com/wasd/example.git;克隆项目时若是想定义新的项目名,能够在clone命令后指定新的项目名:git clone git://github.com/wasd/example.git mygit
;提交
git add .
git add <file1> <file2> ...
;git add [dir]
;撤销
git rm <file1> <file2>
;git rm --cached <file>
;git reset HEAD <file>...
;git checkout --<file>
。要肯定上一次对文件的修改再也不须要,若是想保留上一次的修改以备之后继续工做,可使用stashing和分支来处理;git stash
;git stash list
;git stash apply
,若是想应用更早的储藏:git stash apply stash@{2}
;从新应用被暂存的变动,须要加上--index
参数:git stash apply --index
;git stash drop stash{0}
;若是使用pop命令不只能够从新应用储藏,还能够马上从堆栈中清除:git stash pop
;git stash show -p stash@{0} | git apply -R
;一样的,若是你沒有指定具体的某个储藏,Git 会选择最近的储藏:git stash show -p | git apply -R
;更新文件
git mv [file-original] [file-renamed]
;查新信息
git status
;git diff <file-name>
;提交文件到版本库
git commit -m "commit_info"
;git commit -a -m "commit_info"
;git commit --amend
;查看信息
git diff --cached
;git diff <file-name> --cached
;-p
展开每次提交的内容差别,用-2
显示最近的两次更新,如git log -p -2
;打标签
Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,其实是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签自己也容许使用 GNU Privacy Guard (GPG) 来签署或验证。通常咱们都建议使用含附注型的标签,以便保留相关信息;固然,若是只是临时性加注标签,或者不须要旁注额外信息,用轻量级标签也没问题。
git tag
;git tag -l "v1.4.2.*"
;-a
参数,如git tag -a v1.4 -m "my version 1.4"
;git show v1.4
;-s
参数:git tag -s v1.5 -m "my signed 1.5 tag"
;git tag -v <tag-name>
,如git tag -v v1.5
;-a
,-s
以及-m
选项都不须要,直接给出标签名字便可,如git tag v1.5
;git push origin <tag-name>
,如git push origin v1.5
;git push origin --tags
;分支管理
git branch <branch-name>
,如git branch testing
;git checkout <branch-name>
,如git checkout testing
;git checkout -b <branch-name>
;git branch -d <branch-name>
;git merge <branch-name>
;git branch
;git branch -v
;git branch --merged
;git branch --no-merged
;git merge <remote-name>/<branch-name>
,如git merge origin/serverfix
;若是是单线的历史分支不存在任何须要解决的分歧,只是简单的将HEAD指针前移,因此这种合并过程能够称为快进(Fast forward),而若是是历史分支是分叉的,会以当前分叉的两个分支做为两个祖先,建立新的提交对象;若是在合并分支时,遇到合并冲突须要人工解决后,再才能提交;:git checkout -b <branch-name> <remote-name>/<branch-name>
,如git checkout -b serverfix origin/serverfix
;git push
。该命令会自动判断应该向远程仓库中的哪一个分支推送数据;在跟踪分支上合并远程分支:git pull
;git rebase <rebase-branch> <branch-name>
,如git rebase master server
,将特性分支server提交的改变在基底分支master上重演一遍;使用rebase操做最大的好处是像在单个分支上操做的,提交的修改历史也是一根线;若是想把基于一个特性分支上的另外一个特性分支变基到其余分支上,可使用--onto
操做:git rebase --onto <rebase-branch> <feature branch> <sub-feature-branch>
,如git rebase --onto master server client
;使用rebase操做应该遵循的原则是:一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行rebase操做;git remote
;在克隆完每一个远程仓库后,远程仓库默认为origin
;加上-v
的参数后,会显示远程仓库的url
地址;git remote add [remote-name] [url]
,好比:git remote add example git://github.com/example/example.git
;git fetch [remote-name]
,如git fetch origin
;使用fetch只是将远端数据拉到本地仓库,并不自动合并到当前工做分支,只能人工合并。若是设置了某个分支关联到远程仓库的某个分支的话,可使用git pull
来拉去远程分支的数据,而后将远端分支自动合并到本地仓库中的当前分支;git push [remote-name] [branch-name]
,如git push origin master
;若是想将本地分支推送到远程仓库的不一样名分支:git push <remote-name> <local-branch>:<remote-branch>
,如git push origin serverfix:awesomebranch
;若是想删除远程分支:git push [romote-name] :<remote-branch>
,如git push origin :serverfix
。这里省略了本地分支,也就至关于将空白内容推送给远程分支,就等于删掉了远程分支。git remote show origin
;git remote rename [old-name] [new-name]
,如git remote rename origin org
;git remote rm [remote-name]
;通常咱们总会有些文件无需归入 Git 的管理,也不但愿它们总出如今未跟踪文件列表。一般都是些自动生成的文件,好比日志文件,或者编译过程当中建立的临时文件等。咱们能够建立一个名为 .gitignore 的文件,列出要忽略的文件模式。以下例:
## 此为注释 – 将被 Git 忽略
## 忽略全部 .a 结尾的文件
*.a
## 但 lib.a 除外
!lib.a
## 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
## 忽略 build/ 目录下的全部文件
build/
## 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
## 忽略 doc/ 目录下全部扩展名为 txt 的文件
doc/**/*.txt
复制代码
参考资料