git中文件所在位置有四个,在工做区内、在索引区内、在本地仓库、在远程仓库。处于四个位置中文件的状态分别为untracked、unmodified、modified、staged。经过三个操做能够把文件进行状态转移:git add 把工做区文件添加到索引区;git commit 把索引区文件添加到本地仓库;git push 把本地仓库文件添加到远程仓库。git
为了方便记忆,本身想了一个不肯定是否恰当的类比:若是类比咱们平时的一个文档编辑活动。文件在工做区时,咱们能够类比成咱们准备好了一段要存储的内容;在索引区时,能够类比为咱们在某个位置新建了一个word文档,往里输入了咱们刚刚准备的内容,可是没有保存至关于这个时候git才知道这个文件的存在;文件在本地仓库时,至关于ctrl +s 把文件保存到了文件系统中;在远程仓库,就至关于咱们把本地文件存储到了云盘。缓存
一下内容引用了不少大佬的文章,由于本地整理的太早了,出处记录不详,后续慢慢补充参考信息。服务器
工做区(working directory), 简言之就是你工做的区域。对于git而言,就是的本地工做目录。工做区的内容会包含提交到暂存区和版本库(当前提交点)的内容,同时也包含本身的修改内容。app
暂存区(stage area, 又称为索引区index),是git中一个很是重要的概念。是咱们把修改提交版本库前的一个过渡阶段。查看GIT自带帮助手册的时候,一般以index来表示暂存区。在工做目录下有一个.git的目录,里面有个index文件,存储着关于暂存区的内容。git add命令将工做区内容添加到暂存区。post
本地仓库(local repository), 版本控制系统的仓库,存在于本地。当执行git commit命令后,会将暂存区内容提交到仓库之中。在工做区下面有.git的目录,这个目录下的内容不属于工做区,里面即是仓库的数据信息,暂存区相关内容也在其中。这里也可使用merge或rebase将远程仓库副本合并到本地仓库。图中的只有merge,注意这里也可使用rebase。fetch
远程版本库(remote repository), 与本地仓库概念基本一致,不一样之处在于一个存在远程,可用于远程协做,一个倒是存在于本地。经过push/pull可实现本地与远程的交互;spa
远程仓库副本, 本地的一个分支,能够理解为存在于本地的远程仓库缓存。如需更新,可经过git fetch/pull命令获取远程仓库内容。版本控制
1、本地各区域之间的操做指针
1-1 工做区与本地缓存区code
一、撤销对工做区的修改 (即在文件已经修改、但还没有add以前撤销对文件的修改):git checkout
使用方法:
git checkout 文件名
撤销对工做区修改;这个命令是以最新的存储时间节点(add和commit)为参照,覆盖工做区对应文件file;这个命令改变的是工做区
二、将本地距离上次commit以后的修改从工做区添加到缓存区 : git add
使用方法:
git add 文件名 : 添加单个文件 git add . : 将修改操做的文件和未跟踪新添加的文件添加到git系统的暂存区,注意不包括删除 git add -u :将已跟踪文件中的修改和删除的文件添加到暂存区,不包括新增长的文件,注意这些被删除的文件被加入到暂存区再被提交并推送到服务器的版本库以后这个文件就会从git系统中消失了。 git add -A: 表示将全部的已跟踪的文件的修改与删除和新增的未跟踪的文件都添加到暂存区。
三、撤销向缓存区的add : git reset
使用方法:
git reset HEAD 文件名 : 清空add命令向暂存区提交的关于file文件的修改;这个命令将修改从新放回到工做区,仅改变暂存区,并不改变工做区,这意味着在无任何其余操做的状况下,工做区中的实际文件同该命令运行以前无任何变化 git reset HEAD : 若是后面什么都不跟的话 就是上一次add 里面的所有撤销了
2-1 本地缓存区与本地仓库
一、将本地缓存区中的修改提交到本地仓库 : git commit
使用方法:
git commit -m "提交说明" : 将add到缓存区的所有修改提交到本次仓库
注意:
使用 git log 命令能够查看所有commit历史信息。
commit命令会记录一条log,生成当前分支上的一个log节点(即一个版本),commit的一个个版本造成分支的生命线。
2、本地各版本之间的操做
2-1 版本向后推动
git add git commit -m "info"
2-2 版本回退 : git reset
修改头指针指向以前的版本,目标版本以后的版本都再也不存储。
使用方法:
git log : 查找要回退到的目标版本号 git reset --hard 目标版本号 : 回退到目标版本
适用场景: 若是想恢复到以前某个提交的版本,且那个版本以后提交的版本咱们都不要了,就能够用这种方法。
注意: 此时若是git push 到远程会报错,由于当前本地版本比远程版本要低,使用git push -f 能够强制推上去(固然前提得远程容许推,公司的代码库通常会有限制)
2-3 撤销提交 : git revert
撤销某次提交,和reset不一样的是以前commit的历史都还保存在版本库中。
好比,咱们commit了三个版本(版本1、版本2、 版本三),忽然发现版本二不行(如:有bug),想要撤销版本二的提交,但又不想撤销版本三的提交,就能够用 git revert 命令来逆向操做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。
使用方法:
git log 查看要反作的目标版本号 git revert -n 目标版本号 撤销目标版本号所作的修改 git commit -m "message" commit这次反作操做
适用场景: 若是咱们想撤销以前的某一版本,可是又想保留该目标版本后面的版本,记录下这整个版本变更流程,就能够用这种方法。
3、本地各分支之间的操做
3-1 默认master分支
一个分支就是一条时间线,默认有一条时间线master,其中有个指针master,这个master指针是指向提交的,每次提交,master指针都会向后移一位,这样不断去提交,master分支就会愈来愈长。还有个HEAD指针,这个指针指向当前所在分支的的指针。
3-2 分支建立
若建立新分支,如dev分支,git会新建一个dev指针,与master指针功能同样。先是指向和master一样的位置,当checkout切换到dev分支时候,HEAD指针就指向了dev指针了,当在dev分支下提交,dev指针向后移动。
使用方法:
git branch branch_name : 基于当前commit建立一个新的分支 git branch : 查看所有分支
3-3 分支切换
即移动head指针,指向目标分支指针:git checkout branch_a。注意只有分支干净的时候才能提交,要是分支干净共有两种方法,要么把修改commit提交,要么把修改暂存
使用方法:
commit方法:
git add . git commit -m "message" git checkout branch_b
或,stash暂存
git add . git stash git checkout branch_b 在branch_b作完操做又想回到branch_a的时候 git checkout branch_a git stash pop
git stash 具体使用见后
注意: 在切换分支以前必定要commit 或 stash 当前分支上的修改,不然在当前分支上作的操做会直接带到目标分支,当在目标分支上执行commit操做的时候这些修改就被提交到目标分支,容易形成代码混乱。
git commit会把修改提交,体如今分支的时间线上。若是还不想提交(过多没有阶段性成果的提交会使得分支时间线不清晰) git stash是把修改暂存,不会体如今时间线上,从新回到分支后,pop以前暂存的内容,能够继续修改
git stash使用
git stash : 将未提交的修改保存至堆栈中 git stash save "stash message info" : 为这次stash添加说明信息,便于之后查看 git stash list : 查看stash栈中的内容 git stash pop : 将stash中的内容弹出,并应用到当前分支对应的工做目录上,该命令将堆栈中最近保存的内容删除(出栈操做) git stash apply stash名称 : 将指定id的内容应用到当前分支的工做目录,内容不会删除,能够在多个分支上重复进行操做 git stash drop stash名称 :从堆栈中移除某个指定的stash git stash clear : 清除堆栈中的全部 内容 git stash show : 查看堆栈中最新保存的stash和当前目录的差别。 git stash branch : 从最新的stash建立分支。 应用场景:当储藏了部分工做,暂时不去理会,继续在当前分支进行开发,后续想将stash中的内容恢复到当前工做目录时,若是是针对同一个文件的修改(即使不是同行数据),那么可能会发生冲突,恢复失败,这里经过建立新的分支来解决。能够用于解决stash中的内容和当前目录的内容发生冲突的情景。
3-4 合并分支
分支合并,操做很简单,若将dev分支内容合到master上,就是将master的指针指向dev指针指向的位置便可。
- git merge --no-ff branch_name 将branch_name分支合并到当前分支。
git merge:默认状况下,Git执行"快进式合并"(fast-farward merge),会直接将Master分支指向Develop分支。 使用--no-ff参数后,会执行正常合并,在Master分支上生成一个新节点。为了保证版本演进的清晰,建议采用这种方法。
- git rebase
解决冲突
删除分支
删除分支就是将指向分支的指针(如dev)删除掉
使用方法:
git checkout branch_a 切换到其余分支 git branch -d branch_b 删除分支
4、本地与远程之间的操做
4-1 向远端
- git push 将本地仓库推送到远端仓库
git add git commit git pull 解决冲突 git push
4-2 向本地
git fetch : 使用远程仓库中的内容更新远程仓库副本。此时并未合并到本地仓库,即本地仓库的代码没有被修改,知识拉取了远程commit数据。 git merge : 实现远程仓库与本地仓库的合并 git pull :下拉远程分支并与本地分支合并(使用远程仓库的内容更新远程仓库副本以及本地仓库)。根据配置的不一样,至关于git fetch + git merge 或 git fetch + git rebase。 git clone : 本地没有 repository 时,将远程 repository 整个下载过来。