- Workspace:工作区
- Index / Stage:暂存区
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
最常用的几个命令的区别
git fetch/git pull/git rebase/git merge
1.git fetch && git pull
- git fetch:将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
- git pull:是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。
git fetch origin master:tmp //从远程仓库master分支获取最新,在本地建立tmp分支
2.git merge和git rebase区别
假设你在master的C2提交上创建了分支experiment,并完成开发,而此时master有了新的提交C4。怎么将experiment合并到master?
git merge的情况下
它会把两个分支最新的快照(C3 和 C4)以及二者最新的共同祖先(C2)进行三方合并,合并的结果是产生一个新的提交对象(C5)。
git rebase的情况下
在experiment分支下,执行
$ git rebase master
回到两个分支最近的共同祖先,根据当前分支(也就是要进行变基的分支 experiment)后续的历次提交对象(这里只有一个 C3),生成一系列更改,然后以基底分支(也就是主干分支 master)最后一个提交对象(C4)为新的出发点,逐个应用之前的更改,最后会生成一个新的合并提交对象(C3’),从而改写 experiment 的提交历史,使它成为 master 分支的直接下游。
然后再到master分支下执行merge操作,这将会是一次快进合并。
虽然merge 和 rebase 整合得到的结果没有任何区别,但变基能产生一个更为整洁的提交历史。如果视察一个变基过的分支的历史记录,看起来会更清楚:仿佛所有修改都是在一根线上先后进行的,尽管实际上它们原本是同时并行发生的。
1 . 储藏(Stashing)
现在需要切换分支,但还不想提交正在进行中的工作;那么可以储藏这些变更。为了往堆栈推送一个新的储藏:
$ git stash
现在工作目录下就干净了,可以切换到其他分支
查看当前的储藏
$ git stash list
stash@{0}: WIP on fixbug: 29b039d i am fixbugtest
stash@{1}: WIP on fixbugtest: 29b039d i am fixbugtest
stash@{2}: WIP on fixbug: 29b039d i am fixbugtest
可以看到,在所有分支上执行的git stash,都存储在这里了,如果在多个分支上都执行了git stash,那应用时就需要注意了。
应用储藏
git stash apply ,应用后(应用刚刚实施的储藏,即stash@{0}),stash的记录仍然在
git stash pop,应用后,最新stash记录弹出
$ git stash apply
如果想要应用更早的储藏,可以指定stash
$ git stash apply stash@{2}
丢掉储藏</