git教程

git是一个分布式版本控制系统,svn是集中式版本控制系统

git是Linux之父Linus开发出来的(喝水不忘挖井人)

GitHub的出现,让git正真大火,GitHub为很多开源项目提供git存储,GitHub是所有软件开发人员都喜欢的地方

集中式:有一个中央服务器,版本库存放在中央服务器,最蛋疼是提交的时候,需要联网,不能离线工作

分布式:一般也有中央服务器,这个服务器主要是为了方便,多人协同开发的时候,互相同步代码,但是每个人电脑都有一个版本库,这样就可以离线工作了

git的学习可以和svn对比一下,svn更简单,人性化

git是管理修改,利用多个指针(分支指针,全局HEAD指针、标签指针、远程仓库指针)来指向某一个版本,还多了一个暂存区的重要东西,学习git最关键是弄清工作区、暂存区、分支之间的关系

1.git安装

Linux:用git测试一下是否安装了,没有使用sudo apt-get install git

Windows:下载安装包安装,在开始里面找到git bash 

安装完成以后,所有的系统下都要设置自己的用户名和邮箱,这一步是必须的,--global表示该用户的所有的仓库都是一样的

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

2.创建版本库

在一个空目录下或已有目录下,使用git init创建版本库,会多出一个.git的文件,这个文件就是记录版本库的,所以不要乱改

创建一个版本库,版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

Windows下不要使用记事本编辑文件(主要因为编码前缀问题),git的管理跟踪效果和svn是一样的

3.git使用

提交一个新文件和修改一个文件的必须2个步骤

git add filename....:添加文件到暂存区,可以同时添加1个或多个文件;git add .添加当前目录下所有文件和目录到暂存区

git commit -m “log”:提交暂存区修改到分支,并写下log

本地仓库信息和状态

git status:查看工作区的文件状况(显示哪些文件没add、没commit、有修改)

git diff:查看工作区和暂存区不同(这个和实际的实验效果不一样,最好用git status)

git diff --cached:查看暂存区和分支不同

git diff HEAD:查看工作区和分支不同

git log:查看log,这个log是commit的log,加上--pretty=oneline去掉一些不必要的信息,留下关键信息(commit id +log

用q退出log显示

版本回退

Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100,commit id代表版本号

git reset --hard HEAD^:回退到上一版本

git reset --hard commit id:回退指定版本

忘记版本号了怎么办,可以用git reflog来查看git历史记录

深入理解git原理

学习了这么多的命令,想一下子记住有点难,而且还有为什么要分git add 和git commit,但是了解git原理之后就明白了

git有工作区、暂存区、分支

工作区:就是目录,可以说是git init的那个目录

暂存区:git add filename就是把工作区filename添加到暂存区

分支:git init会为创建一个master分支,并且还会有全局的HEAD指针,指向master分支的头,git commit是把暂存区修改提交到分支

git实际是管理修改,有了上面暂存区的概念就可以知道,commit只是提交已经add的文件

撤销修改

认真学习上面git的命令的人,肯定有看到一个git checkout命令,这个命令有很多应用场景,我们知道有工作区、暂存区、分支

1.有修改但是没add(撤销工作区修改):git checkout -- filename,撤销某个文件的修改,保持工作区的filename和暂存区一样

2.有修改且add但没commit(撤销暂存区修改):git reset HEAD filename,撤销暂存区修改,保持暂存区的filename和分支一样

前面的回退是针对分支的,但是已经提交到了远程服务器了,这个回退就没多大意义了

删除文件

git rm filename:删除filename,这个只是对暂存区和工作目录的修改,分支不受影响,分支要受影响,必须是commit

git rm -r dirname:删除dirname,这个只是对暂存区和工作目录的修改,分支不受影响

git rm --cache filename:删除filename,这个只是对暂存区修改

rm filename:这个是对工作区的修改,暂存区和分支不受影响,误删之后可以用 git checkout -- filename救回来

远程仓库

学习了上面这些,可以看到git和svn比较,有哪些优势,可以不要服务器、网络,直接在一台电脑上完成版本管理,但是很多时候是多人协同开发,这个时候就和svn有点像了,需要一个服务器,于是就引入了远程库的概念

git更好的远程库是GitHub,当然还有国内的码云,当然可以关联多个远程仓库

git和GitHub的传输时根据ssh加密,所以先生成key,先切换到家目录,确认一下.ssh里面有没有id_rsaid_rsa.pub这两个文件,没有的话,请用下面的命令

ssh-keygen -t rsa -C "youremail@example.com"

然后一路回车,不需要密码,想设置就不要一路回车,根据提示做

1.GitHub-->setting-->SSH-->设置好title,赋值id_rsa.pub公钥到key里面,GitHub可以有多个公钥

2.GitHub创建一个GitHub仓库(GitHub有提示:GitHub仓库可以import code也可以远程你Linux上git仓库,第3和4步可以根据GitHub提示做)

3.本地git仓库和GitHub仓库关联起来,首先切换到git init那个目录,再用git remote add origin git@github.com:KooWu/git.git

4把本地仓库的分支推送到GitHub仓库:push -u origin master

以后你可以用git push origin master:把master分支推送到远程库origin是创建的时候的默认名字

上面这些是先有本地仓库,后有远程仓库,下面将如何将已经存在的远程仓库推送到本地

git clone git@github.com:KooWu/libphenom

分支管理(新建分支、合并分支)

分支的好处:当你在做某一个重大的功能时,不可能在主分支上修改,因为你的重大功能的修改会影响到其他人的开发,这个时候在分支上开发,开发好了,再合并到主分支上去

git branch dev:创建dev分支,新分支是完全当前分支一样,分支共享工作区和暂存区

git checkout dev:切换到dev分支

git checkout -b dev:创建dev分支并切换到dev分支

git branch:查看分支,当前分支前面会标有*号

git merge dev:合并指定的dev分支到当前分支

git branch -d dev:删除指定的dev分支(这个分支已经合并过了),针对没有合并的分支把-d换成-D

当合并时,2个分支的内容不一致,合并的时候会出现冲突,这个要手动修改冲突文件,再add和commit

git log --graph:显示分支合并图

删除分支的时候,会把合并分支信息也删除,为了保留分支信息,可以在合并的时候增加合并参数

git merge --no-ff-m "merge with no-ff" dev:这样合并就会保存分支dev信息

保存现场

因为分支共享工作区和暂存区的,所以当有某个分支的改动还没完成时候,又要创建新的分支的时候,就最好把当前分支修改保存起来(git stash),这个时候工作区就是干净的了

git stash pop:恢复的同时删除stash

git stash apply:仅仅恢复

git stash drop:仅仅删除stash

多人协作

git remote -v:查看远程仓库的详细信息

git push origin master:推送指定的master分支到远程仓库

git pull:远程仓库和本地仓库比较(主要是本地仓库的origin指向版本和github仓库最新版比较,如果在github更改了,肯定会发生冲突,冲突解决办法,手动修改)

在push之前,请先pull,防止github有变更(github仓库有更新,也push不了),最好在本地解决冲突之后再push

 

标签

把一些关键的版本打上记号,方便以后查找

git tag tag_name:在最新版本打上tag_name标记

git tag tag_name commit id:在指定版本打上tag_name标记

git tag:显示所有标记

用-a指定名字,-m指定tag说明:git tag -a v1.0 -m "this is v1.0 " commit id

git show tag_name:显示某一个标签的信息

标签是和commit id关联的,所以tag会出现在说有分支,git show commit id显示某个版本的信息

git push origin <tagname>:可以推送一个本地标签

git push origin --tags:可以推送全部未推送过的本地标签

git tag -d <tagname>:可以删除一个本地标签

git push origin :refs/tags/<tagname>:可以删除一个远程标签

个性化设置

git config --global color.ui true:设置git显示颜色

有时候一些文件必须放在git目录下,但是又不想提交,因为这些文件可能是中间产物或敏感文件这些

可以在工作区创建一个.gitignore文件,把想要忽略的文件名填入,git就会忽略了,.gitignore文件要提交

配置文件学习参考这个网址就行 :https://github.com/github/gitignore

有时候想提交一些文件提交不上,有可能是.gitignore没写好,这个时候可以用一个命令检查一下

git check-ignore -v filename

有些git命令太长了,记不住怎么办,别怕,帮这些命令取个别名

git config --global alias.unstage 'reset HEAD':git unstage == git reset HEAD

也可以通过修改配置文件 .git/config(这个是全局的)达到这种效果

[alias]

unstage = reset HEAD

4.搭建git服务器

1.安装git:sudo apt-get install git

2.创建git用户,用来运行git服务:sudo adduser git

3.创建登陆证书:把登录用户的公钥(id_rsa.pub)导入到git家目录下的.ssh/authorized_keys,一行一个

4.初始化git仓库:sudo git init --bare sample.git,更改owner为git:sudo chown -R git:git sample.git

5.禁用shell登陆:改git用户后面的shell由/bin/bash为/usr/bin/git-shell

还有管理公钥工具GitOSis

git实际也支持权限管理,因为git支持钩子,可以用脚本到达这个目的,Gitolite工具

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值