git 学习(3) ----- 代码共享和多人协作
当我们开发项目的时候,项目会越来越大,就有可能需要其它同事进行参与,甚至进行开源,这时就需要找一个地方把代码存放起来,好供其它人下载并开发。这个地方,最好放到服务器上,因为只要能上网,就可以获取到, 现在有好多的服务器可以供我们使用,比如github. 没有使用过github,也没有关系,它是一个存放代码的网站,要使用它就要先进行注册。
1, 首先要到GitHub 官网注册一个帐号,非常简单,填写用户名,邮箱,密码即可。注册完成后,登录,就可以看到如下的界面。
2,注册完成后,就可以使用github了。我们要把源代码放到上面,就要在网站上找一个地方,对于github来说,它就是创建一个仓库。点击上图中的加号按钮,再点击 new Repository, 就可以看到创建仓库的页面。
3, 在 Repository name输入 项目名称,如git-learning. 在Description 中输入项目描述,如 为了学习git 而创建的项目。点击最下面的 create repository 绿色按钮,项目创建成功。
4, 创建成功后,就可以在这个仓库中存放代码了。但是我们怎么才能把代码存放到这个仓库中呢?比如我们要把在上面两个章节创建的math 项目放到这个仓库中 ,要怎么处理? 首先要将本地math仓库和这个远程仓库git-learing 进行连接, 使用git remote add 远程仓库的名称 远程仓库的地址,remote 就是远程的意思,名称就是给它起个命字,以后好使用,一般都会命名为origin. 地址是什么呢?就是上图中 的 https://github.com/samling1989/githublearning.git, 这就是远程仓库的地址。在math 项目中右键选中git bash, 调出git 命令窗口。
这时再调用git remote 命令,就会出现远程仓库的名称,配置成功了。
还可以加上参数 -v, 是--verbose 缩写,详细的意思, 它会列出远程仓库的地址。
5, 本地仓库和远程仓库建立连接,就可以上传代码了,使用的命令是git push, 将本地的代码推送到远程仓库, 基本的命令是git push 远程仓库名 <本地分支名>:<远程分支名>
本地仓库是在master分支上,我们也想在远程仓库上建立master, 两个分支一一对应,使用比较方便。
上传成功了,刷新一下github, 可以看到上传的代码了. 其实,如果本地仓库分支名和远程仓库的分支名相同的话,远程仓库的分支名可以省略,git push origin master 也可以实现相同的功能, 这时github 会自己创建同名的分支。
当创建github仓库的时候,它提示我们最好创建一个README.md文件,LICENCE, 和.gitignore 文件,这也是一个完整的github项目所必须的。现在本地创建README.MD和.gitignore 文件,LICENCE 以后再说。README.md是一个markdown文件,对于整个项目的说明。.gitignore 文件则是git 提交可以忽略的文件,比如node_modules 文件。
然后,git add . 和git commit 添加到本地仓库,然后调用git status,
可以发现,Your branch is ahead of 'origin/master' by 1 commit.(use "git push" to publish your local commits), 本地仓库比远程仓库提前一个版本,要用git push
也上传成功了。这时你会发现,上传一次就要输入远程仓库名和分支名,有点麻烦,可不可以简单点,输入git push. 现在试一下,
git 要求建立 upstream branch, 它也提供了相应的命令,直接输入这个命令执行就可以了, 最终结果就是建立了当前分支与远程分支追踪关系, 这时再调用git push, 就没有问题。
6, 现在代码共享了,也就意味着可以进行多人开发了。首先其它人要从github上复制一份代码到他自己的电脑上。使用的命令是git clone. git clone 命令接受两个参数, 一个是source, 我们clone的代码仓库的地址(github仓库地址), 一个是要clone 到的项目目录,git clone source destination_dir, 当然最后一个参数可以省略,如果省略,git 会自动创建一个目录,目录名称就是source 的目录(项目)名称。找一个放项目的地方,然后打开git bash 命令窗口,执行git clone 命令,
当前文件夹多了一个文件夹,another-git-learing, 克隆项目成功了。这里要注意的是,当我们进行clone的时候,我们只会把远程仓库中的当前分支拷贝到本地了,git branch, 它只显示一个分支,即使远程仓库有很多分支,这时要使用 git branch --all,显示该项目所有的分支,但是前面加上remote/origin, 表示远程分支。我们也可以使用 git checkout 远程分支下面的分支名,它就是可以在本地创建一个相同的分支。git checkout -b another_fix_branch remotes/origin/another_fix_branch
当然你也可以clone 一个分支,git clone -b 远程仓库的地址 分支名。 执行完git clone 以后,你会发现,可以使用git push 提交代码,不用配置remote, 其实git clone 命令已经给你做了。git clone 是一系列命令的集合。 当执行git clone 时, 首先,它创建了一个新的工作目录,就是一个文件夹,名字默认是服务器上的仓库名称。然后把这个目录初始化为git 仓库。添加一个远程分支 origin, 最后,把所有的内容复制到本地文件夹中, 本地分支和远程仓库直接建立连接,我们可以push。在克隆完某个项目后,至少可以看到一个名为 origin 的远程库,Git 默认使用这个名字来标识你所克隆的原始仓库。
7, 多人合作冲突解决
当进行多人合作的时候,难免会产生冲突,因为大家都在一个仓库上工作。当别人提交了代码,而你又没有更新代码时,就会无法提交代码。我们直接在github上创建一个license, 模拟一下,他人提交代码。
找到这个create new file 点击, 进入到如下页面
输入license, 右侧有 一个choose a license template, 点击,进入了协议选择页面,左侧选择MIT, 然后右侧有一个review and submit 绿色按钮,点击,然后跳回到了上图,
在最下面有一个 commt a new line, 选择create a new file for master 单选按钮,然后点击最下面的绿色按钮,ok, 创建成功,我们的项目中多了一个license.
这时在git-learning 文件中,git bash 命令中输入git push,
拒绝提交代码,因为远程仓库的的代码,我们本地仓库没有。当我们使用git push 提交代码时,git 首先要检查本地仓库分支和要推送到的远程仓库的分支的版本,如果两个版本不同步或不一致,它就会报错,禁止提交,通常是本地仓库的版本小于远程仓库的版本。这时就要从远程仓库拉取代码,来保持同步。使用git pull 命令。git pull的完整命令是
git pull 远程仓库名 远程分支:本地分支
其实 一般,本地分支和远程分支同名,可能直接省略本地分支,git pull origin master, 由于git push的时候,分支建立了追踪关系, 直接使用git pull 也可以
我们本地多了license 文件,这时再git push 就没有问题了。
还有一种冲突,拉取代码冲突。其他人更改了代码上传了,而我们没有及时更新,也改了代码,而这两份更改都是改的同一个文件的同一个地方。我们还是在github上修改文件,模拟其它人的提交,如更改main.js 加一个console.log 语句。然后我们在本地的main.js 也增加一个console.log语句, 然后提交到本地仓库,这时执行git pull, 发现冲突了。
其实在这种情况下,不适合用git pull, 要用git pull的分解命令,git fetch 和git merge. git pull 是两个命令git fetch 和 git merge 的集合.
首先,git fetch 从远端仓库拉取代码,放到本地代码库中。这时我们可以用git log --decorator --oneline 或 gitk,可以看到 它有origin/master origin/HEAD 表示从远端仓库拉取代码成功。
把远端的代码拉取到本地以后,可以进行对比,远端代码和本地代码进行对比,还是git diff 命令,不过参数,本地分支 远端分支 git diff master origin/master
可以看到两个分支在main.js 中的不同, 为以后的分支合并打下基础。
再执行git merge 操作,git merge origin/master: 合并远程分支到本地分支。它的参数是远程分支名, 可以看到如下结果。
把冲突解决一下,然后git add 和git commit 提交到本地仓库,最后git push 推送到远端仓库。
8, 当真正代码开发的时候,其它人向你的仓库的提交代码的时候,肯定是要授权的, 要不然,他提交的时候,就会报错。像同事之间的开发项目,授权的方式,可以是添加协作者。 在github网站,进入我们的项目
点击第二行最右侧的Settings, 页面左侧有一个options面板,
第一个就是collaborator(合作者),点击,要求输入密码,输入密码后,看到如下页面
我们可以红色方框内的输入框中输入合作者的用户名,然后点击右侧的 add collaborator 按钮,添加成功之后,合作者就和我们创作者拥有的同样的权限。
9, 删除项目
我们这个项目,只是演示用的,没有什么大太的作用,学习完成后,可能就想把它删除掉了。还是点击上面说的settings.面板最下方有一个Danger Zone 区域,Delete this repository 按钮(如下图)
点击可以看到一个弹窗,询问你是不是确定要删除? 在弹窗的输入框中输入你的项目名 这时它下面的按钮,就会变红色,表示可以单击进行删除了,单击进行删除。输入的内容一定要和你的项目名称一致,否则删除按钮是禁用状态,无法删除项目。