Git是目前最受欢迎的版本控制工具(Version Control Tools)之一
前提条件:已安装git和gitblit,详情步骤见官网
在gitblit上创建好项目库
创建好会有readme文件和.gitignore文件。我的gitblit版本仓库是在服务器上。
创建好后分配权限给用户
使用用户zys登录
得到地址 ssh://zys@192.168.128.55:29418/kt.git
拉取项目
进入项目目录,右键git bash here 设置 git config --global user.name "zys"
git config --global user.email "***@qq.com"
查看是否存在.ssh文件
cd ~/.ssh
如果不存在需要重新创建 mkdir ~/.ssh
生成SSH key: ssh-keygen -t rsa -C "***@qq.com"
进入c:/Users/xxxx/.ssh目录下,将生成的id_rsa.pub内容拷贝到gitblit中
然后就是拉取项目了
git init #将此目录初始化为可以使用git命令操作的目录
git clone ssh://zys@192.168.128.55:29418/kt.git #将其拉取到项目目录
此时查看项目目录
上传项目整体到gitblit
gitblit类似github,是一个放置项目源代码的仓库
我们只需要将项目源码拷贝到上一步所在项目目录
git add . #添加项目目录的所有文件
git commit -m "上传项目kt" #准备上传并注释
git push -f origin master #push到远程仓库中,此时远程仓库内容发生变化
注意:如果我们开发的版本不是最新版本,push会失败,因此只有一条master线的开发,需要再push之前pull最新的版本,再加以更改才能push成功,但这样只适合小项目的开发。
多人协同开发
创建好项目雏形,分配好任务后,我们需要为甲乙丙三个开发人员设置branch
git branch test1 #创建分支test1,创建分支前需要在master下commit,不然会报错
git branch test2
git branch test3
git branch #查看已有分支
git checkout test1 #切换到分支test1
在分支test1目录做的修改也需要commit和push,但不会直接更改远程仓库内容
在觉得开发人员代码无问题后,可以切换到master
git checkout master
git merge test1
git merge test2
git merge test3 #分别合并甲乙丙所做的开发
git命令列表
常见问题
1.在添加ssh-key后,需要连接到远程仓库,不然会报错:
git remote add ssh://zys@192.168.128.55:29418/~zys/test.git(远程仓库地址)
2.Git拉取远程分支
- 在Git Bash中输入git init进行初始化
- 与远程代码仓库建立连接:git remote add origin 代码仓库地址
- 将远程分支拉到本地:git fetch origin dev (dev即分支名)
- 创建本地分支:git checkout -b LocalDev origin/dev (LocalDev为本地分支名,dev为远程分支名)
- 与远程分支合并:git merge origin/dev
- 查看日志:git log --oneline --all --graph
3.为什么说git是分布式管理的?
- 去中心化:Git是没有中心服务器的,每个人机器上都是一个完整的库,我们平时开发代码时的中央服务器其实和我们自己机器上的库内容是完全一样的
- 本地提交:断网提交,小步提交,本地库,本地回滚
- 分支策略:分支策略从技术上来讲是将版本节点化了,即最终的版本状态是树状的。从结果上来讲既是弱化了分支,也是强化了分支。弱化的是分支的概念,强化的是分支的功能。
4.版本回退
git reset --hard Head,Head表示当前版本,Head^表示上一个版本,Head^^表示上上个版本,Head~100表示前100个版本,git reset --hard sha256直接回退到sha256对应的版本号。回退后依然可以前进回来。
5.工作区和暂存区
- 如果工作区中不小心改了错误的文件还没有add到暂存区,可以使用
git checkout -- filename来撤销修改。如果已经add到暂存区,可以使用git reset --hard Head撤销修改。如果不小心commit,还可以版本回退git reset --hard Head;如果不小心push到远程了,等着挨批评吧! - 如果在工作区中不小心rm(删除)了某个文件,而版本库中有,可以利用
git checkout -- somefile从版本库中恢复。分支合并的时候也用到git checkout .等来恢复文件和版本库保持一致。 - 如果想删除版本库中的文件,用
git rm somefile
6.分支管理
git merge融合分支git checkout xxx切换到xxx分支- 合并分支时的解决冲突:要么手动修改,要么保持和本地一致或者
git add,git commit,要么和版本库一致git checkout .
- 简单看一下
git merge的几种用法- fast-forward:Git 合并两个分支时,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,叫做“快进”(fast-forward)不过这种情况如果删除分支,则会丢失merge分支信息。
- squash:把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用–squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的合并。
- --no-ff:关闭fast-forward模式,在提交的时候,会创建一个merge的commit信息,然后合并的和master分支,merge的不同行为,向后看,其实最终都会将代码合并到master分支,而区别仅仅只是分支上的简洁清晰的问题,然后,向前看,也就是我们使用reset 的时候,就会发现,不同的行为就带来了不同的影响
一般推荐使用git merge --no-ff -m "...." dev,-m用来描述commit信息。