GIT:
1,保存数据,文件
2,记录历史版本和版本间差异。甚至包括回退到指定版本。
3,团队协作
发展历史:
cvs:始祖,集中式
svn:集大成者,集中式
git:geek主流,分布式
github:geek社区,托管网站
集中式:需要中心服务器,需要联网
分布式:可以不联网,本地完成。效率高。
一,第一次使用git从已有项目下载
1,首先保证自己有权限下载代码,没有的话找管理员给配置权限
2,cd到你想要存放工程的位置
3,git clone 项目地址,然后输入用户名和密码,等待下载完成。
二,git上传代码
1, cd到指定工程目录
2, git branch -a 查看所有分支
3, git checkout dev 选择分支
可使用git status 查看修改的文件
以及git diff查看修改的代码
对于不需要改动的文件,可使用checkout +文件路径 即可还原至修改之前
4, git pull,正常情况下,commit之前都是要pull下来
5, 若有新增文件,git add 文件路径 或者 git add ./
6, git commit 文件目录 -m "这里是注释"
git commit ./ -m "注释" commit所有修改过的文件
git commit -am "注释" 这个是commit所有修改过的文件(这一条尚未核实)
7, git push origin HEAD:dev 这个是push到指定分支
也可直接使用git push,前提是远程工程分支名跟本地分支名是一样的。
可通过git log 和git show查看push后的结果以及明细
三,.git文件夹
git跟svn最大的区别就是:
svn所有的分布式迭代版本都在svn服务器上,本地只有一份工程。所以,svn只需要commit就把文件同步到远程服务器了。
git在本地也有版本迭代记录的功能,就在.git文件夹里记录着。所以,git的commit只是本地git记录版本迭代,push就是把本地工程和版本的迭代文件一起同步到远程git服务器。
从这层意义上来讲,git还是牛逼很多。在保证远程有一份稳定的版本的情况下,本地随意迭代。
四,master和branch
一般很多企业的开发会有一个master版本和一个dev版本。
dev:开发者开发的版本
master:产品准备上线的版本
正常流程是这样的:
1,dev开发好了,目测没有问题
2,git commit ,[git rebase],git push
3,再切换到master git checkout master
4,然后把dev版本合并到master git merge dev
5,然后也可以push到远程(注意,这里就不需要commit了,因为从dev合并过来的版本把.git的版本迭代记录也合并过来了)
这里从master打包出产品给测试人员测试,测试不通过的话再回到第1步。测试通过了,就发给市场工作人员上线到正式环境。
6,回到dev git checkout dev (这是个好习惯)
主要到上面的git rebase了没,很多开发工程师很注意细节的,为了确保每次只提交完后,本地的和远程的是一模一样的,而且据说可以保证分支不乱。
git rebase时很容易遇到需要先git stash,因为你有其他地方也修改了,但是这次你并不需要提交。那么可以git stash,就是还原那个文件。
那么,提交代码后,你又要刚才那个改过的文件,怎么办?这个时候可以参加下面git stash的使用。
在master和dev之间的合并,开发,很容易出现一种情况:
你切换到了master后,忘记了切回dev,然后一不小心就在master上面开发了。直到push完了,再git checkout的时候才发现原来是在master上面开发的。
别紧张,这个时候你把master当作dev,把dev当作master就好了。也就是说你把master合并到dev就可以了。(正常是不建议这么做的,因为master是很重要的)
冲突解决:
一,push的时候提示要pull
问题:push的时候提示要pull
原因:远程已经有其他人提交过修改,但是你push之前忘记了pull
方案:
1,先pull下来
2,然后git status查看其他人是否跟自己修改了同一个文件。
若不是,则可以直接push上去
若是,你们修改到同一个文件,那么使用git differ查看是否有冲突。 此时简单的可以自己合并修改成自己想要的样子。重要的改动的话需要找到另外一个开发者共同讨论一起合并。最后,再commit 然后push上去。
常用功能:
一、回到过去版本:
1,cd到工程目录下, git log 可以看到所有历史版本(可以获取到历史版本id)
好像是q可以回到shell编辑
2,git reset --hard 历史版本id
二、回到过去某个版本后,如果再回到未来?
1,git reflog
2,从上往下找到第一个pull:Fast-forward,复制前面的代码
3,git reset --hard 代码
这里有个地方我没有讲清楚,上面是回到未来最后一个版本。那么想要指定某个版本,虽然没有讲到,但是到了那个时候了,相信读者会知道怎么玩的。
三、还原本地修改
方法1:git checkout 文件名 :这可以还原单个文件,通过git status可以查看修改过的所有文件
方法2:git reset -hard :这是还原全部修改过的文件
四、暂存本地修改,pull最新代码
这也是很常用的一个功能:当你本地有修改并没有全部完全,临时需要pull下来别人的代码,但是你又不能提交自己未完成的代码。这个时候就需要暂存、再pull、再恢复、再解决冲突
1,git stash
2,git pull
3,git stash pop stash@{0}
4,若有冲突,则须先解决冲突
其中Updated upstream 和=====之间的内容就是pull下来的内容,====和stashed changes之间的内容就是本地修改的内容。碰到这种情况,git也不知道哪行内容是需要的,所以要自行确定需要的内容。
分支开发之分支合并
来源:http://www.imooc.com/video/4586/0
分支开发之合并到master
来源:http://www.imooc.com/video/4587
多人开发的经验:
1,多用客户端和工具,少用命令行。这是别人说的,我不表态哦。我是觉得命令行很装逼的,用客户端的话效率会高很多。
2,每次提交前,diff自己的代码,以免提交错误的代码
3,下班回家前,整理好自己的工作区
4,并行的项目,使用分支开发
5,遇到冲突时,搞明白冲突的原因,千万不要随意丢弃别人的代码。
6,产品发布后,记得打tag,方便将来拉分支修bug
其他:
1,stash贮藏
不太懂啊。
我这么操作过一次:工程修改后,然后stash,会还原到上次pull的工程。 再unstash,又会回来修改后的工程。
2,.gitignore git忽略
目前:可以做到对新增文件ignore,但是对于修改的文件不能做到ignore。如果把该文件copy出去,在push后,再copy回来,就是可以被ignore了。
3,githug通关攻略
据说把githug玩通关了,git使用就基本无障碍了。