Git-分布式版本控制工具

git基础命令
git init	初始化,让git管理当前文件夹
git status	检测当前文件夹中的文件状态

git add . 	管理文件夹中的所有文件
git add xxx.html	管理文件夹中的指定文件,将文件添加到暂存区
git config --global user.email "你的邮箱"	配置邮箱
git config --global user.name "你的姓名"	配置姓名
git commit -m "描述信息"	生成一个版本,将文件提交到版本库

git log	查看版本日志
git log --pretty=oneline	查看简化版的日志
当版本较多时,git log 会进入编辑模式,按q退出编辑模式
回滚
1)git reset --hard 版本号	//回滚到指定的版本

2)回滚到旧版本后再回去怎么办呢?
git reflog 	//查看版本详细变更,这里的版本号只有7位
再使用git reset --hard 7位的版本号,即可回到最开始的版本。

3)git reset --hard HEAD^	回退到上一个版本
git reset --hard HEAD~100	回退到上100个版本
分支
起到环境隔离的作用,用来解决线上bug
	//查看分支
	git branch
	
	//创建分支
	git branch 分支名	
	
	//切换到指定分支
	git checkout 分支名
    
    //创建并切换分支,相当于上面两条命令
	git checkout -b 分支名
	
	//将指定分支与master合并
	切换到master分支,再git merge 分支名
	
	//禁用Fast forward模式合并dev分支
    git merge --no-ff -m "merge with no-ff" 分支名	
    
    //删除指定分支名
	git branch -d 分支名	
	
	//分支合并可能会产生冲突,产生冲突的原因
	* master当前版本是C3,现在有两个分支,bug分支,dev分支,这两个分支都是从C3版本分出来的
	* bug分支用来解决bug,解决完毕后,与master的版本合并,产生C4版本,即master最新版本是C4
	* dev分支用来开发新功能,开发好后,产生的版本是C5,当与master合并时就会产生冲突,因为
		dev分支是在master的C3版本基础上开发的,而合并时master是C4,此时需要手动解决冲突
		只有当bug分支,dev分支修改的是同一个文件时,才会产生冲突。
远程仓库
1)在github上创建好仓库后,如果你没点击创建README.md文件,那么你本地仓库第一件事就是创建一个
	README.md文件,文件中写# 项目名,并生成一个本地版本使用下面命令推送到远程仓库。
2)本地仓库与远程仓库建立联系
	git remote add origin 远程仓库的https地址
	相当于使用origin指代远程仓库的地址
3)本地仓库推送到远程仓库
	git push -u origin master,将本地仓库的master分支推送到远程仓库的master分支
	git push -u origin dev,将本地仓库的dev分支推送到远程仓库
4)本地分支与远程分支建立联系
	4.1)远程已有remote_branch分支并且已经关联本地分支local_branch且本地已经切换到local_branch
		git push
	4.2)远程已有remote_branch分支但未关联本地分支local_branch且本地已经切换到local_branch
		git push -u origin/remote_branch
	4.3)远程没有remote_branch分支并,本地已经切换到local_branch
		git push origin local_branch:remote_branch
5)克隆远程仓库
	git clone 远程仓库的https地址
6)本地分支与远程分支保持更新,拉取远程仓库的分支,直接拉取到工作区中
   	git pull origin 分支名
	这个命令相当于两个命令:
	git fetch origin dev	表示从远程仓库拉取到本地仓库中
	git merge origin/dev	表示把版本库中的代码合并到工作区中
7)查看本地仓库关联的远程仓库
	git remote -v,如果什么都不显示,表示本地仓库没有与远程仓库建立联系,使用2)步骤,即可建立联系
变基rebase
使得git提交记录简洁
1)第一种使用场景
	使git log中的多个版本记录整合成一个记录
	git rebase -i 以往的版本号	表示使以往的版本号与最新的版本号进行合并
	git rebase -i HEAD~3		和上个命令一样,HEAD~3表示合并最近的三个版本
	注意:最好不要合并那些已经提交到远程仓库的版本号
2)第二种使用场景
	将分支的上的版本拼接到master版本上,注意和合并不一样,
	合并的步骤是切换到master,使用git merge 分支名,使得分支上的代码与master一致,
	在master上使用git log --graph可以查看明显是两条版本线,
	
	而拼接是将分支上的版本插入到master版本线上,使用git log --graph可以看到是只有一条版本线
	"拼接"的步骤是:切换到分支上,git checkout 本地分支名,再执行git rebase master,
	将master的版本与分支"拼接",最后再回到master主分支,执行git merge 本地分支名,合并分支
	简而言之,这种"拼接"的方式和合并类似,只不过在版本线上看上去不同,更加简洁了
3)第三种使用场景
	假如我在公司开发一个版本C1放在本地仓库,没有提交到远程仓库,回到家后,在家中开发版本C2,
	并提交到远程仓库,回到公司后,执行git pull origin 远程分支名,把远程仓库中的C2拉到本地中,
	其中就会产生冲突,并且这里会产生合并,导致版本线是2条合并成一条,我们可以不使用pull命令
	执行git pull --rebase origin 远程分支名,即可使得远程仓库C1版本与本地C2版本拼接,使得只有
	一条版本线。
	git pull --rebase origin 远程分支名
	该命令等于git fetch origin 远程分支名,和,git rebase origin/远程分支名
注意:如果执行git rebase命令产生冲突了,解决方法是:先手动解决冲突,并将冲突的文件添加到暂存区
	最后再执行命令git rebase --continue
协同开发
tag命令:用于给当前本地仓库的版本号打上一个标签,相当于版本号的简写,这个标签就代表这个版本的本地仓库
//给当前的本地仓库版本打上标签,标签名是v1,标签描述是"第一版"
git tag -a v1 -m "第一版"
//然后再将该带有标签的本地仓库版本推送到远程仓库中去
git push origin --tags

好像现在协作开发是,创建一个组织,组织中除了ownner,其他成员默认只有read的权限
邀请他人进组织后,再邀请该人去组织中的某一个项目,这个人只在该项目下有write的权限,
在其他项目中只有read的权限。

代码review,使用github上的pull request功能,具体步骤如下:
	代码review指的是,当程序员开发完一个功能后,需要与总分支(之前从这里分开,现在要合并回去)
	进行合并,在合并之前需要经过team leader经过检查(review)后才能review,所以我们需要在
	仓库的settings中的Branches中设置规则(rule),指定哪条分支需要进行review,这样当程序员
	开发完功能后,与总分支合并时,team leader会收到对该分支的合并请求,对程序员的代码进行检查
	判断是否同意合并分支。
给开源项目贡献代码
1)将开源项目fork到自己的github上
2)在自己的仓库中对该项目进行修改
3)给源代码的作者提交pull request申请
三个配置文件
1)项目配置文件,本地级别,是仓库中.git文件夹下的config文件,只在本项目中生效
	git config --local user.name "万一"
	git config --local user.email "wanyi@gmail.com"
2)全局配置文件,用户级别,当前用户/.gitconfig文件
	git config --global user.name "万一"
	git config --global user.email "wanyi@gmail.com"
3)系统配置文件,系统级别,最高级别,需要有root权限,/etc/.gitconfig,一般不用
	git config --system user.name "万一"
	git config --system user.email "wanyi@gmail.com"
免密登录
没有免密登录,每次push/Pull时都需要登录github账号,免密登录有三种方式:
1)url的方式
	原来的地址:https://github.com/NicknamedCoco/Git-Test.git
	免密登录的地址:https://用户名:密码@github.com/NicknamedCoco/Git-Test.git
2)SSH的方式
	2.1)在生成公钥私钥(默认放在用户名/.ssh目录下,id_rsa私钥,id_rsa.pub公钥)
		ssh-keygen -r rsa 
	2.2)拷贝公钥的内容,设置到github上
	2.3)在git本地仓库中配置ssh地址
		git remote add origin 远程仓库的ssh地址
3)git自动管理凭证
git忽略文件
在仓库中创建一个.gitignore文件,可以指定某些文件不受git的管理,也就不用把这些文件提交到远程仓库中去
*.h,表示让git不管理*.h的文件
!a.h,表示让git管理a.h文件
files/,表示不管理files/下的文件
.gitignore,表示不管理.gitignore文件
我们可以在github上搜索.gitignore,找到java类型的.gitignore文件,覆盖我们的.gitignore即可
github任务管理相关
Issues,文档以及任务管理
Wiki,项目文档