美文网首页
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私房菜

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

  • Git入门私房菜

    昨天下午参考廖雪峰的博客和其他一些文章,简单了解了一下传说中的Git,发现常见用法入门还是挺容易上手的,在此做一些...

  • 前端学习路径

    开发工具 Photoshop linux最常用的命令 linux私房菜 git入门 chrome浏览器开发者工具详...

  • 私房菜

    名起私房菜,不过是家常小菜,最是简单不过的了。现在开始有空就做点小菜,一方面是锻炼锻炼自己的厨艺,另一方面也是想从...

  • 私房菜

    小城街头巷尾偶有挂有私房菜的招牌。 “私房菜”的历史,可以追溯到清末光绪年间。据说祖籍广东的世家子弟谭瑑青,祖父辈...

  • 私房菜

    我家的私房菜 老友鼓励我说,空闲了写关于老爷子的随笔,都挺爱看的。我觉得这个馊主意还不错。 每到周末,我总是自觉不...

  • 私房菜

    今天过节,奶奶说换换口味,三妹订了家私房菜,按位收费,每人268,主菜佛跳墙。这两年很流行这种餐厅,神神秘秘隐蔽在...

  • 私房菜

    张亮是远近有名的厨师,很多食客都远道慕名而来,只为尝一尝他的手艺,他因此很骄傲。 近日,饭店里来了一个新的毛头小子...

  • 5.24

    周末老公私房菜时间。

  • 108【2016年 陆】美人私房菜

    剧名:美人私房菜 其它译名:美人私房菜之玉蝶传奇 上映时间:2016年 导演:梁辛全 类型:古装、美食、爱情 地区...

网友评论

      本文标题:Git私房菜

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