Git的操作与理解

工作树:其存储着仓库内所有被管理文件 (untracked files是不记录在工作树中的) 的当前状态,随各文件的的改动而实时变化
HEAD : 当前分支中最新一次提交的指针
暂存区:提交之前的临时区域
(工作区 -add-> 暂存区 -commit-> 版本库)

git init        : 初始化仓库,即为项目生成(.git)
git status   : 查看仓库状态
git log         : 查看commit日志
            -p    : 显示每次提交的改动
     文件名    : 只显示与这个文件有关的commit日志
    —graph   : 以图表的形式显示分支commit情况
git reflog      : 查看当前仓库的操作日志 

git add       : 将文件或改动添加到暂存区中(commit的就是暂存区)
git commit : 吸纳暂存区的改动,更新HEAD(即将暂存区的改动添加到老的HEAD快照中合成为新的HEAD快照)
            -m  : 输入一行提交信息 
   不加参数 :会自动启动编辑器,允许输入详细的提交信息

git diff             : 查看工作树与暂存区之间的差别(将改动add到暂存区后,git diff就不会有输出了)
git diff HEAD  : 查看工作树与HEAD之间的差别(将改动commit之后,git diff HEAD就不会有输出了)
【两者是一个递进关系,体味如下:在将改动add到暂存区之前,暂存区状态=HEAD状态,但是工作树是记录着新改动的,所以git diff与git diff HEAD的输出是一样的。但是当add到暂存区之后,暂存区状态=工作树状态 > HEAD状态,因而git diff没输出,但git diff HEAD有输出】
所以得出:工作树记录着所有被管理文件的最新状态,暂存区是个过渡区,而commit不是拍下当前工作树的快照作为HEAD,而是吸纳暂存区的改动生成新的HEAD,要是commit直接拍下工作树的当前状态作为新HEAD,那还要暂存区有毛用?所以commit是不管当前工作树的状态,它只去暂存区里面看该怎么更新HEAD,所以每次改动之后,都要先add,才能commit
【体味下引入暂存区的设计理念:把代码的改动与commit之间隔离开来了,我可以改动十个文件,工作树负责记录这十个文件的新状态。这时我可以只commit其中的两个,只把这两个add到暂存区再commit就行了,其他八个都不受影响。而若是没有暂存区,commit时只是拍下工作树的当前状态作为新的HEAD,可能就没这么灵活了】

[主干分支master中是不能存在开发到一半的代码的,所有的开发活动都应该在特性分支中进行,开发完毕之后再合并到主干分支]
git checkout -b feature-A   =  git branch feature-A + git checkout feature-A
git checkout -b 本地分支名 origin/远程分支名:拉远程分支到本地,并切换到新建的本地分支上,同时还建立了该本地分支与远程分支之间的对应联系
git branch:查看本地分支
              -a:查看所有分支,包含远程分支
              -d:删除分支
【有时候,别人刚push到远程仓库的分支在本地用git branch -a是看不到的,此时可以切到master pull一下,就会更新了】

git reset —hard 哈希值 :将仓库的工作树、暂存区、HEAD回溯到指定状态
git merge feature-A :将feature-A分支合并到当前所在分支
【当merge到当前分支却产生冲突时,当前分支下的对应文件也会被修改的,修改后的冲突位置格式如下:
                                        <<<<<<< HEAD
                                        code on feature A(本分支代码)
                                        =======
                                        code on feature B(合并进来的feature/B的代码)
                                        >>>>>>> feature/B
这时,可手动修改,然后用git add与git commit达到合并到本分支的目的】
【所以merge有冲突时,git已经把两个分支的代码按上述格式重新写会到本分支的文件中去了,只要用git status找到哪些文件被改写了,再去手动改好,然后重新add与commit就可以了】

git remote add origin git@github.com:仓库名 :为本地仓库设置远程仓库[只有建立了本地仓库与远程仓库之间的对应联系,才能push或pull。在git clone时,会自动建立这种联系,但如果是手动在本地建的仓库,可能就得手动建立这种联系了]

git clone :复制远程仓库到本地,并自动建立master分支,同时建立本地仓库与远程仓库,master分支与origin master分支的对应联系
git pull origin 分支名:拉取远程分支的代码到当前分支(不会自动建立对应联系)
git push -u origin 分支名:将当前分支内容push到远程分支上
                                   -u   : upstream,置远程分支为本地分支的上游,建立两个分支的对应关系



github:
Fork:将别人的仓库fork到自己的github账户下
Clone:将别人的远程仓库clone到本地
Pull Request : 将自己github账户下修改后的feature分支推给原始的github仓库,请求合并

操作流程:首先Fork别人的仓库到自己的github账户下,然后clone到本地,建立分支并修改后,要push到自己fork来的仓库中,不能直接push到别人的仓库。新分支push到自己的github仓库后,向原始仓库发送pull request 

 

posted @ 2016-05-31 17:21  Mr.do  阅读(453)  评论(0编辑  收藏  举报