这个命令用于将远程代码仓库克隆到本地,这是对任何项目进行开发前的第一步。
比如你本地本来并没有某个项目的代码仓库,此时随便找一个文件目录并进入cmd命令窗口,执行命令git clone [remote address],[remote address]就是对应的远程代码仓库地址,克隆完成之后,你便可以看到新建了一个目录,进入该目录,会看到.git,所有包含.git的目录其实就是你本地的关于该项目的一个git代码仓库。比如:
这个git_test目录就是jerry本地关于git_test这个项目的代码仓库,在该目录下进入cmd命令窗口可以执行各种git命令。这里简单演示下分支相关的命令:
执行下git branch:
可以看到所有本地分支,其中master是你当前所在分支。
执行下git branch -a:
可以看到所有分支,包括本地分支以及远程分支。
如果想切换到demo分支,执行git checkout demo即可。
如果demo分支还没有,想要从origin/demo分支切出来demo分支,执行git checkout -b origin/demo demo。
克隆之后,会默认把远程仓库命名为“origin”,同时你的本地仓库里面的分支会跟踪远程同名分支:
这样的分支以及分支直接的跟踪关系可以通过git的配置文件查看到,进入.git目录,查看config文件,记录了当前仓库的详细配置:
其中[core]记录的是仓库配置;[remote “origin”]就是说我们目前只有一个远程仓库,给这个远程仓库命名为“origin”;[branch “master”]跟踪了远程仓库origin里面的master分支,[branch “demo”]跟踪了远程仓库origin里面的demo分支。
经过上面的git clone之后,其实是把此刻最新的远程代码仓库给克隆到本地了。但如果项目团队中另一名成员提交了新的代码到远程仓库,比如这样:
那么此时你(jerry)本地的代码仓库如何获取到远程仓库中新的内容呢?这就要用到git pull操作了。
完整的git pull命令是这样子的:git pull <远程主机名> <远程分支名>:<本地分支名>。比如: git pull origin master:master。
那如果我就简单执行了git pull,没写这么长会发生什么呢?那么会把当前所在分支所跟踪的远程分支上新的提交,拉到当前分支上。
如果jerry当前在master分支上,那么简单的执行git pull 即相当于 git pull origin master:master。如果当前不在master分支上,那么就只能老老实实执行git pull origin master:master了。
git pull命令执行之后,就会变成下面这样:
其实上图展现得并不完全准备,实际上本地还有origin/*这样的分支,我们在下面学习git fetch命令的时候,会看到。
都说git pull = git fetch + git merge,实际上到底是如何发生的呢?下面用图说话,我们来一起看一看。
Git pull操作实际上分为两步,第一步执行了git fetch,将远程仓库里面的分支上的所有新的提交拉下来到对应的本地origin/*分支上:
第二步将对应的本地origin/*分支上的提交merge到本地分支上。比如如果我执行的是git pull origin master:master,那么只会将origin/master分支merge到master分支上,而不会将origin/demo分支merge到demo分支上:
当然了,你也可以只执行git fetch命令,执行之后只会将所有远程仓库中的所有分支上的新提交拉取到你本地所有的对应的origin/*分支上,但master、demo这样的本地分支不会有任何变化。
Git merge可以发生在任何两个分支之间,一般操作方式为: git merge demo,那么会将demo分支merge到当前所在分支上:
图例中从C2开始,从master分支切出去了一个新的分支:demo分支,demo分支上有一些提交,与此同时,master分支上也有一些提交。如果当前所处分支为master,执行git merge demo,那么会生成一个merge提交:C7。Demo分支上的所有提交也会被放到master分支上,最终master分支长这样:
可以看到所有提交是按照提交时间顺序排列的,不管是master上后来的提交,还是demo分支上的提交,都是按照提交时间排列在了分支链上。
在git中,可以分为三种区域,分别是工作目录、暂存区、git仓库。其中工作目录中放的就是实际的文件,暂存区放的索引,git仓库里面放的是目录树(可以理解为分支链)。
执行git add命令,会把指定的工作目录中经过增删改的文件放入暂存区(其实就是会被暂存区的索引引用到)。
可以执行git add [file1] [file2]...将多个有变动的文件放入暂存区,也可以执行git add . 将当前目录及其子目录下的所有有变动的文件放入暂存区。
执行git commit命令,会将暂存区的所有文件进行一次提交,提交之后会进入本地git仓库,形成当前分支链上的一个点(如上图所示)。
可以执行git commit -m “my first commit”来提交并写上提交说明,标记本次提交修改了些什么东西。
那如何将本地git仓库中新增的提交推送到远程仓库对应的分支上呢?这就要用到git push命令了。
完整的git push命令是:git push <远程主机名> <本地分支名>:<远程分支名>。比如:git push origin master:master,就是将本地的master分支上的新提交推送到远程仓库的master分支上。
如果只是简单的写了git push,那么会将当前分支上的新提交推送到其跟踪的远程仓库的分支上。
一般在git push之前,需要先执行git pull,以保证你本地仓库拉取到远程仓库最新的内容。如果git push之前没有先执行git pull,那么在你git push的时候,就是下面这个样子的:
此时git push操作要么就是直接push失败,提示你:你本地分支落后于远程分支;即使能成功,也会在远程仓库分支上新增一个不必要的merge提交。而且如果遇到代码冲突的情况,push是肯定会失败的,你需要先把远程仓库的提交pull下来,本地解决冲突之后,再进行push:
好了,这就是今天的分享,以后我会不定期地继续更新,还是以这种图文的形式,我相信图解是最好的理解方式,我坚持以最简单、实用、易懂的方式把复杂的东西讲出来,希望可以帮助更多学习git的人少走弯路。