zoukankan      html  css  js  c++  java
  • git

    1、结构

    git是分布式的, 可以各自独立,没有中心, 而cvs svn等是集中式的,因为是分布式的,可以在安装了git的任何机器上创建版本库(没有服务器),但通常拿一个远程库大家共同推送到这个上面(相当于服务器)

    远程仓库  -- 即另外一个电脑上的仓库

    工作区和暂存区

    工作区有一个隐藏目录.git,这个不算工作区的,而是Git的版本库。
    Git的版本库里存了很多东西:
    1)其中最重要的就是称为stage(或者叫index)的暂存区,
    2)还有Git为我们自动创建的第一个分支master,
    3)以及指向master的一个指针叫HEAD。
    把文件往Git版本库里添加的时候,是分两步执行的:
    第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
    第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到本地仓库的当前分支。
    因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
    你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

    分支及作用

    作用:假设你准备开发一个新功能,需要10天才能完成,第一天你写了10%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。 如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

    现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

     

    Git跟踪并管理的是修改,而非文件 

    同一个文件, 第一次修改后 add 到暂存区, 然后再修改, 
    那么commit时,只会把暂存区的内容提交到版本库, 之后修改的因为没有add到暂存区, 所以不会被提交

    2、命令

    创建本地仓库:

    进入一个目录, 然后git init  (或者从远端 git clone 比如 git clone git@111.222.33.188:/git/android.git/

     

    通过git init命令把这个目录变成Git可以管理的仓库:

    当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的

     

    添加远程主机:

    如果是用 git init先创建本地仓库,需要使用git remote add命令用于添加远程主机,然后才能把本地的推送到远程仓库。
    $ git remote add <主机名> <网址>

    如果是用 git clone从远程仓库克隆的,那么会自动添加该远程主机。

    可以使用 git remote -v  来查看

     

    把文件添加到本地仓库:

    第一步,用命令git add告诉Git,把文件添加到仓库

    $ git add readme.txt

    执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。

    第二步,用命令git commit告诉Git,把文件提交到仓库:

    $ git commit -m "wrote a readme file"

    -m 本次提交的说明

     

    查看状态:

    $ git status

    git status命令可以让我们时刻掌握仓库当前的状态

     

     

    查看修改内容:

    $ git diff readme.txt 

     

    git操作日志

    $ git log --pretty=oneline

    首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

     

    返回上一个版本

    $ git reset --hard HEAD^

    返回指定版本时,只需HEAD^替换成版本号的前几位,git会自动查找。

     

    rm命令删除文件:

    $ rm test.txt

    这个时候,Git会知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:

    现在你有两个选择:

    一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:

    $ git rm test.txt

    rm 'test.txt'

    $ git commit -m "remove test.txt"

    现在,文件就从版本库中被删除了。 

    另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

    $ git checkout -- test.txt

     

    丢弃工作区的修改

    $git checkout -- readme.txt    (注:命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令)
    用本地仓库里的内容覆盖掉工作区的内容,这里有两种情况:

    一种是readme.txt修改后还没有被放到暂存区,现在撤销修改,就是用本地仓库里的内容覆盖掉工作区的内容;
    一种是readme.txt已经添加到暂存区后,现在撤销修改, 就是用本地仓库里的内容覆盖掉工作区的内容,但暂存区里的修改不会改变

    $ git reset HEAD readme.txt
    可以把暂存区的修改撤销掉,重新放回工作区

    小结
    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
    场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
    场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交使用:
    git reset --hard 3628164

     

    拉取远程仓库里的更新取到本地:

    比如,取回origin主机的master分支。

    Git fetch origin master
    所取回的更新,会存储在本地主机上。

    git branch -a 查看存储在本地的所有分支。
    $ git branch -a
    * master                               --这是本地仓库的master分支
      remotes/origin/master     --这是远程仓库的master分支

    git fetch:相当于是从远程获取最新版本到本地,不会自动merge合并
    Git fetch origin master                     --从远程的origin的master主分支下载最新的版本到origin/master分支上
    git log -p master..origin/master      --比较本地仓库的master和远程master的区别
    git merge origin/master                   --合并到当前分支

    git pull:相当于是从远程获取最新版本并merge到本地
    git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。
    $ git pull <远程主机名> <远程分支名>:<本地分支名>
    比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。
    $ git pull origin next:master
    如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
    $ git pull origin next

     

    将本地仓库推送到远程

    git push命令用于将本地分支的更新,推送到远程主机 
    $ git push <远程主机名> <本地分支名>:<远程分支名>
    比如:
    $ git push origin master
    上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。

    如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
    $ git push origin :master
    # 等同于
    $ git push origin --delete master
    上面命令表示删除origin主机的master分支。

    如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
    $ git push origin
    上面命令表示,将当前分支推送到origin主机的对应分支。

    如果当前分支只有一个追踪分支,那么主机名都可以省略。
    $ git push

    如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。

    这时,如果你一定要推送,可以使用--force选项。

     

    分支

    Git鼓励大量使用分支:

    查看分支:git branch

    创建分支:git branch <name>

    切换分支:git checkout <name>

    创建+切换分支:git checkout -b <name>

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

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

     

     

     

     

     

     

     

     

  • 相关阅读:
    Java设计模式—模板方法模式
    STM32 常用GPIO操作函数记录
    GPIO 配置之ODR, BSRR, BRR 详解
    STM32F4先设置寄存器还是先使能时钟
    LDR指令的格式:
    printf函数重定向
    stm32F4各个库文件的作用分析
    STM32F4时钟设置分析
    STM32F407存储器和总线架构
    SPI移位寄存器
  • 原文地址:https://www.cnblogs.com/qjoanven/p/7641181.html
Copyright © 2011-2022 走看看