zoukankan      html  css  js  c++  java
  • git使用方法

    git介绍

    Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,可以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    git架构

    git由三部分组成:

    • 工作区:用户工作目录
    • 暂存区index:用户提交的工作文档暂存于此
    • 对象库object:用户执行commit操作之后的文件会进入对象库。对象库中的文件可以随时进行版本回滚。
      git工作原理:
      首先执行git初始化,然后会在用户目录生成一个.git目录,其中记录的是index区,object区,hook等各种信息。当用户在工作目录编辑文档之后可以执行git add把文档记录到index区域,然后再通过git commit操作把index区域的文件同步到object区域,并且可以指定一个注释信息作为版本注释信息。object中的文件是以sha算法进行单向加密的hash值,以文件名和大小等信息为hash计算的依据。其中前两位为目录名,后面为文件名:

      在object中有HEAD的概念,HEAD是一个指针,永远指向当前最新的一个commit版本。git实现版本的回滚就是利用head实现的。当需要回滚到以前的版本的时候HEAD会指向用户指定的版本。
      git原理图:

    git使用方法

    提交文件
    git add filename:用于把文件提交到index区域
    git commit :用户提交index的文件到object区域
    例子:

    git init develop    #创建一个develop的工作区,其中有.git目录#
    cd develop
    cp /etc/passwd /.    #拷贝/etc/passwd文件到当前工作区#
    git status    #查看当前git状态,会提示有文件需要add进行提交或者执行git rm进行删除#
    git add .    #提交当前工作区所有文件到index#
    git commit -m ‘v0.1’    #提交文件到object区域,并注释为v0.1#
    

    此时进入.git目录的object目录会看到已经多了一个文件,即刚提交的文件。
    可以对文件进行多次修改,修改完成之后再次按照以上步骤提交,然后可以进行版本回滚
    版本回滚:
    git reset --hard :将head指向改定的提交,index的快照内容也更改为指定提交,工作区文件变为指定版本
    git reset --soft:head指向给定的提交,index和工作区不受影响
    git reste --mixed:head指向给定的提交,index的快照也恢复到指定版本,但是工作区内容不变

    git log --graph --pretty=oneline    #查看所有的历史提交版本#
    git reset --hard ***:恢复到指定的版本,***表示可以为commit值,也可以为tag或者文件名,也可以通过相对路径表示#
    

    此时就可以恢复到以前的版本,但是有一个问题,如果想从以前版本再恢复到最新版本发现git log已经找不到最新的commit信息了,这是因为当前状态还没有commit,不过也可以恢复,需要使用git reflog查看最新的commit信息,git reflog会列出在git执行的所有操作。
    git相对路径表示法
    HEAD^1:表示恢复到上一个提交版本
    HEAD^2:表示恢复到上两个提交版本
    HEAD~10:表示恢复到上10个版本

    git多分支

    git可以指定多个分支同时工作,比如开发工作中master分支通常是用于稳定版本的发布,通常还会有develop开发分支。通常在develop分支进行开发工作,开发完成之后会把develop分支工作的内容合并到master分支中去。
    git branch:列出当前的分支数目和当前使用的分支
    git branch 分支名:创建新分支
    git checkout 分支名:切换分支

    git分支合并

    git分支有两种合并方式,一个为merge,一种为rebase。
    merge表示把指定分支合并到另一个分支,此时两个分支的内容会合二为一,不过如果分支过多会导致分支过复杂。
    rebase表示把指定分支无缝合并到另一分支,分支变化的内容会以pack文件的方式存在,pack存放的是多个分支不同的内容。从下图可以看到rebase会更加明晰。

    git合并分支一般会自动完成,不过如果主分支和另一分支对一个文件同时进行了修改操作,则需要手动解决冲突再合并。合并之前需要两个分支都commit工作。

    #merge操作#
    git checkout master
    git merge develop    #合并develop到master
    git add .    #合并完成需要重新提交
    git commit 
    #rebase操作#
    git checkout master
    git rebase develop
    git add.
    git commit
    

    分布式git版本控制系统

    有多种方法可以实现此功能,比如可以采用github或者公司自建gitlab等。
    常用命令:
    git clone 分支名:克隆远程分支到本地
    git remote:显示所有的远程分支
    git push:推送当前修改的工作内容到远程分支
    git pull:将远程分支内容取下来然后和本地进行合并
    git fetch:取回远程服务器的更新
    git本地和远程服务器的传输可以通过多种方法

    • http或https协议:可以进行远程下载,但是无法做到上传
    • ssh:可以进行远程下载上传
    • git协议:由git-daemon程序提供,监听在tcp的9418端口;仅支持“读”操作,无任何认证功能;
      gitlab和github都支持http和ssh两种方式。
  • 相关阅读:
    POJ 1330 Nearest Common Ancestors(LCA Tarjan算法)
    LCA 最近公共祖先 (模板)
    线段树,最大值查询位置
    带权并查集
    转负二进制
    UVA 11437 Triangle Fun
    UVA 11488 Hyper Prefix Sets (字典树)
    UVALive 3295 Counting Triangles
    POJ 2752 Seek the Name, Seek the Fame (KMP)
    UVA 11584 Partitioning by Palindromes (字符串区间dp)
  • 原文地址:https://www.cnblogs.com/stacks/p/7249269.html
Copyright © 2011-2022 走看看