zoukankan      html  css  js  c++  java
  • Git基础知识

    Git 和 SVN 的区别

    git是目前最先进的分布式版本控制系统。
    分布式的意思是每一台机器都可以充当中央服务器。
    git用很长的一串字符记录版本。
    
    svn是集中式版本控制器,需要联网后才能使用,而且速度慢。
    集中式的意思是版本库集中放在中央服务器,各位代码狗需要代码时从中央服务器下载,写完后再次推送到中央服务器。
    如果中央服务器出问题可能所有人的工作都不能进行。
    svn用数字1记录版本。

    Git原理

    暂存区:文件夹的的.git文件夹,每次执行git commit后会保存子啊这个文件夹中
    工作区:工作区就是本地该代码的那个文件夹及文件,所以每次git checkout后代码总是会自动改变
    
    本地仓库:本地的仓库,即自己电脑上的项目代码
    远程仓库:即远程服务器上的代码,虽然git是分布式架构,但在我的理解中,远程仓库就是只github或gitlab这种远程仓库
    
    本地分支:本地切换后的分支
    远程分支:远程服务器中分支,其中包括别人创建的分支,可以用git branch -r查看

    Git 使用

    配置用户信息

    第一个要配置的是个人用户名称和电子邮件地址,Git提交时都会引用这两条信息,说明是谁提交了更新,并随更新永久纳入历史记录:
    git config --global user.name "tangguoqiang"
    git config --global user.email "1639619652@qq.com"

    创建版本库

    1、创建本地仓库
    mkdir -p git_local_dir
    cd git_local_dir
    #将本地文件夹变成Git可以管理的仓库
    git init
    
    2、在GitHub网站创建仓库并下载
    在github官网上创建仓库并用git下载
    git clone git@github.com:tg10020617/git-test-project.git

    查看提交日志

    git log
    ------------------------------
    commit 872d8cf44d4b928dae18de00c8cf6024b1253426        ###    版本号
    Author: tg10020617 <1639619652@qq.com>                ### 提交人
    Date:   Thu Aug 9 18:24:08 2018 +0800                ### 提交日期
    
        commit 2                                        ### 提交是记录的commit
    
    commit a86c5554597057e50a49282328f394f2bdc5d127
    Author: tg10020617 <1639619652@qq.com>
    Date:   Thu Aug 9 18:20:43 2018 +0800
    
        commit 1
    ------------------------------

    跳到之前的版本

    (执行这些命令只能会跳到本地库的某个版本,并不更新其他库,只有执行git push后才会更新)
    (执行跳转后,如果记得跳转前的版本号,也能回到跳转前的状态)
    跳到上个版本        git reset --hard HEAD^
    跳到上上个版本    git reset --hard HEAD^^
    跳到上100个版本    git reset --hard HEAD~100
    ------------------
    git reset --hard HEAD^
    HEAD 现在位于 7d97191 commit 3
    
    # 我记得我commit 4的号的前几位是 cde12f022183 所以也可以跳转到之前的版本
    git reset --hard cde12f022183
    HEAD 现在位于 cde12f0 commit 4
    ------------------

    一个超级吧吊的命令

    git reflog
    (用来记录每一次版本跳转或者版本提交的版本号)
    --------------------------------
    git reflog
    #感觉有了这个命令可以随便作死了
    cde12f0 HEAD@{0}: reset: moving to cde12f022183
    7d97191 HEAD@{1}: reset: moving to HEAD^
    cde12f0 HEAD@{2}: commit: commit 4
    7d97191 HEAD@{3}: commit: commit 3
    872d8cf HEAD@{4}: commit: commit 2
    a86c555 HEAD@{5}: commit (initial): commit 1
    --------------------------------

    git管理的是修改,而不是文件

    也就是,当你第一次修改完文件并且将添加进暂存区(git add),再次修改后(不执行git add),然后提交(git commit)
    则只提交第一次修改后的文件,第二次修改的不提交。所以便于回滚。
    ------------------------------
    git diff HEAD -- readme.txt
    # 比较工作区文件与最后一次提交的文件的区别
    
    diff --git a/readme.txt b/readme.txt
    index 6530232..9a7f1b6 100644
    --- a/readme.txt
    +++ b/readme.txt
    @@ -7,3 +7,7 @@ test 3: 08 09 19 56
     test 4: 08 09 20 02
    
     test 5: 08 09 23 39
    +                            有 + 号的这几列是新增加的
    +test 6: 08 09 23 41
    +
    +test 7: 08 09 23 44
    
    
    git diff HEAD^ -- readme.txt
    # 比较工作区文件与上上次提交的文件的区别
    
    diff --git a/readme.txt b/readme.txt
    index 1a19da3..9a7f1b6 100644
    --- a/readme.txt
    +++ b/readme.txt
    @@ -5,3 +5,9 @@ test 2: 08 09 18 23
     test 3: 08 09 19 56
    
     test 4: 08 09 20 02
    +                            有 + 号的这几列是新增加的
    +test 5: 08 09 23 39
    +
    +test 6: 08 09 23 41
    +
    +test 7: 08 09 23 44
    ------------------------------

    删除内容

    -----------------------------
    git checkout -- readme.txt
    # 只是删除工作区的内容,而非暂存区或者提交后的文件,即删除git add之前的文件
    
    git reset HEAD readme.txt
    # 恢复到最新状态,即将git add后的文件移除暂存区,移除到工作区再使用上一条命令删除
    
    git rm local_update1.md
    git commit -m "rm local_update1.md"
    # 删除文件
    
    rm 'local_update1.md'
    # 位于分支 master
    # 要提交的变更:
    #   (使用 "git reset HEAD <file>..." 撤出暂存区)
    #
    #    删除:      local_update1.md
    #
    -----------------------------

    创建分支

    -----------------------------
    git branch feature/test1
    # 此时只在本地创建了test1分支,远程并没有这个分支,可以用git branch -r查看远程分支
    git branch -r
    
    [root@VM_191_181_centos git-test-project]# git branch test1
    [root@VM_191_181_centos git-test-project]# git branch
    * master
      test1
    [root@VM_191_181_centos git-test-project]# git branch -r
      origin/master
    
    # 切换到test1分支
    git checkout test1
    
    
    # 也可以创建并切换到test1分支
    git checkout -b feature/test1
    -----------------------------

    提交分支

    -----------------------------
    # 合并test1分支到master分支,只是在暂存区中合并,要想在远程分支生效,需要git push
    git merge test1
    
    # 合并完成后就可删除分支(这里的删除指的是在删除本地的分支)
    git branch -d test
    
    [root@VM_191_181_centos git-test-project]# git branch
    * master
      test1
    [root@VM_191_181_centos git-test-project]# git branch -d test1
    已删除分支 test1(曾为 462144d)。
    [root@VM_191_181_centos git-test-project]# git branch
    * master
    [root@VM_191_181_centos git-test-project]# git branch -r
      origin/master
      origin/test1
    [root@VM_191_181_centos git-test-project]#
    ----------------------------

    bug分支

    (即可以同时开两个分支,将第一个分支用git stash的形式将文件保存,然后再另一个分支开发,最后再次用git branch跳回重新解决)
    ----------------------------
    git stash
    
    [root@VM_191_181_centos git-test-project]# git add bug.md
    [root@VM_191_181_centos git-test-project]# git stash
    Saved working directory and index state WIP on feature/bug: 462144d new branch upload document
    HEAD 现在位于 462144d new branch upload document
    [root@VM_191_181_centos git-test-project]# git stash list
    stash@{0}: WIP on feature/bug: 462144d new branch upload document
    [root@VM_191_181_centos git-test-project]# git stash pop
    # 位于分支 test1
    # 尚未暂存以备提交的变更:
    #   (使用 "git add <file>..." 更新要提交的内容)
    #   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
    #
    #    修改:      readme.txt
    #
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
    丢弃了 refs/stash@{0} (5edd14408756fbffb7b355b266f0e1618c17c6c8)
    ----------------------------

    不保存本地修改,强制拉取远程

    ----------------------------
    # 下载远程仓库最新版,并且不作合并
    git fetch --all
    # 将head指针指向test02的最新版
    git reset --hard origin/test02
    git pull origin test02
    ----------------------------

    比较两个分支/文件的差异

    ----------------------------
    # 查看test1分支有而master分支没有的(分支提交记录)
    git log test1 ^master
    
    # 查看test2中比master多提交了哪些内容
    git log master..test2
    
    # 显示所有有差异的文件列表
    git diff test1 master --stat
    
    # 显示两个分支上两个文件的具体差异
    git diff test02 master app/Http/Controllers/Post.php
    
    # 显示所有差异文件的详细差异
    git diff test02 master
    ----------------------------

    git远程分支,返回之前commit提交位置

    ----------------------------
    git log 
    
    commit 8a4a2aff4ec387bfd49624de1fc34aef7b11d9ca (HEAD -> develop, origin/develop)
    Merge: 4e49bd5e 02288018
    Author: xxx 
    Date:   Thu Oct 11 16:08:13 2018 +0800
    
        feat:CMS29期 permissions调整
    
    commit 022880188fc8533edf78a125176f43c8f8567552
    Author: xxx 
    Date:   Fri Sep 28 12:00:18 2018 +0800
    
        feat:App8.0 主题模块接口文档 -> 参数调整
    
    
    git reset --hard 022880
    git reset 022880
    
    git push origin develop --force
    ----------------------------
  • 相关阅读:
    ios的自动转屏
    Acoustic Echo Cancellation (AEC) 回音消除技术探索
    springMVC之数据传递
    redis.conf 配置详解
    HDU 1880 字符串hash 入门题
    算法题: 求一个整数数组中,通过元素加减运算得到指定结果的所有运算过程. 例如【5,4,6,7,1】= 9 ?
    创建和使用SQL Server SSAS本地多维数据集
    yum局域网软件源搭建
    [置顶] 使用Android OpenGL ES 2.0绘图之六:响应触摸事件
    [置顶] Nosql笔记(一)——关系型数据库回顾
  • 原文地址:https://www.cnblogs.com/Mr-Wenyan/p/9549707.html
Copyright © 2011-2022 走看看