Git 是一种分布式版本控制系统

创建版本库

    mkdir  dirname 新建目录
    cd dirname    
    git init   把该目录变成 Git 仓库
    该目录下有个 .git 隐藏目录,不要去改这个目录里的文件
添加文件
    git add filename.txt
    
把文件提交给仓库
    git commit -m "xxx"          -m后面输入的是本次提交的说明
查看仓库当前状态
    git status
比较修改了什么内容
    git diff filename.txt
查看提交的历史
    git log   命令显示从最近到最远的提交日志
    git log --pretty=oneline        每个版本只输出一行(commit id  和 提交说明)
查看提交的命令历史
    git reflog
你看到的一大串字符是commit id(版本号)
在Git中,用HEAD表示当前版本,上一个版本是HEAD^,上上版本是HEAD^,往上前 n 个版本是 HEAD~n
git reset --hard HEAD^   回退到上一版本
git reset --hard 版本号  到该commit id 号对应的版本  commit id 可以不写全,但一定要写到 Git可以区分的程度
工作区和暂存区的概念
dirname 就是一个工作区
工作区里的隐藏目录 .git ,不算工作区,是 Git 的版本库
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,
还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。
Git 管理的是修改。你第一次修改 filename.txt  并执行 git add ,把它提交到暂存区,第二次修改 filename.txt 不添加,执行 git commit
你会发现只有第一次的修改被提交了,第二次没有被提交。       git commit 只负责暂存区中的内容
每次修改,如果不add到暂存区,那就不会加入到commit中
撤销修改
    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- filename
    场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD filename(HEAD表示最新版本),就回到了场景1,
    第二步按场景1操作。
    场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,回退一个版本。
删除文件
    rm filename
    
    Git 会记录下来,使用 git status 会告诉你哪些文件被删除了
    如果确实要从版本库中删除,用 git rm 删掉,并且要用 git commit
    如果误删  用 git checkout -- filename   git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改
克隆一个仓库,git clone 仓库的地址
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
用git log --graph命令可以看到分支合并图。
git log --graph --pretty=oneline --abbrev-commit
分支策略
     git merge --no-ff -m "merge with no-ff" dev   
     合并分支  加 --no--ff 表示以普通模式合并,-m 说明,合并后的历史有分支,能看出来曾经做过合并,
     通常,合并分支时,如果可能,Git 会使用Fast forward模式,而这种模式合并后看不出曾经做过合并。
git stash   
    把当前工作现场储存起来,以后可以恢复现场继续工作,像快照
    
git stash list 查看存的工作现场
恢复工作现场
    git stash apply 恢复,恢复后 stash 内容不会删除,需要用 git stash drop 来删除
    
    git stash pop ,恢复的同时把 stash 内容也删除
强制删除一个没有被合并过的分支
    git branch -D <name>
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突
创建标签
    命令git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
    git tag -a <tagname> -m "blablabla..."可以指定标签信息;
    git tag -s <tagname> -m "blablabla..."可以用PGP签名标签;
    命令git tag可以查看所有标签。
管理标签
    命令git push origin <tagname>可以推送一个本地标签;
    命令git push origin --tags可以推送全部未推送过的本地标签;
    命令git tag -d <tagname>可以删除一个本地标签;
    命令git push origin :refs/tags/<tagname>可以删除一个远程标签。