git教程:
一、git的简介:
-git是分布式版本控制系统由Linus为Linux用C语言写的。
-什么是集中式版本控制系统:
版本库是集中存放在中央服务器,干活的时候用自己的电脑,
所以要先从中央服务器取得最新的版本,然后开始干活,干完活后在将自己的活推送到服务器。
缺点:必须联网。
-什么是分布式版本控制系统:有一台充当中央服务器的电脑,但是这台电脑不仅仅用来方便交换大家的修改,
没有他大家一样干活,只是交换修改不方便。
优点:不必联网,
强大的分支管理
二、Git的安装
-在Windows上使用Git直接从官网上下载,然后按默认安装完成就行,安装成功后在菜单找到Git-Git Bash,弹出类似命令窗口的东西说明安装成功。
安装成功后:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
三、创建版本库
一、git的简介:
-git是分布式版本控制系统由Linus为Linux用C语言写的。
-什么是集中式版本控制系统:
版本库是集中存放在中央服务器,干活的时候用自己的电脑,
所以要先从中央服务器取得最新的版本,然后开始干活,干完活后在将自己的活推送到服务器。
缺点:必须联网。
-什么是分布式版本控制系统:有一台充当中央服务器的电脑,但是这台电脑不仅仅用来方便交换大家的修改,
没有他大家一样干活,只是交换修改不方便。
优点:不必联网,
强大的分支管理
二、Git的安装
-在Windows上使用Git直接从官网上下载,然后按默认安装完成就行,安装成功后在菜单找到Git-Git Bash,弹出类似命令窗口的东西说明安装成功。
安装成功后:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
三、创建版本库
1、什么是版本库?版本库就是仓库英文repository相当于目录,目录里面的文件都可以被Git管理,
每个文件删除,修改,Git都可以追踪,以便任何时候都可以追踪历史,或者在将来某个时刻可以被还原。
每个文件删除,修改,Git都可以追踪,以便任何时候都可以追踪历史,或者在将来某个时刻可以被还原。
2、开始创建,版本提交:
-建一个空的文件夹
-在文件夹中创建一个文件
-在git bash命令中,在该目录下使用命令 git init进行初始化,此时文件夹下会出现一个.git文件夹,如果看不见,请选择显示隐藏文件夹。
-在使用git add file 命令,将文件加入管理仓里。命令,将文件加入管理仓里。
-使用命令 git commit -m "wrote a readme file "
git commit命令后面-m输入本次提交的说明,可以输入任何信息。
-建一个空的文件夹
-在文件夹中创建一个文件
-在git bash命令中,在该目录下使用命令 git init进行初始化,此时文件夹下会出现一个.git文件夹,如果看不见,请选择显示隐藏文件夹。
-在使用git add file 命令,将文件加入管理仓里。命令,将文件加入管理仓里。
-使用命令 git commit -m "wrote a readme file "
git commit命令后面-m输入本次提交的说明,可以输入任何信息。
-为什么需要add,commit两步:因为commit可以一次提交多个文件,所以可以多次add文件
-git status命令:让我们时刻掌握着仓库当前的状态。
-git diff+文件:显示具体更改的内容。
-查看更改情况后再将文件提交到仓库git add
3、版本回退:
-git log 查看日志 最近三次的更改情况
-git reset --hard HEAD^回退到上个版本号
HEAD当前版本 HEAD^上个版本 HEAD^^上上个版本,HEAD~100回退到100个版本。
-当回退到上个版本了,再想回来就必须找到commit id。Git提供了一个命令git reflog来记录每一次的命令。
git reset --hard commit_id
4、工作区和暂存区
-git status命令:让我们时刻掌握着仓库当前的状态。
-git diff+文件:显示具体更改的内容。
-查看更改情况后再将文件提交到仓库git add
3、版本回退:
-git log 查看日志 最近三次的更改情况
-git reset --hard HEAD^回退到上个版本号
HEAD当前版本 HEAD^上个版本 HEAD^^上上个版本,HEAD~100回退到100个版本。
-当回退到上个版本了,再想回来就必须找到commit id。Git提供了一个命令git reflog来记录每一次的命令。
git reset --hard commit_id
4、工作区和暂存区
- Git和其他版本控制系统SVN等的不同之处就是暂存区。
-工作区就是文件夹
-工作区里面有个隐藏的.git目录,这个不算工作区,而是Git的版本库。
Git的版本库有很多东西,其中最重要的就是stage(或index)的暂存区,Git为我们自动创建了第一个分支master,以及master的指针HEAD
-第一步git add 文件名 把文件往Git版本库中添加进去,实际上就是把文件修改添加到暂存区。
第二部git commit提交更改,实际上就是把暂存区的内容提交到当前分支。
5、撤销修改:
-当改乱了工作区某个文件的内容,想直接丢掉工作区的修改时,用git checkout --file
-当你不但改乱了工作区某个文件的内容,还添加到 了暂存区时,想丢弃修改,分两步
第一步:git reset HEAD<file>然后回到场景1按照场景一操作。
-工作区就是文件夹
-工作区里面有个隐藏的.git目录,这个不算工作区,而是Git的版本库。
Git的版本库有很多东西,其中最重要的就是stage(或index)的暂存区,Git为我们自动创建了第一个分支master,以及master的指针HEAD
-第一步git add 文件名 把文件往Git版本库中添加进去,实际上就是把文件修改添加到暂存区。
第二部git commit提交更改,实际上就是把暂存区的内容提交到当前分支。
5、撤销修改:
-当改乱了工作区某个文件的内容,想直接丢掉工作区的修改时,用git checkout --file
-当你不但改乱了工作区某个文件的内容,还添加到 了暂存区时,想丢弃修改,分两步
第一步:git reset HEAD<file>然后回到场景1按照场景一操作。
6、删除文件:
- rm text.txt
-当git知道删除了文件,工作区和版本库就 不一致了,git status命令就会告诉那些文件被删除了。
-此时有两种做法:-1、确定在版本库中删除该文件,用命令git rm test.txt删掉然后commit.
--2、删除了版本库里面还有,可以轻松的将文件恢复到最新版本。git checkout --test.txt.
-git checkout 其实是笨笨酷里面的版本替代工作区的版本,无论是修改还是删除,都可以一键还原。
四、远程仓库
1-、git是分布式版本仓库控制系统,同一个git仓库可以分布到不同的机器上。
-最早,只有一台机器有一个原始版本库,此后的机器可以克隆这个原始的版本库,而且每台机器的版本仓库其实都是一样的。
2-、搭建远程仓:
-GitHub是一一个提供git仓库托管的网站。
本地仓库和GitHub仓库之间的传输是通过ssh加密的,所以需要设置:
-第一步:创建ssh key,在主目录下查看是否有.ssh,如果有查看是否有id_rsa和id_rsa.pub文件,如果有直接跳过该步。
如果没有,打开shell(Windows下打开git bash)创建ssh key。
-$ssh-keygen -t rsa -C"your email@example"
-在.ssh目录下面找到.id_rsa和id_rsa.pub这就是ssh key的两个秘钥,id_rsa是私钥,id_rsa.pub是公钥。
-第二步:登录GitHub,在account setting,ssh key页面进行设置。
点击Add ssh key填上任意title,在key文本框里面粘贴id_rsa.pub点击add ssh就已经添加key。
为什么需要ssh?因为GitHub需要识别出推送的是你提交的,而不是别人冒充的,而git支持ssh协议,所以GitHub知道你的公钥就可以确定只有你才能推送。
GitHub允许添加多个key。
五、添加远程仓:
1-、现在已经在本地创建了一个git仓库后,又想在GitHub上创建一个git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库就既可以作为备份,又可以让别人通过该仓来协助。
-、登录github后create a new repository,在repository name中填入仓库名字learngit,其他保持默认,就成功创建了一个git仓库。
2、目前在github上的learngit还是空的,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后把本地仓库的内容推送到github仓库。
3、在本地仓运行命令:
- $git remote add origin git@github.com:yourusername/learngit.git
-此时本地仓与远程仓关联。
-将本地仓的内容推送到远程仓:
$git push -u origin master
由于第一次推送,远程仓中没有东西,加上参数-ugit不但会把本地仓的master分支推送到远程新的master分支,还会把本地的master分支和远程的master关联起来。
在以后的推送或者拉去中就可以简化命令。
$git push origin master
六、从远程仓克隆:
1-、先创建远程库,然后从远程库中克隆。
-create a new repository
-repository name:gitskill
-选择initialize this repository with a README,这样github为我们创建一个README.md文件。
2-、 远程库已经准备好了,下一步就是克隆:
-、$git clone git@github.com:yourusername/gitskill.git
七、分支管理:
1-、当你创建了一个分支,别人看不见,还继续在原来的分支上正常工作,而你在自己分分支上干活,想提交就提交,知道开发完毕,再一次性的合并到原来的分支上。
2、创建与合并分支:
-创建分支,实际就是创建一个指针,head指向master,创建新指针后,如果合并则master会与新指针合并,回退就是删除指针。
-创建dev分支,然后切换dev分支:
-$git checkout -b dev
-git checkout命令加上参数-b表示创建并切换,相当于:
-$git branch dev
-$git checkout dev
-然后用git branch命令查看当前分支
-$git branch:会列出所有分支,当前分支会标*
-然后就可以在dev分支上正常提交。
-切回master分支
$git checkout master
现在再查看,刚才添加的内容不见了,因为刚才提交的是在dev分支上,现在在master分支上。
-现在把dev分支的工作成果合并到master分支上
$git merge dev
合并后就可以将dev分支删除了。
$git branch -d dev
3-、总结:
-查看分支:git branch
-创建分支:git branch <name>
-切换分支:git checkout<name>
-穿件切换分支:git checkout -b <name>
-合并某个分支到当前分支:git merge <name>
-删除分支:git branch -d<name>
八、解决冲突:
1-、创建新分支
-$git checkout -b feature1
-修改readme.txt文件
-在feature1分支上提交
-$git add readme.txt
-$git commit -m "and simple"
-切换到master分支上:
$git checkout master
git会自动提示我们当前master分支比远程的master分支要超前1个提交
在master分支上把readm.txt文件最后一行改为&simple
-提交:$git add readme.txt
$git commit -m "&simple"
-现在master和feature1各自分别有了新的提交。
-在这种情况下,git无法执行快速合并,只能试图把自己修改的合并起来,但是这种合并可能会有冲突。
-当查看readme.txt文件时会标出分支不同的内容分。
-我们修改为文件如下:
Creating a new branch is quick and simole.
-用带参数的git log看分支合并的情况:
$git log --graph --pretty=online --abbrev-commit
-最后删除feature1分支
$git branch -b feature1
2、总结:
-先创建分支,修改文件,在分支上提交。
-切换到master,修改文件,在分支上提交。
-合并,出现错误。
-查看文件,看两个分支的不同手动修改文件
-提交,删除创建新分支。
-完成。
九、分支策略:
1、通常合并时,如果可能,git会用Fast forward模式,但是这种模式下,删除分支,会丢掉分支信息。
如果禁用Fast forward模式,git就会在merge时生成一个新的commit,这样,从分支既可以看出分支信息。
2、创建新分支:
-$git checkout -b dev
-修改文件,并提交新的commit
-切回master:
$git checkout master
-合并分支:
$git merge --no-ff -m "merge with no-ff"dev
本次要创建一个新的commit所以带-m
-然后用git log --graph --pretty=oneline --obbrve-commit
查看。
3、在实际开发中应按照几个基本原则进行分支管理。
-master非常稳定,也就是仅用来新版本发布,平时不能在上面干活。
-平时都在分支上干活,分支是不稳定的。到某个时候,再把分支合并到master上。每个人都在分支上干活,是不是的合并到分支上就可以了。
九、bug分支
1-、软件开发中遇到需要修复的bug时,需要将当前的分支进行工作现场存储。
-$git stash。
等以后恢复现场后继续工作。
-git status查看工作区
-git stash list 查看存储的工作现场
-1、git stash apply恢复,但是stash内容并没有删除,还需要
git stash drop进行删除
- 2、git stash pop 恢复并删除。
十、feature分支
1-、在开发的过程中,新功能不断的添加进来,为了不让一些实验性的代码把主分支搞乱,每次添加新功能的时候,最好新建一个feature分支。在上面开发,完成后,合并最后删除该feature分支。
-创建新分支:
$git checkout -b feature2
-添加新功能:
git add vulcan.py
-切回dev,准备合并
git checkout dev
-feature分支和bug分支类似,合并然后删除
-此时需要删除分支,但是删除不了必须d大写D
$git branch -D feature2
十一、多人协作
1-、-查看远程库信息,使用git remote -v
-本地新建的分支如果不推送到远程,其他人是不可见的。
-从本地推送分支,使用git push orgin branch-name如果推送失败,先用git pull抓取远程的新提交。
-在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name
-建立本地分支和远程分支的关联,使用git checkout --set-upstream branch-name orgine/branch-name.
-从远程抓取分支,当本地链接与远程链接不一致的时候会报错,此时根据提示设置链接,再使用git pull 如果有冲突,要先处理冲突。
十二、Rebase
git rebase将分叉变成一条直线。
十三、标签:
1、git tag <tagname> 用于新建一个标签,默认为HEAD,也可以指定一个commit id
2、gti tag -a<tagname>-m"..."可以指定标签信息
3、git tag可以查看所有标签。
3、删除标签git tag -d v0.1
4、创建的标签都只存在本地,不会自动推送到远程,所以打错的标签可以在本地安全的删除。
如果要推送某个标签到远程,使用命令:
git push origin<tagname>
或者一次性推送全部尚未推送到远程的本地标签
git push origin --tags
5、如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除
git tag -d v0.9
然后再删除远程,删除命令也是push
git push origin :refs/tags/v0.9
-create a new repository
-repository name:gitskill
-选择initialize this repository with a README,这样github为我们创建一个README.md文件。
2-、 远程库已经准备好了,下一步就是克隆:
-、$git clone git@github.com:yourusername/gitskill.git
七、分支管理:
1-、当你创建了一个分支,别人看不见,还继续在原来的分支上正常工作,而你在自己分分支上干活,想提交就提交,知道开发完毕,再一次性的合并到原来的分支上。
2、创建与合并分支:
-创建分支,实际就是创建一个指针,head指向master,创建新指针后,如果合并则master会与新指针合并,回退就是删除指针。
-创建dev分支,然后切换dev分支:
-$git checkout -b dev
-git checkout命令加上参数-b表示创建并切换,相当于:
-$git branch dev
-$git checkout dev
-然后用git branch命令查看当前分支
-$git branch:会列出所有分支,当前分支会标*
-然后就可以在dev分支上正常提交。
-切回master分支
$git checkout master
现在再查看,刚才添加的内容不见了,因为刚才提交的是在dev分支上,现在在master分支上。
-现在把dev分支的工作成果合并到master分支上
$git merge dev
合并后就可以将dev分支删除了。
$git branch -d dev
3-、总结:
-查看分支:git branch
-创建分支:git branch <name>
-切换分支:git checkout<name>
-穿件切换分支:git checkout -b <name>
-合并某个分支到当前分支:git merge <name>
-删除分支:git branch -d<name>
八、解决冲突:
1-、创建新分支
-$git checkout -b feature1
-修改readme.txt文件
-在feature1分支上提交
-$git add readme.txt
-$git commit -m "and simple"
-切换到master分支上:
$git checkout master
git会自动提示我们当前master分支比远程的master分支要超前1个提交
在master分支上把readm.txt文件最后一行改为&simple
-提交:$git add readme.txt
$git commit -m "&simple"
-现在master和feature1各自分别有了新的提交。
-在这种情况下,git无法执行快速合并,只能试图把自己修改的合并起来,但是这种合并可能会有冲突。
-当查看readme.txt文件时会标出分支不同的内容分。
-我们修改为文件如下:
Creating a new branch is quick and simole.
-用带参数的git log看分支合并的情况:
$git log --graph --pretty=online --abbrev-commit
-最后删除feature1分支
$git branch -b feature1
2、总结:
-先创建分支,修改文件,在分支上提交。
-切换到master,修改文件,在分支上提交。
-合并,出现错误。
-查看文件,看两个分支的不同手动修改文件
-提交,删除创建新分支。
-完成。
九、分支策略:
1、通常合并时,如果可能,git会用Fast forward模式,但是这种模式下,删除分支,会丢掉分支信息。
如果禁用Fast forward模式,git就会在merge时生成一个新的commit,这样,从分支既可以看出分支信息。
2、创建新分支:
-$git checkout -b dev
-修改文件,并提交新的commit
-切回master:
$git checkout master
-合并分支:
$git merge --no-ff -m "merge with no-ff"dev
本次要创建一个新的commit所以带-m
-然后用git log --graph --pretty=oneline --obbrve-commit
查看。
3、在实际开发中应按照几个基本原则进行分支管理。
-master非常稳定,也就是仅用来新版本发布,平时不能在上面干活。
-平时都在分支上干活,分支是不稳定的。到某个时候,再把分支合并到master上。每个人都在分支上干活,是不是的合并到分支上就可以了。
九、bug分支
1-、软件开发中遇到需要修复的bug时,需要将当前的分支进行工作现场存储。
-$git stash。
等以后恢复现场后继续工作。
-git status查看工作区
-git stash list 查看存储的工作现场
-1、git stash apply恢复,但是stash内容并没有删除,还需要
git stash drop进行删除
- 2、git stash pop 恢复并删除。
十、feature分支
1-、在开发的过程中,新功能不断的添加进来,为了不让一些实验性的代码把主分支搞乱,每次添加新功能的时候,最好新建一个feature分支。在上面开发,完成后,合并最后删除该feature分支。
-创建新分支:
$git checkout -b feature2
-添加新功能:
git add vulcan.py
-切回dev,准备合并
git checkout dev
-feature分支和bug分支类似,合并然后删除
-此时需要删除分支,但是删除不了必须d大写D
$git branch -D feature2
十一、多人协作
1-、-查看远程库信息,使用git remote -v
-本地新建的分支如果不推送到远程,其他人是不可见的。
-从本地推送分支,使用git push orgin branch-name如果推送失败,先用git pull抓取远程的新提交。
-在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name
-建立本地分支和远程分支的关联,使用git checkout --set-upstream branch-name orgine/branch-name.
-从远程抓取分支,当本地链接与远程链接不一致的时候会报错,此时根据提示设置链接,再使用git pull 如果有冲突,要先处理冲突。
十二、Rebase
git rebase将分叉变成一条直线。
十三、标签:
1、git tag <tagname> 用于新建一个标签,默认为HEAD,也可以指定一个commit id
2、gti tag -a<tagname>-m"..."可以指定标签信息
3、git tag可以查看所有标签。
3、删除标签git tag -d v0.1
4、创建的标签都只存在本地,不会自动推送到远程,所以打错的标签可以在本地安全的删除。
如果要推送某个标签到远程,使用命令:
git push origin<tagname>
或者一次性推送全部尚未推送到远程的本地标签
git push origin --tags
5、如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除
git tag -d v0.9
然后再删除远程,删除命令也是push
git push origin :refs/tags/v0.9