【版本管理系统Git】

注:此文参考
【廖雪峰的官方网站】https://www.liaoxuefeng.com/wiki/896043488029600
【菜鸟教程】https://www.runoob.com/git/git-tutorial.html
【Git官网】https://git-scm.com/docs

小知识

Git是目前世界上最先进的分布式版本控制系统(没有之一)。
Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!

什么是集中式什么是分布式?

集中式:
版本库是集中存放在中央服务器的,而干活的时候,先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器,集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。

分布式:
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

安装Git

下载地址:https://git-scm.com/download/win

使用Windows的童鞋要特别注意:
千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。建议你下载Notepad++代替记事本,不但功能强大,而且免费!记得把Notepad++的默认编码设置为UTF-8 without BOM即可:

【配置Git】

  • 安装完成后打开Git / GitBash 输入
  • git config --global user.name " 你的用户名 "
  • git config --global user.email “你的邮箱地址”

【创建版本库build repository】

  • mkdir learngit------------创建一个空目录
  • cd learngit------------进入这个目录下
  • cd …-------------返回上级目录
  • pwd------------显示当前目录
  • git init------------把这个目录变成仓库,如果成功目录下生成.git文件夹
  • 如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。

【提交文件到仓库】

  • git add 文件名加后缀------------把存在的文件添加到仓库,从工作区到暂存区
  • git commit -m “本次提交的说明”------------把文件提交到仓库,从暂存区插入到分支,-m后面输入的是本次提交的说明。
  • git status------------查看工作区状态
  • git diff------------查看修改difference

【版本之间切换】

  • git log------------查看历史记录
  • git log --pretty=oneline------------查看历史记录在一行显示
  • git reset --hard head^ ------------回到上一个版本
  • git reset --hard head^^ ------------回到上上一个版本
  • git reset --hard head~100------------回到上100个版本
  • git reset --hard commitID------------回到指定版本
  • git reflog ------------获得历史版本号

【工作区、暂存区、和分支结构】

工作区暂存区和分支

【为什么Git更优秀:因为Git跟踪并管理的是修改,而非文件】

  • git checkout – 文件名加后缀 ---------------撤销修改,在没有add到暂存区之前,其实是将版本库中版本替换工作区中的版本
  • git reset head 文件名加后缀 ---------------把暂存区的文件退回到工作区
  • git rm 文件名加后缀---------------从版本库中删除文件
  • rm 文件名加后缀---------------从工作区删除文件

远程仓库

由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:

【1.设置ssh】

  • ssh -keygen -t rsa -C “你自己的邮箱地址”
  • 一路回车保持默认设置
  • 最后在用户主目录下生成了.ssh 文件夹,有id_rsa和id_rsa.pub这两个文件。
  • 这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人

【2.登陆GitHub】

  • 登陆GitHub,打开“Account settings”,“SSH Keys”页面;
  • 点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:

现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。

  • 首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库:
    在这里插入图片描述
  • 在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
  • 目前,在GitHub上的这个learngit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。现在,我们根据GitHub的提示,在本地的learngit仓库下运行命令:git remote add origin git@github.com:用户名/learngit.git
  • git push -u origin master下一步,就可以把本地库的所有内容推送到远程库上:
    由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
  • 从现在起,只要本地作了提交,就可以通过命令: git push origin master
    把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!

从远程库克隆

分支管理

  • git checkout -b dev---------------创建一个名为dev分支并切换过去,相当于下面两条命令
  • git branch dev
  • git checkout dev
  • git branch---------------查看分支
  • git merge dev---------------合并dev到当前分支
  • git branch -d dev---------------删除dev分支

【解决冲突】

  • git checkout -b featurel---------------创建并切换到featurel分支
  • 在featurel分支上修改文件
  • git add readme.txt---------------把文件从工作区提交到暂存区
  • git checkout master---------------切换到master分支
  • 在master分支上修改文件
  • git add readme.txt---------------把文件从工作区提交到暂存区

【现在分支上各有新的提交】
 **【现在分支上各有新的提交】**

  • git merge featurel---------------合并分支, 这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,这时候就要手动删除文件中的内容了
  • git log --graph --pretty=oneline --abbrev-commit ---------------用带参数的git log也可以看到分支的合并情况
  • git branch -d featurel ---------------删除featurel分支
    【分支管理策略】
  • git checkout -b dev---------------创建并切换到dev分支
  • 修改文件
  • git add readme.txt---------------将修改提交到暂存区
  • git commit -m “add merge”---------------提交一个新的commit
  • git checkout master---------------切换到master分支
  • git merge --no -ff -m “merge with --no-ff” dev---------------禁用fast forward模式合并dev分支这样会保留分支合并信息因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去
  • git log --graph --pretty=oneline --abbrev-commit---------------格式化查看分支历史,而fast forward 看不出来曾经做过合并

【BUG分支】

每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除

  • git stash---------------把当前工作现场“储藏”起来,等以后恢复现场后继续工作
  • git checkout master---------------切换到master分支
  • git checkout -b issue-101 ---------------创建并切换到issue-101分支
  • 修改文件
  • git add readme.txt---------------添加到暂存区
  • git commit -m “fixed bug 101”---------------提交到分支
  • git checkout master---------------切换master 分支
  • git merge --no-ff -m “merge bug fix 101” issue-101---------------合并issue-101分支
  • git checkout dev---------------切换到原来的分支继续干活
  • git stash list ---------------查看储藏区列表
  • git stash apply---------------恢复储藏区到工作区
  • git stash drop---------------删除储藏区
  • git stash pop---------------恢复并删除储藏区

【vi 编辑器】

  • cd …--------------- cd 与 … 之间有一空格(这里是两个点)
  • cd git--------------- 进入 git 目录
  • pwd--------------- 显示当前路径
  • touch+文件名.后缀--------------- 直接新建一个文件
  • vi+文件名.后缀--------------- 新建一个文件并进入编辑状态(如果文件已存在,则直接进入编辑状态)
  • :i--------------- 命令模式下,我们可以直接按:+ i ,此时就会切换到编辑模式(这里有冒号)
  • esc---------------在编辑模式下,按 esc 就可以切换到命令模式
  • :q---------------退出编辑,如果文本内容被修改过,则会报错
  • :q!---------------强制退出编辑,如果文本内容被修改过,会丢弃此次的修改
  • :x ---------------退出编辑并保存

vi其实是linux的一个文本编辑器,所以 vi+文件名 后,其实是进入vi程序了。vi有两种模式,编辑模式和命令模式

【多人协作】

  • git remote ---------------查看远程库信息
  • git remote -v ---------------查看远程库更详细信息(显示抓取和推送的地址,没有推送权限则看不到推送地址)
  • git push origin master ---------------推送master分支到远程库
  • git checkout -b dev origin/dev ---------------从远程库抓取dev分支到本地,并且切换过去
  • git push origin dev ---------------推送dev分支到远程库
  • git pull---------------如果推送失败先从远程抓取分支
  • git branch --set-upstream branch-name origin/branch-name---------------如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建
  • 如果合并有冲突,则解决冲突,并在本地提交
  • git rebase---------------操作可以把本地未push的分叉提交历史整理成直线;rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

master分支是主分支,因此要时刻与远程同步; dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

【标签管理】

  • git tag v1.0---------------创建v1.0标签
  • git tag ---------------查看所有标签
  • git log --pretty=oneline --abbrev-commit ---------------格式化查看所有commit
  • git tag v1.1 5958fe0---------------给指定commit 打上标签
  • git show v1.0---------------展示标签信息
  • git tag -a v0.1 -m “version 0.1 released” 1094adb---------------创建带有说明的标签,用-a指定标签名,-m指定说明文字
  • git tag -d v0.1---------------删除标签
  • git push origin v1.0---------------把指定标签推送到远程库
  • git push origin --tags---------------把所有标签推送到远程库
  • git push origin :refs/tags/v1.0---------------把远程库中的指定标签删除
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值