美文网首页
Git私房菜

Git私房菜

作者: 52Hetrz | 来源:发表于2019-06-20 18:51 被阅读0次

    作为开发平时使用Git版本管理工具是必不可少的,于此记录一下自己平时使用到和理解的部分命令,有疑点欢迎回复会及时更正,望互相学习互相进步。

    GIT特点:

    1.下载后本地本身就是一个版本库
    2.速度快超过绝大部分的版本管理
    3.强大的分支管理
    4.活跃的github开源社区

    与SVN做个比较加深理解:

    1.GIT天生就是分布式
    2.版本机制:SVN 存储的是变化,GIT则存储整体
    3.GIT不需联网先存储在本地,降低风险
    4.GIT内容完整性要优于SVN
    *发散比较(如果项目使用SVN集中管理,服务器需要特别稳定所以需要使用负载均衡,都知道负载均衡的费用成本和风险比较高 ,如果使用GIT的话就可以去中心化,可以避免上诉的问题)

    GIT配置

    GIT配置参数是根据三级层次优先级查找的,如果存在相同配置参数的话,首先根据 ①系统层用户下 .get/config ②当前用户目录 /.gitconfig ③git安装目录 /etc/gitconfig

    git connfig --list 查看所有配置
    git config user.name 查看配置值
    git config [–local|–global|–system] –add section.key value 在某个环境添加一个配置
    git config [–local|–global|–system] –unset section.key 删除某项配置
    

    创建版本库

    初始化一个Git仓库,使用git init命令
    添加文件到Git仓库,分两步:
    1.使用命令git add <file>,可反复多次使用,以添加多个文件
    2.使用命令git commit -m <message>,完成
    
    * 至于为什么需要先add 在commit 分两步执行看下面:
    图1-1
    从左到右代表git提交到文件库的过程:
    git add  提交到缓存库
    git add.  将所有的add和update都提交至缓存库
    git add -a  将add、update、delete都提交至缓存库
    git commit  提交至文件库  简写:git -m "aaa"
    git -am  "aaa" 是上面两个命令的简写 ,会同时将修改放入缓存和文件库
    

    GIT三类文件

    1.被追踪的(tracked):已经加入文档库
    2.未被追踪的(untrcked):  没有加入过文档库
    3.忽略的(ignore):忽略那些不需要跟踪的文件,对当前目录及子目录生效,所有在主目录新建就好 .git文件同理
    
    * 假如新建一个.gitignore 文件未及时生效?因为文件已经纳入到缓存库,需要 
    git rm -r  --cache .   删除全部缓存
    git add -am  "add new file .ingore"   提交忽略文件修改至文件库
    

    查看log

        git log   查看日志
        git log --oneline  查看简写日志
        git log --oneline --graph  查看带分支的简写日志
        git log --abbrev-commit   查看log简写指令日志,指令是为你的SHA-1值生成出简短且唯一的缩写
    

    修改与回退

    关于reset多种模式可以参考此文章

    1.版本回退
        a.HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
        b.穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本
        c.要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本
                        commit_id  commit_log
                        89JKI9     append GPL     1️⃣
        HEAD  =====>    JKIU78     wrout hvb      2️⃣       从2-3时git 
                        LFTR78     init starting  3️⃣
        
        d.现在目前HEAD在 2️⃣
          假如要 2->3要  
              git reset --hard LFTR78  退回代码至LFTR78
          假如要 2->1要  
              git reflog --oneline --graph   查看完整的提交日志(包括历史日志)
              git reset --hard commit_id     回退至commit_id节点代码
    2.删除文件与恢复
        a.如果要删除,执行 git rm <file>、git commit -m "remove test.txt"即可
        b.如果删除出错、需要恢复执行git checkout <file>
        * git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
    
    3.git reset 三种模式 hard、soft、mixed
       看图1-1后半部分就可以清楚的分辨出他们的不同
       reset --hard id:重置stage区和工作目录,重置到你规定的提交点
       reset --soft id:保留工作目录,并把重置 HEAD 所带来的新的差异放进暂存区
       reset 不加参数(mixed)/ reset --mixed id :保留工作目录,并清空暂存区
       使用场景:
        --hard:
          1. git reset --hard HEAD 抛弃所有add、commit以及本地修改,保持本地清洁
          2. git reset --hard id 抛弃id之后的所有提交
        --soft:
          1. 利用会保留回退和修改至暂存区,可以合并多个commit节点,清洁提交点
        --mixed(默认):
          1. 与上面--soft合并commit节点差不多,只是多了git add添加到暂存区的操作
          2. git reset HEAD移除所有add、commit的提交至本地仓库。
    
    4.git reset 、git revert 可能会有很多人不知道如何选择
        dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 - 8p8675 - 78ju09 - 89pl76[master] 
                            \                      /
                          76cada - 62ecb3 - b886a0 [feature]
    
       他们的区别我们用例子演示一下就能明白:
       假如当前master分支 78ju09 commit节点发现了提交的代码bug
           1.如果想要保存住 89pl76 提交点的代码我们会使用revert命令操作,他会在 89pl76 之后新生成一个提交,对应着 78ju09 节点代码的反向操作(比如你加了一个A,此时就会去掉这个A还原代码) 
           2.如果不想保存 89pl76 的代码,我们就可以使用reset 来操作,就是讲指定节点的代码全部回退至本地或者缓存库 详细命令介绍 看上面git reset三种模式!
        所以综上所诉:
        git reset  78ju09 就是回退78ju09之后的所有代码至本地,并且将HARD指针指向78ju09这个节点 查看git log就会发现最新log是 8p8675
        git revert 78ju09 会生成一个新的 commit,将指定的 78ju09 内容从当前分支上撤除,对78ju09之后的节点不会有任何影响
    
    git  revert  的常规用法:
        1.回退78ju09代码
            git revert 78ju09
        2.回退8p8675代码(这是一个merge commit  需要指定-m 1)
           git show 8p8675  
                 commit  8p8675u8797g77908080807hjkhjh798
                 merge   5a6057 b886a0
           git revert -m 1 8p8675  (此时8p8675有两个父级节点,5a605->1 master  b886a0-> 2 feature)
    

    远端仓库

    1.添加远程库
        a. 关联一个远程库 git remote add origin/upstream <gitpath>     
        b. git push -u origin <branch> 第一次推送本地分支的所有内容至origin分支,-u参数是将<branch>关联起来,简化以后提交
        c. 此后每次本地提交后,仅 git push origin master推送最新修改即可
    2.克隆仓库
        a. git clone 克隆一个仓库到本地  默认使用ssh协议,https很慢还需要验证账号密码、但某些公司需要使用https
    
    3.Gitlab和Github贡献代码
      平时项目开发使用gitlab和github比较多,一般更新操作流程介绍:
        a.首先登录gitlab  fork指定的项目
        b.git clone <path>  克隆项目代码
        c.git remote add upstream <path>   关联至upstream远端分支
        d.git fetch upstream 从upstream更新最新的代码
        e.git checkout -b abc upstream/abc  基于upstream/abc分支新建分支并切换至该abc分支
        f.本地开发修改
        g.git commit -am "commit log"  提交更新至本地文件库
        h.[当多个人合作在同一分支上开发提交] git pull --rebase upstream abc 
        i.git push origin abc  提交至远程origin分支abc
        j.在gitlab上merage request之后,提醒developer去合并代码  
        h.再次在提交代码时如果分支使用的特别频繁你的origin 和 upstream 肯定不是一致的,需要将origin的分支删除更新至最新 : 操作如下->
           1.git checkout master
           2.git branch -D abc
           3.git push origin :abc
           4.git fetch upstream 
       然后在从e步骤开始即可!!!
    

    分支管理

    1.创建与合并
        查看分支 git branch 
        创建分支 git branch <name>
        切换分支 git checkout <name>
        创建并切换分支 git checkout -b <name>
        合并某分支到当前分支 git merge <name>
        删除分支  git branch -d <name> 
        删除origin远端remit分支   git push origin :remit
        查看分支合并图 git log --graph --pretty=oneline --abbrev-commit
    
    2.分支合并策略
        git merge 使用的是fast forward策略,看不出提交信息
        git merge --no-ff -m "merge with no-ff" dev   加上--no--ff参数可以使用简单模式合并,因为会产生信息所以添加-m,能从历史信息中追溯到
    
    3.储存区
        git stash save 'test-ldc-bug' 可用来暂存当前正在进行的工作, 比如想pull 最新代码, 又不想加新commit
        git stash list 多次使用’git stash’命令后,你的栈里将充满了未提交的代码 查看多个暂存代码版本,查看所有的缓存记录
        git stash apply stash@{1} 恢复到指定@{1}版本的代码,并保留记录
        git stash drop stash@{1} 删除某一次缓存
        git stash clear 清理暂存的栈,清楚所有的缓存记录
        git stash pop  继续原来的工作,删除记录
        git stash show -p 查看指定stash的全部diff
    
    5.rebase变基
        git rebase 简单就是会隐藏合并的过程
        rebase操作可以把本地未push的分叉提交历史整理成直线;
        rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
    
        *当在版本后面发现AM时代表正在变基中,使用如下代码可以清空正在变基的状态.
        rm -rf .git/rebase-apply
    

    标签tag

        git tag <tagname> 基于当前分支最新提交创建标签
        git tag -a "tagname"  -m "create tag v1.0" commit_id   a指定标签名称  m标签内容  commit_id提交的ID
        git tag 查看所有标签
        git push origin <tagname> 推送一个本地标签到远程
        git push origin --tags可以推送所有本地标签
        git tag -d <tagname> 删除本地标签
        git push origin :refs/tags/<tagname> 删除远程标签
    

    git cherry-pick 介绍

    将一个分支上的某些commit在另一个主分支上重演
    
    1.git cherry-pick  
        20c2f506d789bb9f041050dc2c1e954fa3fb6910 
        2633961a16b0dda7b767b9264662223a2874dfa9 
        5d5929eafd1b03fd4e7b6aa15a6c571fbcb3ceb4  
      a.多个commit-hash使用空格分割, commit-hash最好按提交时间先后排列, 即最先提交的commit放在前面.
    
        假设分支结构如下:
        dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]   ---HEAD
                            \
                          76cada - 62ecb3 - b886a0 [feature]
    
        再假设 62ecb3 的提交修复了bug,这时候可以用cherry pick 合并单个 commit
        
         ->   git cherry-pick 62ecb3
    
        就这么简单,62ecb3 已经应用在 master 的log上了(作为一个新的commit)
    
    

    git diff/patch 介绍

    1.patch 和diff 的区别
     Git 提供了两种补丁方案,一是用git diff生成的UNIX标准补丁.diff文件,二是git format-patch生成的Git专用.patch 文件。
      .diff文件只是记录文件改变的内容,不带有commit记录信息,多个commit可以合并成一个diff文件。
      .patch文件带有记录文件改变的内容,也带有commit记录信息,每个commit对应一个patch文件。
      在Git下,我们可以使用.diff文件也可以使用.patch 文件来打补丁,主要应用场景有:CodeReview、代码迁移等。
    
    2.创建diff/patch
    git format-patch 2a2fb4 -2    --n指从sha1 id对应的commit开始算起n个提交
    git format-patch 2a2fb4 -1    --某个提交的patch
    git format-patch 2a2fb4 .. 89aebf  --某两次提交之间的所有patch
    
    git diff  2a2fb4  89aebf  >  patch.diff   --创建两次提交之间的差异内容至diff文件
    
    3.应用patch 和 diff
    检查patch/diff是否能正常打入:
    git apply --check 【path/to/xxx.patch】
    git apply --check 【path/to/xxx.diff】
    
    打入patch/diff:
    git apply 【path/to/xxx.patch】
    git apply 【path/to/xxx.diff】
    git  am 【path/to/xxx.patch】
    
    4.冲突解决
    在打补丁过程中有时候会出现冲突的情况,有冲突时会打入失败:
    此时需要解决冲突:
        1、首先使用以下命令行,自动合入 patch 中不冲突的代码改动,同时保留冲突的部分,同时会生成后缀为 .rej 的文件,保存没有合并进去的部分的内容,可以参考这个进行冲突解决
        git  apply --reject  xxxx.patch
        2、解决完冲突后删除后缀为 .rej 的文件,并执行git add.添加改动到暂存区
        3、接着执行git am --resolved 或者 git am --continue
        
    说明:在打入patch冲突时,可以执行git am --skip跳过此次冲突,也可以执行git am --abort回退打入patch的动作,还原到操作前的状态
    

    相关文章

      网友评论

          本文标题:Git私房菜

          本文链接:https://www.haomeiwen.com/subject/gkujqctx.html