zoukankan      html  css  js  c++  java
  • 【随笔】Git

    Git历史

    谈论git之前,我们先来说下 Linux,Linux是一个开源系统,Linus 创建了Linux,但是Linux的壮大是靠着全世界的热心“志愿者”共同参与的

    2002年之前,志愿者们把代码通过 diff的方式发给linus,然后linus通过手工的方式合并代码(他觉得CVS、SVN合并代码效率低,太low;使用付费的版本控制工具,又违背了Linux的开源之道)

    2002年之后,BitMover公司免费向Linux社区提供BitKeeper 版本控制系统

    2005年,一位Linux开发成员 写了一个可以连接BitKeeper 仓库的工具(外挂),试图破解BitKeeper协议(不允许使用者开发类似BitKeeper 的版本控制系统),导致BitMover公司收回了 Linux社区的免费使用权

    LInus 决定自己开发一个 版本管理系统

    10天后,Git 诞生了(C语言),一个月后,Linux系统的源码已经由git管理了

    2008年 GitHub网站上线,为开源项目提供Git存储

    集中式与分布式

    集中式版本控制系统:CVS、SVN等

    分布式版本控制系统:Git、BitKeeper等

    集中式特点:有中央服务器,保存所有文件的修订版本,中央服务器崩了 或者没有网络的话,都不能commit代码

    分布式特点:没有中央服务器,每个人的电脑都有一个完整的“版本库”,安全性高,某个人的电脑崩了的话,从别人的电脑里在复制一份就可以

    集中式和分布式的区别是:

    你的本地是否有完整的版本库历史!

    假设SVN服务器没了,那你丢掉了所有历史信息,因为你的本地只有当前版本以及部分历史信息。

    假设GitHub服务器没了,你不会丢掉任何git历史信息,因为你的本地有完整的版本库信息。你可以把本地的git库重新上传到另外的git服务商。
                                                                      -------引自 廖雪峰

    Git安装:自行百度

    Git工作区与暂存区:

    工作区:电脑中能看到的目录就是工作区

    工作区的隐藏文件 .git(创建版本库时会被创建,记录版本历史)不算时工作区,是版本库

    git add后,将文件放入暂存区(stage),git commit,将stage中的所有文件都提交到 master分支中(git init的时候,自动创建了master分支)

     无暂存区

    HEAD:本地仓库 当前引用

    config:git仓库的配置文件

    description:仓库的描述信息

    hooks:存放shell脚本

    objects:存放所有 git对象

    有暂存区(多了index文件)

    Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。

    暂存区,降低了commit的粒度:commit操作会全都提交,如果修改了两部分代码,只想提交一部分,此时 可以把想要提交的代码 add入暂存区,降低commit粒度

    Git命令:

    • Git创建版本库:git init
       

    • 添加文件到Git仓库:git add、git commit
      git add:添加文件,将修改的文件放入暂存区,等待提交
      git commit:提交文件,修改的文件直接被Git录入历史


    • 版本回退:git log、git reset、git reflog
      git log :显示从最近到最远的提交日志,参数 --pretty=oneline :简化log日志,美观
      git reset:回退版本,HEAD表示当前版本,HEAD^表示上一版本,HEAD^^表示上两个版本,HADE~100表示上100个版本
      git reflog:查看之前所有版本(包括已经被删除的 commit 记录和 reset 的操作),如果之前的记录被清空了,查不到版本id,通过这个命令可以把所有的提交历史都展示
       

      git reset --hard <版本号>:指定回复到哪个版本,版本号不用填全,git会自动寻找
      Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD指针的指向改变了

    • 查看状态:git status

       

    • 撤销更改:git checkout、git reset
      1)只修改了工作区的文件:git checkout

      2)修改的文件已经add 暂存区 
      将 暂存区的修改回退到工作区:git reset,然后再次git checkout,可以丢弃工作区的修改,

      使用git reflog可以查看所有操作历史

    • 删除文件:git rm <file>
      本地文件上传git,再删除本地文件后,git status会显示本地删除的文件

      git rm :从版本库中删除,然后 git commit即可删除干净



       如果是工作区误删,直接使用git checkout -- <文件>恢复即可
      git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
      没有添加到版本库 就被删除的文件,是无法恢复的

    • 克隆远程库:git clone
       

    添加远程库

    gitlab上新建一个项目,然后通过命令 

    git remote add origin https://git.haodf.net/liuweijian/learngit.git

    git push -u origin master

    可以将本地内容 同步到远程库中

    创建分支

    创建分支的本质:新建一个指针 dev,与master指向相同,HEAD之前指向master,新建分支后,HEAD指向 dev(HEAD指向当前分支)

    (以下所有截图引自 廖雪峰的Git教程)

    创建分支前:

    创建分支后:

    以上可以看出,新建分支对工作区的内容 完全没有修改,之后的操作 就是针对 dev分支了

     将dev 合并到master,就是将master指向 dev的当前提交

     删除分支就是将 dev指针删掉

    实操

    创建并切换分支:git checkout -b dev,相当于 git branch dev  创建分支、git checkout dev 切换分支

     切换master并合并dev:git merge <指定分支>

    最新版本的git支持 git switch切换分支

    删除 dev分支:

    查看分支:git branch

    创建分支:git branch <name>

    切换分支:git checkout <name>或者git switch <name>

    创建+切换分支:git checkout -b <name>或者git switch -c <name>

    合并某分支到当前分支:git merge <name>

    删除分支:git branch -d <name> 

    合并冲突

    新建分支,commit修改的内容,master分支同样修改了该文件,也commit了,这个时候merge的时候会报错,提示merge冲突

     

     冲突的修改内容展示:

    修改冲突后,使用 git log --graph --pretty=oneline --abbrev-commit可以查看冲突解决的日志

  • 相关阅读:
    修改MyEclipse工作空间
    Servlet
    Java虚拟机类加载机制
    编译执行和解释执行
    awt和swing
    构造函数
    小知识点
    [剑指Offer]42-连续子数组的最大和/ [LeetCode]53. 最大子序和
    [剑指Offer]40-最小的k个数
    [剑指Offer]47-礼物的最大价值(DP)
  • 原文地址:https://www.cnblogs.com/lwj-0923/p/13353399.html
Copyright © 2011-2022 走看看