-
四个区域:工作区-->暂存区-->本地仓库-->远程仓库
-
文件状态:
git库所在的文件夹中的文件大致有4种状态
1、Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
2、Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
3、Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改
4、Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified。
新建文件--->Untracked
使用add命令将新建的文件加入到暂存区--->Staged
使用commit命令将暂存区的文件提交到本地仓库--->Unmodified
如果对Unmodified状态的文件进行修改---> modified
如果对Unmodified状态的文件进行remove操作--->Untracked
- git init;
安装完git以后初始化一下,创建仓库;初始化在另一篇里面有
- git status;
查看当前仓库信息,被修改的文件显示红色;
- git add;
把文件加入暂存区;如果想把当前目录中所有文件都加入暂存区,使用"git add.",会把文件从红色变成绿色;
- git commmit -m <message>;
提交暂存区的文件,-m是指加上后面的描述<message>,比如git commmit -m "first commit";
- git log;
commmit以后可以查看提交日志
- git reset;
把绿色文件变回红色,可以在commit之前使用,相当于git add的反向操作。
- git reset <commitID>;
git reset <commitID> --hard 不保存所有变更(所有文件都会回退到commitID对应的那个状态)
git reset <commitID> --soft 保留变更并且变更内容处于staged
git reset <commitID> --mixed 保留变更并且变更内容处于modified(如果git reset <commitID>不带参数,默认是mixed)
如果想要回退到某一次的commit,可以通过git log找到提交日志,找到那次的commitID,然后操作:
再次使用git log发现第六次提交记录消失了:
- git reflog;
查看所有操作记录。比如我们刚才回退到第五次提交,然后log里第六次的就没了。我们又想回到第六次的,可以reflog查看操作记录,然后再回到第六次的。(不过如果是想回到最新的版本,直接git pull就行了)
- git checkout -b <name> <template>;
创建新的分支;name--新分支名字;template--以哪个分支或commit为模板,如果不填则以当前分支为模板,模板意思就是新分支把当前分支的commit记录复制一遍。
如果template不是本地而是远程仓库需要加个origin:git checkout -b <name> origin <template>
- git checkout <branchName>;
切换分支,比如git checkout master;
- git branch;
查看所有分支,只能展示本地的分支,如果我们通过git fetch拉取了远程仓库的新分支,这个命令其实是看不到拉取的新分支,不过我们可以切换过去;
- git merge <branchName>;
合并分支,也就是把branchName分支和我们当前的分支(一般是master)合并,比如我们合并了一个a分支和一个b分支,合并a的时候只新增了文件1.java,合并b分支时b也写了1.java。这时候需要手动解决冲突,然后add、commit;
- git fetch:
拉取远程仓库分支到本地仓库。可以用git checkout <branchName>切换拉取到的新分支。
git fetch是将远程主机的最新内容拉到本地仓库,用户在检查了以后决定是否合并到工作本机分支中(想合并的话checkout新分支即可)。
而git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。
- git rebase:
变基,一般是根据一个分支来改变我们这个分支。
比如我们有个master分支,然后checkout了一个feature分支以后,master、feature都commit了一些操作:
这时如果我们想要合并master、feature的提交,使用rebase的话就会从共同祖先(B这个commit)开始,把当前分支(feature)做的commit复制一份插入master分支,然后删除原来的提交C和D(他们的提交内容一样,但commit id不同。feature自然最后也是指向D’)
git checkout feature
git rebase master
//这两条命令等价于直接git rebase master feature
上面的例子可抽象为如下实际工作场景:
- 张三从B拉了代码进行开发,目前提交了两次,开发到D了;
- 李四也从B拉出来开发了并且开发完毕,他提交到了M,然后合到主干上了。
- 此时张三想拉下最新代码,于是他在feature分支上执行了git rebase master,即把master分支给rebase过来,由于李四更早开发完并合了主干,如此就相当于张三是基于李四的最新提交M进行的开发了。