Git

git

一、git介绍

Git 是一个开源的分布式版本控制软件,用以有效、高速的处理从很小到非常大的项目版本管理。 Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发。Git 是根据GNU通用公共许可证版本2的条款分发的自由/免费软件,安装参见:http://git-scm.com/

GitHub是一个基于Git的远程文件托管平台(同GitCafe、BitBucket和GitLab等)。

Git本身完全可以做到版本控制,但其所有内容以及版本记录只能保存在本机,如果想要将文件内容以及版本记录同时保存在远程,则需要结合GitHub来使用。使用场景:

  • 无GitHub:在本地 .git 文件夹内维护历时文件
  • 有GitHub:在本地 .git 文件夹内维护历时文件,同时也将历时文件托管在远程仓库
  • 集中式:远程服务器保存所有版本,用户客户端有某个版本
  • 分布式:远程服务器保存所有版本,用户客户端有所有版本

1、Git把管理的文件分为了两个区域四个状态。

工作区(workspace):当前开发程序所在目录称为工作区,即:工作开发都是在该目录,该区域的文件会有状态的变化且状态由git自动检测,如果程序中文件做任何操作(增、删、改),文件状态均会被检测到,可以使用 【git status】命令查看。

版本库:工作区检测到有文件发生变化,那么意味着较上一个版本之后对程序进行了修改,修改完成之后,可以当做下一版本进行提交,那么就是执行 【git add .】 将所有文件提交到暂存区(index/stage/cached),然后再执行【git commit -m '又一个版本'】提交到版本库的分支即可,之后可以使用【git log】命令查看版本记录。

  • 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
  • Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
  • 前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
  • 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
  • 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
  • 因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
  • 你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
  • Git的四个区域:工作目录(Workspace)-->暂存区域(Index/Stage/Cached)-->本地仓库(Repository)-->远程仓库(Remote)Git命令就是用于将文件改动切换到不同的空间来记录
  • Git的四种状态:Untracked--> Unmodified--> Modified-->Staged

2、基础命令

  • git init,初始化,表示即将对当前文件夹进行版本控制。
  • git status,查看Git当前状态,如:那些文件被修改过、那些文件还未提交到版本库等。
  • git diff index.html,查看此文件在本地工作目录和暂存区的区别。
  • git diff --cached index.html,查看此文件在暂存区和本地仓库的区别。
  • git add 文件名,将指定文件添加到版本库的暂存状态。
  • git add . 把当前目录下所有改动的文件都添加到版本库的暂存状态。
  • git commit -m '提交信息',将暂存区的文件提交到版本库的分支也就是本地仓库。只有将文件提交到本地仓库,git才真正的对文件实现了管理
  • git log,查看提交记录,即:历史版本记录
  • git log -p,更详细的历史版本记录
  • git log -1,显示最近一条
  • git log --oneline,记录显示成一行
  • $ git log --oneline --decorate,记录显示成一行,还可以看到分支
  • git reflog,查看每一次命令
  • git reset --hard 4459657,回滚
  • git checkout -- index.html,用暂存区的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
  • git reset HEAD index.html,用本地仓库版本替换暂存区的版本
  • git rm index.html,git commit -m "remove index.html"从版本库中删除该文件
  • git rm --cached index.html"从暂存区删除,可以理解成git add index.html 的反命令
  • git rm -f index.html"从暂存区和本地工作目录中同时删除
  • git mv index.html home.html"从暂存区和本地工作目录中同时改名为home.html
  • git config --local user.name 'silencio9'
  • git config --local user.email '343096080@qq.com'

二、分支管理  

branch称为分支,默认仅有一个名为master的分支。一般开发新功能流程为:开发新功能时会在分支dev上进行,开发完毕后再合并到master分支。

1、创建与合并分支  

2、解决冲突  

3、基本命令  

  • git branch 分支名称             创建分支
  • git checkout 分支名称          切换分支
  • git branch -m 分支名称        创建并切换到指定分支
  • git branch                          查看所有分支
  • git branch -d 分支名称         删除分支
  • git merge 分支名称              将指定分支合并到当前分支
  • git remote查看远程库的信息
  • git remote -v显示更详细的信息

4、分支

  • master分支是主分支,因此要时刻与远程同步;

  • dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;

  • bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;

  • feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

5、标签

  • git tag -a v1.0    当前内容打一个标签(方便快速回滚),每次提交都可以打个tag
  • git tag -a v1.0 aa27de7   给aa27de7内容打一个标签(方便快速回滚)
  • git reset --hard v1.0    回滚到v1.0版本
  • git tag          查看当前所有的标签
  • git show v1.0      查看当前1.0版本的详细信息
  • git tag -a v1.2 -m "version 1.2 release is test"          创建带有说明的标签,-a 指定标签名,-m 指定说明文字
  • git tag -d 1.0     为同一个提交版本设置了两次标签,删除之前的v1.0

三、远程仓库  

1、创建SSH Key

本地Git仓库和GitHub仓库之间的传输是通过SSH加密的

第1步:创建SSH Key,一路回车,使用默认值即可。

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

找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容: 最后点“Add Key”,你就应该看到已经添加的Key

  • 为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
  • GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
  • 提示:在GitHub上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信息放进去。
  • 如果你不想让别人看到Git库,有两个办法,一个是交点保护费,让GitHub把公开的仓库变成私有的,这样别人就看不见了(不可读更不可写)。另一个办法是自己动手,搭一个Git服务器,因为是你自己的Git服务器,所以别人也是看不见的,公司内部开发必备。

2、创建远程仓库

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

第1步:登陆GitHub,然后,在右上角找到“New repository”按钮,创建一个新的仓库:

第2步:$ git remote add origin git@github.com:silencio9/blog.git #添加远程仓库

第3步:git push -u origin master # 推到远程

以后:git push origin master #以后只要本地作了提交,此命令就可以推到远程库

 

3、从远程库克隆

假设我们从零开发,没有本地库那么最好的方式是先创建远程库,然后,从远程库克隆。

第1步:登陆GitHub,创建一个新的仓库,名字叫gitskills勾选Initialize this repository with a README,这样GitHub会自动创建一个README.md文件:

第2步:$ git clone git@github.com:silencio9/gitskills.git #在本地找一个目录,克隆远程库 或者 $ git clone https://github.com/silencio9/gitskills.git

  • GitHub给出的地址不止一个,还可以用https://github.com/silencio9/gitskills.git这样的地址。Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。
  • 使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https

4、基础命令

  • $ ssh-keygen -t rsa -C "youremail@example.com",创建SSH Key。
  • $ git remote add origin git@github.com:silencio9/blog.git # 为地址起一个别名origin 或者 $ git remote add origin https://github.com/silencio9/blog.git
  • $ git push -u origin master #将本地master分支内容以及版本信息推送到GitHub
  • $ git push origin dev # 将本地dev分支内容以及版本信息推送到GitHub
  • $ git clone git@github.com:silencio9/gitskills.git #在本地找一个目录,克隆远程库 或者 $ git clone https://github.com/silencio9/gitskills.git
  • $ git Branch # 默认获取到得只有master分支
  • $ git branch dev origin/dev # 创建dev分支且和远程dev分支同步
  • $ git checkout dev # 切换到dev分支
  • $ git pull origin dev # 从远程GitHub仓库获取dev分支最新内容,并合并到本地
  • $ git fetch origin dev # 从GitHub仓库获取dev分支最新内容到版本库的分支
  • $ git merge origin/dev # 将版本库的分支内容合并到工作区
  • 【git pull origin 分支】命令等同于【git fetch origin 分支】+ 【git merge origin/分支】

四、多人协作  

1、合作者

将其他用户添加到仓库合作者中之后,该用户就具有向当前仓库提交代码。

2、组织

创建一个组织,然后再该组织下可以创建多个项目,组内成员可以向组内所有项目提交代码。PS:也可以对某个项目指定合作者

3、三人协同开发整个过程

  • 创建程序
    • 用户A创建程序,提交到GitHub
    • 用户B克隆项目
    • 用户C克隆项目
  • 开发功能
    • 用户A开发功能1
    • 用户B开发功能2
    • 用户C开发功能3
  • 提交
    • 用户A提交功能1,并push(A用户手速快,先提交。)
    • 用户B提交功能2,无法push,因为GitHub上已经有其他人提交的新代码。
      解决方法:从GitHub上获取最新代码并合并到本地,提交自己开发的功能2。
    • 用户C提交功能3,无法push,无法提交,因为GitHub上已经有其他人提交的新代码。
      解决方法:从GitHub上获取最新代码并合并到本地,提交自己开发的功能3。
  • 获取最新代码
    • 用户A获取最新代码
    • 用户B获取最新代码
    • 用户C获取最新代码

在上面红色标注的解决方法位置可以有三种方式操作,三者都可以完成合并并提交新功能,但是日志记录会有差异,如:前两者版本记录中会出现合并,而第三种可以保证版本记录干净整洁。

  • 先 git pull origin master   然后 git push origin master
  • 先 git fetch origin master 然后 git merge origin/master   再 git push origin master

五、fork  

  • fork一下,然后这个项目就在自己仓库出现了
  • 从自己仓库获取代码并进行编辑提交
  • 创建并提交一个pull request,然后等待原作者是否同意这个pull request,如果同意那么在作者的源代码中就推出现小P提交的功能
      

六、其他补充  

1、 配置文件

Git的配置文件有三个:

  • 系统配置: /private/etc/gitconfig
  • 用户配置: ~/.gitconfig
  • 项目配置:.git/config

2、 用户凭证

由于Git和Github交互操作可能会很频繁,那么一定少了用户授权的操作,为了防止每次操作重复输入用户名和密码,Git提供了两种解决方法:

  • 秘钥
    首先创建一对秘钥  ssh-keygen -t rsa,然后将 id_rsa.pub (公钥)内容拷贝到github中,日后操作无需再输入用户名和密码。
    注意:这种方式需要使用GIt中 git@github.com:WuPeiqi/xxxxx.git 格式地址。
  • 密码
    Https访问git时,避免每次操作需要输入用户名和密码,可以在配置文件中添加如下配置项:
        [credential]
        helper = store/cache/第三方

    store:
            表示将用户名和密码保存在硬盘上
            第一次输入过用户名和密码之后,用户名和密码就会保存在当前用户根目录的 .git-credentials 文件中,内容格式为:https://用户名:密码@github.com

            自动添加配置命令:git config credential.helper store
    cache:
            表示将用户名和密码保存在缓存中
            第一次输入过用户名和密码之后,用户名和密码就会保存在缓存中,默认超时时间是 900 秒,缓存相关文件保存在当前用户根目录的 git-credential-cache 中
            自动添加配置命令:
                   git config credential.helper cache
                   git config credential.helper 'cache --timeout=300'

    相关操作:
            清除缓存:git credential-cache exit
            指定超时:
                [credential]
                helper = cache --timeout=300
    注意:
             这种方式需要使用GIt中 https://github.com/WuPeiqi/xxxx.git 格式地址。
             指定用户名和密码: https://用户名:密码@github.com/wupeiqi/xxx.git 

  以斜杠“/”开头表示目录;

  以星号“*”通配多个字符;

  以问号“?”通配单个字符

  以方括号“[]”包含单个字符的匹配列表;

  以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;
.gitignore

转载于:https://www.cnblogs.com/bubu99/p/10684933.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值