经济在不断发展,社会在不断进步,以往的互联网在现在看来都可以称为传统互联网了,因为技术不断的在突破和革新。
本文主要介绍一下版本管理工具,我猜测很多人还是用SVN、CVS或者Resion,但是,今天我想告诉大家,那些都已经过时了,大家有兴趣的可以学学新一代版本管理工具GitHub.
GitHub是分布式管理工具,相比较SVN更具优势,GitHub使用前需要在官网先注册账号,注册完以后,可以把自己的项目上传上去,然后无论走到哪里都可以进行开发,并且提交,提交的时候,GitHub跟SVN有所不同,GitHub可以先在本地提交,最后推到资源库,SVN只有提交操作(直接提交到服务器),下面介绍基本入门。
1.注册账号
注册地址:https://github.com
2.创建资源库
注册完账号后,直接点击新建即可,我觉得新建资源库不用我来详细介绍,随便看看应该就会了。
3.克隆刚刚创建的资源库。
创建的资源库就是我们要开发的项目,为了方便开发,我们需要克隆到本地,SVN的术语叫checkout.
首先打开本地的工作空间 cd e:/workspace
使用Git命令:
git clone https://github.com/JackySoft/MyTest.git
也可以克隆ssh协议的文件,比如:
git clone ssh://git@10.137.20.113:2222/root/test.git
大家在使用git命令之前,需要先安装Git Bash
下载地址:https://git-scm.com/download/或者https://git-for-windows.github.io/
大家可能有点不知道Git Bash是干什么的,它主要是Git版本管理的命令行,就好比SVN也有专门的命令行软件,只不过大家习惯用SVN客户端来操作更简单。GitHub也有图形工具,SourceTree,但是,好像大多人更喜欢用命令行,可能觉得比较高深或者牛叉吧。我当然两个都用,我觉得主要还是为了提高开发效率。
克隆完项目以后,项目就已经保存到我们刚刚的工作空间里面去了,然后就可以在这个项目的基础上进行编程了。
4.新建文件,添加到索引库
在该项目基础上新建一个文件比如:a.txt后
需要添加到索引库,命令如下:
git add a.txt等同于svn add a.txt
5.提交代码到本地仓库
git commit -m "test github"
注意,此处提交只是将本地的修改提交到本地的仓库,GitHub上的项目并不会改变,这一点和SVN有很大的不同,这就是分布式开发。
6.推送到远程仓库
git push
输入完此命令后,命令行会提示让你输入账号和密码,输入完即可推送。
7.刷新GitHub官网看看项目是否有变化,此时应该已经同步完成。
有冲突后,如果确定不要远程的代码可使用force,这个命令要慎用
git push --force origin
会用本地的代码覆盖远程仓库的代码
我相信刚开始学GitHub的时候有一些晕,我刚开始的时候也是非常晕,里面的概念浑然不懂,看了很多文档,并亲自测试,才明白,于是,我觉得需要记录下来,给那些曾经像我一样的小白学习一下,减轻一些负担。
另外给大家提供一些Git的学习站点:
http://www.bootcss.com/p/git-guide/
另外,还有一种情况需要跟大家介绍:
本地已开发的项目,想要上传到GitHub上面去,第一种方式,可以直接打开GitHub官网,将自己的项目拖拽上去。
第二种方式:
cd e:workspaceTest
进入到项目根目录下面后,通过git init 初始化一个本地仓库
git add -A 可将本地所有文件提交到暂存区
git commit -m "demo" -a 可将所有暂存区的文件提交到本地仓库。
git remote add origin https://github.com/JackySoft/MyTest.git 将本地仓库的项目推送到远程仓库中。
git push origin master 将本地origin主机master分支代码推送到远程master分支上,默认是master分支。
git push orgin master:data 将本地origin主机master分支代码推送到远程data分支上,通过冒号来区分分支
如果远程仓库已经存在一些文件了,此时 推送会报冲突,需要先将远程仓库拉取到本地,再进行推送。
git pull origin master ,将远程master分支拉取到本地
相关命令统计:
创建类命令
git brach branchName 创建名为branchName的branch
git checkout branchName 切换到branchName的branch
git checkout -b 创建并切换,也就是上面两个命令的合并
git brach branchName ef71 从commit ef71创建名为branchName的branch
显示信息类命令
git ls-files -u 显示冲突的文件,-s是显示标记为冲突已解决的文件
git diff 对比工作区和stage文件的差异
git diff --cached 对比stage和branch之间的差异
git branch 列出当前repository下的所有branch
git branch --a 列出local 和remote下的所有branch
git ls-files --stage 检查保存在stage的文件
git log 显示到HEAD所指向的commit为止的所有commit记录 。使用reset HEAD~n 命令使HEAD指针向前移动,会导致HEAD之后的commit记录不会被显示。
git log -g则会查询reflog去查看最近做了哪些动作,这样可以配合git branch 恢复之前因为移动HEAD指针所丢弃的commit对象。如果reflog丢失则可以通过git fsck --full来查看没被引用的commit对象。
git log -p -2 对比最新两次的commit对象
log -1 HEAD
git log --pretty=oneline
git log --stat 1a410e 查看sha1为1a410e的commit对象的记录
git blame -L 12,22 sth.cs 如果你发现自己代码中 的一个方法存在缺陷,你可以用git blame来标注文件,查看那个方法的每一行分别是由谁 在哪一天修改的。下面这个例子使用了-L选项来限制输出范围在第12至22行
撤销类命令
如果是单个文件
1.use "git reset HEAD <file>..." to unstage
如果已经用add 命令把文件加入stage了,就先需要从stage中撤销
然后再从工作区撤销
2.use "git checkout -- <file>..." to discard changes in working directory
git checkout a.txt 撤销a.txt的变动(工作区上的文件)
如果是多个文件
git chenkout .
如果已经commit 了,则需要
git commit --amend 来修改,这个只能修改最近上一次的,也就是用一个新的提交来覆盖上一次的提交。因此如果push以后再做这个动作就会有危险
$ git reset --hard HEAD 放弃工作区和index的改动,HEAD指针仍然指向当前的commit.(参照第一幅图)
这条命令同时还可以用来撤销还没commit的merge,其实原理就是放弃index和工作区的改动,因为没commit的改动只存在于index和工作区中。
$ git reset --hard HEAD^ 用来撤销已经commit的内容(等价于 git reset --hard HEAD~1) 。原理就是放弃工作区和index的改动,同时HEAD指针指向前一个commit对象。
git revert 也是撤销命令,区别在于reset是指向原地或者向前移动指针,git revert是创建一个commit来覆盖当前的commit,指针向后移动
提交类命令
git add 跟踪新文件或者已有文件的改动,或者用来解决冲突
git commit 把文件从stage提交到branch
git commit -a 把修改的文件先提交到stage,然后再从stash提交到branch
删除类命令
git rm --cached readme.txt 只从stage中删除,保留物理文件
git rm readme.txt 不但从stage中删除,同时删除物理文件
git mv a.txt b.txt 把a.txt改名为b.txt
Merge类命令
在冲突状态下,需要解决冲突的文件会从index打回到工作区。
1.用工具或者手工解决冲突
2.git add 命令来表明冲突已经解决。
3.再次commit 已解决冲突的文件。
$ git reset --hard ORIG_HEAD 用来撤销已经commit 的merge.
$ git reset --hard HEAD 用来撤销还没commit 的merge,其实原理就是放弃index和工作区的改动。
git reset --merge ORIG_HEAD,注意其中的--hard 换成了 --merge,这样就可以避免在回滚时清除working tree。
git其他命令
创建新分支并命名,此处我们创建名为 new_stuff 的分支
git branch newBranch
切换新分支
git checkout newBranch
添加所改动的文件以便提交
git add .
提交改动
git commit -m "create a branch"
回到master分支
git checkout master
合并到主分支
git merge newBranch
1) 远程仓库相关命令
检出仓库:$ git clone git://github.com/jquery/jquery.git
查看远程仓库:$ git remote -v
添加远程仓库:$ git remote add [name] [url]
删除远程仓库:$ git remote rm [name]
修改远程仓库:$ git remote set-url --push[name][newUrl]
拉取远程仓库:$ git pull [remoteName] [localBranchName]
推送远程仓库:$ git push [remoteName] [localBranchName]
2)分支(branch)操作相关命令
查看本地分支:$ git branch
查看远程分支:$ git branch -r
创建本地分支:$ git branch [name] ----注意新分支创建后不会自动切换为当前分支
切换分支:$ git checkout [name]
创建新分支并立即切换到新分支:$ git checkout -b [name]
删除分支:$ git branch -d [name] ---- -d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项
合并分支:$ git merge [name] ----将名称为[name]的分支与当前分支合并
创建远程分支(本地分支push到远程):$ git push origin [name]
删除远程分支:$ git push origin :heads/[name]
我从master分支创建了一个issue5560分支,做了一些修改后,使用git push origin master提交,但是显示的结果却是'Everything up-to-date',发生问题的原因是git push origin master 在没有track远程分支的本地分支中默认提交的master分支,因为master分支默认指向了origin master 分支,这里要使用git push origin issue5560:master 就可以把issue5560推送到远程的master分支了。
如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,那么可以这么做。
$ git push origin test:master // 提交本地test分支作为远程的master分支 //好像只写这一句,远程的github就会自动创建一个test分支
$ git push origin test:test // 提交本地test分支作为远程的test分支
如果想删除远程的分支呢?类似于上面,如果:左边的分支为空,那么将删除:右边的远程的分支。
$ git push origin :test // 刚提交到远程的test将被删除,但是本地还会保存的,不用担心
3)版本(tag)操作相关命令
查看版本:$ git tag
创建版本:$ git tag [name]
删除版本:$ git tag -d [name]
查看远程版本:$ git tag -r
创建远程版本(本地版本push到远程):$ git push origin [name]
删除远程版本:$ git push origin :refs/tags/[name]