git+远程仓库

    1. 仓库级别 local 【优先级最高】

    2. 用户级别 global【优先级次之】

    3. 系统级别 system【优先级最低】

      常用全局配置说明:
      git config --global user.name "My Name" 【设置基本的全局变量】
      git config --global user.email "MyEmail@gmail.com" 【设置基本的全局变量】
      
      1、全局设置用户名和邮箱,针对的是 commit 提交时,知道是谁提交的。这个没有设置的话,commit 时就会报错的。【这个不是解决,每次push 都要输入用户密码的问题】
      2、如果要实现 每次 push,不需要输入用户名密码,使用 git config --global credential.helper store 命令,只要输入一次。后面就会保存到本地的。

git底层原理:

  参考:https://juejin.cn/post/6966059771346550815

  • git对象:git 对象就是一些键值对,键都是hash值。
    主要有3种类型对象:blob、tree、commit。查看对象类型的命令
    git cat-file -t 04da2bff328a2127851277728f212c1b540d5916  # 输出 blob | tree | commit
    • blob 对象:Git 的核心部分是一个简单的键值对数据库。你可以向该数据库插入任意类型 的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索该内容。
      【个人理解:blob对象保存的都是文件的数据。】
      向数据库写入内容,即生成 blob对象:
      git hash-object -w 文件路径

      查看Git 是如何存储的:

      find .git/objects -type f

      查看git 对象类型 :

      git cat-file -t 04da2bff328a2127851277728f212c1b540d5916  # 输出 blob

      查看git对象内容:

      git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4    # 返回对应的内容
    • tree对象:我们可以认为树对象就是我们项目的快照。
      进行代码提交时,需要根据暂存区的内容,先生成tree对象,再生成commit对象

      通过 git write-tree命令将暂存区内容写入一个树对象:
      $ git write-tree
      d8d965c56c04e851e3b47f524c6c52a24c396857

      查看tree对象类型:

      git cat-file -t 7850adac6112da2c1a2aa2c1576dfa2171d32b24  # tree

      查看tree对象内容:【tree对象也是指向blob对象的】

      $ git cat-file -p d8d965c56c0
      100644 blob 6a0b867bdc470c582c15906f264b9fec371cdbfc    readme.md
    • commit 对象
      可以通过调用 commit-tree命令创建一个commit对象
      【个人】commit对象,就是在tree对象下,加了写信息,如name,email。

  • git合并时,底层原理:https://zhuanlan.zhihu.com/p/149287658
  • git高层命令,在底层做了什么处理:
    • git add
      先 生成一个blob对象,然后将该对象放进index区(暂存区是一个目录树。保存着对 blob对象的引用)。
      感悟:从这里可以看出,git add时,文件已经添加到 git 版本库中了。只是 非 commit 对象。
    • git commit
      进行代码提交时,需要根据暂存区的内容,先生成tree对象,再生成commit对象,然后会将记录记录到logs文件夹下。

 

git应用层介绍

1、Git常用操作   https://blog.csdn.net/w372426096/article/details/81625446     

2、git概念和原理 :   https://blog.csdn.net/zguoshuaiiii/article/details/78375997  或 https://www.jianshu.com/p/a31471933fd3git 有4个空间

   关键概念:工作区(里面的文件也叫 工作副本)、暂存区(也叫 缓冲区)、本地仓库、远程仓库     https://blog.csdn.net/zssureqh/article/details/52564305

3、Git图谱:https://www.jianshu.com/p/d3d575799ff3

4、git 分支管理: https://www.cnblogs.com/spec-dog/p/11043371.html 或 https://www.cnblogs.com/kevingrace/p/5691115.html 或 http://www.ruanyifeng.com/blog/2012/07/git.html

  • 常设分支:
    • master【必要】:生产环境的稳定分支,生产环境基于该分支构建。仅用来发布新版本,除了从 release-* 或生产环境Bug修复分支进行merge,不接受任何其它修改。
      分支说明:
      • master 分支 一般都有权限保护的,开发者不可以直接推送到远程仓库。开发者提交合并请求,管理员在远程仓库上进行合并
      • master 分支 是不允许回滚的,如果有问题,也是通过 拉 fixbug-* 分支修改。没问题,再合并到master分支【马上上线】 或 release-*分支【延期 上线】。
        注意master 分支 的一定要看成 立即上线的分支。因为master上的代码,自己没有去部署,别人可能 下一刻 部署 就带上去了。
      • 如果,公司管理不规范,master分支 都是从develop 分支合并的话。那 feature 就不能 轻易合并 到 develop分支了。
    • develop【必要】:开发分支,日常开发应该在这一条分支上完成。【两人及以上 同时 开发一个项目,就要用到】
       分支说明:
      • develop 分支用于日常开发,保存了开发过程中最新的代码。
      • 当 develop 分支上的代码达到稳定,并且具备发版状态时,需要将 develop 的代码合并到 master,并且打一个带有发布版本号的 tag
    • develop-*【视情况定】:这个分支主要看项目是多个团队开发,还是一个团队开发。
      • 如果是一个团队开发,就不需要 develop-* 分支了。只有一个团队 使用 develop 分支就可以了
        如果是多个团队开发,要注意自己团队开发提交的代码。不让其它团队把代码部署到线上去。所以需要一个 自己团队的开发分支。这样 他们从develop分支合并master分支时,就不会把我们团队的代码带上去了。
      • 团队有自己的 develop-* 分支,就不用考虑 管develop 分支了,不用给 develop 分支打tag了。只有在  部署生产  的时候 把 develop-* 分支代码 合并到develop分支就可以了。
      • 当 develop-* 分支上的代码达到稳定时,并且提交部署线上时。一定要打个 tag,因为后面开发会一直集成到 develop-* 分支的,如果 线上不小心把 不装备 上线的代码带上去了。还得 通过tag 回到之前的版本。
      • 如果要部署 到测试环境,将 develop 分支 合并到 develop-* 分支,在 把 develop-* 分支 部署到测试环境。
        这样的考虑是:develop 上是我们确定要上线的代码(要和后端同步部署生产,develop-* 上没有确定要上生产环境就不能合并到develop分支上。
        因为测试环境有 其它团队的代码,所以部署 develop-* 分支,上测试环境。需要先合并 develop 上别人的代码。
  • 辅助分支:
    • feature-*:为了开发某个特定功能,从develop分支上面分出来的。开发完成后,要merge到develop分支。功能分支的命名,可以采用feature-*的形式命名(*为任务单号)。
      分支说明:
      • feature-* 分支 不是必须的,一般都是直接在 develop-* 分支上开发的。主要是碰到在  develop-* 分支上开发到一半,突然来一个更急的需求。这时就需要 一个feature分支来辅助了。
      • feature-*分支,一般在从master 或 develop 分支上分出来。且 这个分支 通常只存在于开发者的本地仓库中,并不包含在远程库中
    • fixbug:为了修复某个bug 而创建的分支。
      分支说明:
      • 修复 bug 分支是从 master 分支上分出来的。修复结束以后,再合并进 master 和 develop 分支。
      • fixbug-*分支,一般在从master 或 develop 分支上分出来。且 这个分支 通常只存在于开发者的本地仓库中,并不包含在远程库中
    • release:发布正式版本之前(即合并到Master分支之前),我们可能需要有一个预发布的版本进行测试。预发布分支的命名,可以采用release-*的形式命名。release-* 合并到Master分支(即,release-*分支代码上线)后,要立即删除 release-*分支。如果release-*分支不准备上线,可以先放在那里。 注意:release 分支 只能从dev分支 或 fixbug 上拉取。 从fixbug分支(不立即上线时)拉取,创建release分支,先保持在那,删除对应的fixbug分支。 从develop分支(dev分支准备上线时,放到release上测试)拉取, release 分支没问题就要合并到master分支。

  总结:

    • 上面的分支策略,不管是单人开发,还是多人开发都应该常用这种策略。因为即使是单人开发,如果 在后面的开发中,突然发现前面测试环境有bug,就得在 develop 分支 之前的某次提交(不能把新开发的功能部署上去)基础上进行修复bug,再部署到测试环境。
    • 开发过程,主要还是使用 develop 分支 和 辅助分支。
    • 保证远程仓库的干净,辅助分支不用推送远程,留在本地就可以。
    • develop分支每次开发新功能前,打个tag。(如,后面新功能-xxx)
      注意:之前的功能,因为后端接口改变引起的bug,都按照 新功能开发处理。因为这种修改必须前后端同时部署才可以。

5、git本地分支和远程分支:本地分支和远程分支是不同的分支,给对他们的处理就是不同的分支处理的。
    比如 master分支 和 orgin/master  这是两个不同的分支。

6、git pull 拉取远程的代码:http://t.zoukankan.com/hoge66-p-14688241.html

  • git pull :
    该命令会将远程的提交和你本地的提交merge,如果有冲突需要手动解决并提交,会产生merge的记录
  • git pull -- rebase :
    该命令会把你的提交“放置”在远程拉取的提交之后,即改变基础(变基),
    如果有冲突 解决所有冲突的文件,
    git add <冲突文件>
    git rebase --continue

6、git 两种合并方式

    • 远程分支和本地分支的处理,就是两个不同分支的处理。
    • git merge 合并时 会自动挑选合适的合并策略。【Fast-forward 或 Recursive】
      Fast-forward是git在合并两个没有分叉的分支时的默认行为。这种合并策略默认不会产生提交记录,如果需要生成提交记录,可以加参数,git merge --no-ff
      【正常情况,我们都希望合并时 产生一个合并记录。这是符合逻辑的】
    • git merge合并后自己代码丢失原因分析及解决方案:https://blog.csdn.net/u010856177/article/details/113336724
      个人推荐方案:本地reset到之前的没问题的版本,代码拷贝出来,再重新pull变成最新的版本。
                               把 拷贝的代码覆盖上去,提交代码时要对比下修改了哪些内容。不要把别人的修改的代码删除了
  • git rebase:变基。这种方式不会产生一个merge提交,但是会改变原有的提交(即原来的commit_id不要了,出现产生了对象的commit_Id)。

7、git reset 和 git revert。https://www.cnblogs.com/houpeiyong/p/5890748.html

    1. git reset --hard xxx :hard (修改版本库,修改暂存区,修改工作区)
    2. git reset --soft xxx : soft (修改版本库,保留暂存区,保留工作区)
    3. git reset xxx: 默认参数   --mixed(修改版本库,修改暂存区,保留工作区)
      这里的 xxx 有几个 别名    
      HEAD^ 或 HEAD~:上一个版本     https://blog.csdn.net/albertsh/article/details/106448035
  • git revert:用于“反做”某一个版本,以达到撤销该版本的修改的目的。会创建一个新的提交,不会修改原有的提交。
          【远端仓库的提交记录是不允许改变的,所以代码push后,想要撤回 一般使用 revert实现】

  总结:git reset 是删除 指定版本后面所有的提交,而 git revert 是新增一个和指定版本反向操作的代码提交。

8、远程仓库的回滚(回滚分 几种 情况的):      https://blog.csdn.net/qq_36898043/article/details/81461019

  • 第一种情况: 只是在本地commit,还没有push到远程分支。
    • 这种情况,使用  reset  或  revert 都可以实现。(推荐使用reset

  • 第二种情况:代码已经push到远程仓库,可通过以下命令实现
    • 这种情况,使用 reset ,本地代码可以回滚。但是本地回滚的代码无法推送上去,因为远程仓库的版本更新。
    • 可以使用 revert 进行回滚,但是revert进行回滚不彻底。中间提交了好多次,使用 revert 回滚,只是对指定版本所做的修改进行反向操作,中间的提交还是保留的。

9、git 自带的图形工具有两个: https://www.zhihu.com/zvideo/1251479417017966592

  1. git gui
  2. gitk 命令弹出【这个用的比较多

10、git 配置别名: 有的命令太长了,通过别名可以很方便使用。         https://www.jianshu.com/p/161b3f70e314 

  • 别名配置命令:
    git config --global alias.st status 
    git config --global alias.cm "commit -m"  # 带参数的命令,设置别名需要使用双引号 ""
  • 我的常用别名配置
    [alias]
        st = status
        co = checkout
        cm = commit -m  
  • reflog并不是Git仓库的一部分,它单独存储,它纯属是本地的https://www.jianshu.com/p/7e4cef3863e7
    git有的命令不会产生提交记录(即在git log上不会有记录),但是这个操作在底层上是会生成一个新的 提交对象(一个hash值对应)的。如,
    git commit -amend 追加修改时,底层的提交对象改变,版本hash值也会改变。这个细节通过git reflog 命令就可以看出。
    【这也就很好的解释了为什么追加修改后,为什么git push 不上去了。因为追加提交,是把log上最后一次提交给替换了。本地没有远程最后一次log记录,那就是比远程版本落后,肯定是提交不上去的,需要--force才可以】

11、Git通过命令忽略指定文件https://www.cnblogs.com/sunwk/p/13458889.html  或  https://www.it610.com/article/1303883228863565824.htm
  项目中一些需要在本地修改,又不能写进.gitignore中,就需要通过命令了。比如,
       vue.config.js 文件,本地修改代理地址,本不应该随着add . 提交上去。所以我们需要本地忽略掉,但是不能写在.gitignore上。

  • 忽略指定文件
    git update-index --assume-unchanged test.txt
  • 取消忽略
    git update-index --no-assume-unchanged test.txt 

12、git 命令常用参数说明:

  • --no-ff :这个是 合并使用的参数。https://blog.csdn.net/zombres/article/details/82179122
    --no-ff 的作用是禁止快进式合并。快进式合并会把 feature 的提交历史混入到 master 中,搅乱 master 的提交历史。
    【总结】这个主要是在合并到master分支时会用到。
  • --no-commit:执行合并(merge)但不自动提交, 给用户在做提交前检查和修改的机会
    --no-ff --no-commit 常常是一起使用的,都是在合并到master分支时使用。
  • --stat:显示文件目录列表,默认显示的文件长度有限。可以设置显示路径长度,使路径完整显示。如
    git diff --stat=200  # 200个字节,就是最多只能显示100个字符 

13、从其他分支merge个别文件或文件夹  https://wenku.baidu.com/view/a47b40cd82c758f5f61fb7360b4c2e3f57272584.html 

git checkout source_branch <path>...

  注意:在使⽤git checkout 某⽂件到当前分⽀时,会将当前分⽀的对应⽂件强⾏覆盖

14、git stash:保存工作进度(保存 工作区 暂存区 的改变)

  • git stash pop:只恢复工作区,即之前保存的进度全部恢复到工作区,不会自动帮你重新暂存。
  • git stash 保存进度时,也会产生一个 commit_id,所以对 stash进度的操作,有很多都和操作提交记录类似,如
    git diff stash@{0} vue.config.js    # 就是类比 对比某个提交记录的操作,stash的 commit_id 可以通过 stash@{num} 来表示

15、checkout命令:checkout 除了切换分支,还有 检出内容到工作目录。https://juejin.cn/post/6978436693485420575

  • 检出内容到工作目录:该命令从历史提交(或者暂存区域)中检出内容到工作目录,该命令 不会改变 HEAD 头指针,也就是当前分支不会发生变化。
    使用 git checkout -- <file> 检出内容到工作目录 。-- 可以省略(git checkout <file>), 主要用于防止文件路径和分支名称混淆(git checkout <file>git checkout <branch> 命令结构相同)。 
    checkout可以从很多地方检出内容:暂存区、某个提交、某个分支、stash保存的进度中
    • 暂存区 【未指明,默认就是从暂存区检出】
    • 某个提交
    • 某个分支
    • stash保存的进度
  • 切换分支:运行 git checkout <branch>命令,移动HEAD标识指向指定分支,也就是“切换”至该分支了。

16、Cherry-pick:参考链接  或  https://www.cnblogs.com/Mufasa/p/14431990.html

  • 使用场景:
    • 1、多版本维护时(多个不同版本都是发布生产的代码),公共缺陷、公共需求等修改后,需要在每个版本上同时修改相同的内容。不可能在每个版本分支上都做一遍,使用 cherry-pick 就可以在一个分支改完后,其它版本分支从那个分支摘取出来就可以了。【开发批量调度时就碰到 v4、v6、v9、v16版本,维护起来可麻烦了】
    • 2、在某个分支上修改好了代码,突然发现这个分支已经很久不用了。如果把这个分支合并到其它分支肯定是有问题的。可以通过 Cherry-pick 把这次修改的代码,单独摘取出来  放到其它的分支上。 
  • 命令格式:
    git cherry-pick <commitHash> 命令:  cherry-pick 是从某个 commit(提交) 上摘取 数据。【所以 小乌龟git 上,要在 提交列表 上有这个选项】

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  git扩展知识:

  1、git提交时如何忽略一些文件  :  https://www.jianshu.com/p/ade52455c3a4

  2、.gitkeep 文件的作用 :https://www.cnblogs.com/xingzc/p/7896869.html

      git是不允许提交一个空的目录到版本库上的,可以在空的文件夹里面建立一个.gitkeep文件,然后就可以提交上去了。(其实只要里面有文件就可以提交上去了)

  3、git 指定 分支,克隆代码: https://blog.csdn.net/Connie1451/article/details/84992915 

    git clone -b 分支名 仓库地址

  9、git 命令可以写成 批处理,这样就不用记git命令,也不容易出错。  https://blog.csdn.net/weixin_42381351/article/details/87369661

     .bat 的批处理无法在 git Bash 命令框上运行,所以 使用  .sh 后缀名的批处理文件。

      git Bash 命令框 上运行 .sh 批处理文件。   https://www.jb51.net/article/170880.htm

    sh .\test.sh

  10、操作中遇到到问题:

      a、git删除了本地文件 , 并且提交了,但是没push,然后从远端拉代码 , 怎么没有把这个文件拉下来呢?  https://segmentfault.com/q/1010000016759971 
         原因:本地版本更新,本地已经有远程的代码,pull 肯定无用啊。从提交记录上看,应该是回退一个版本。


 TortoiseGIT(git小乌龟)

1、TortoiseGit安装与使用  :  TortoiseGit的使用是基于git(软件)的基础上的。

    参考:  https://www.cnblogs.com/wupenglei-5/p/8744801.html

 TortoiseGit 下载  :   https://tortoisegit.org/download/

2、通过TortoiseGIT把本地项目上传到GitHub      :   链接地址

  注意:puttyken获取鼠标行为来生成密钥。鼠标移动速度越快,密钥生成就越快。(鼠标不动的话是非常慢的) 参考:  https://jingyan.baidu.com/article/6c67b1d69134a92787bb1ee3.html

3、github使用ssh密钥的好处与原因 : https://blog.csdn.net/love_fdu_llp/article/details/38752365

4、TortoiseGit同时推送两个远端仓库代码 :https://blog.csdn.net/xinxinsky/article/details/80034530

  注:通过克隆的仓库,本地和远端仓库已经建立了联系,所以不需要额外去配置了。

5、解决 两个 根本不相干的 git 库(本地库 和 远端库建立连接):链接地址1 (推荐这个) 或   https://blog.csdn.net/m0_37402140/article/details/72801372

6、git中,一个项目就是一个仓库。所以 git小乌龟 中每个项目中进行设置是有差别的,比如  远端的地址。不同项目是不一样的。

   通过 克隆 下来的仓库, 远端设置中会自带克隆下来的地址的,所以不用配置。如果需要添加一个远端地址,就需要在这里在配置一个。

7、小乌龟git  删除本地分支,远程分支:https://www.jianshu.com/p/e0da2720372a

8、小乌龟git 中 版本树,如果是全部分支,所有分支的节点都会显示; 如果是某个分支的话,只显示于这个分支有影响的节点。如,未合并的分支节点不显示,合并的分支,影响当前分支代码的节点,就会显示。

  这个 主要在这个分支显示上,右键就可以选择显示的节点是全部还是某个分支了。

  注意:小乌龟git默认的排序不是以时间来排序的,需要自己设置成git默认的时间排序。版本树中的颜色和信息中对应分支的颜色是不一致的,每一行只有一个节点,显示的分支标签对应在哪个哪个分支上,该分支就是对应的分支。

                                                                       


 github / 码云

1、推送代码到码云上的话使用 TortoiseGit 的话,和GitHub一样需要创建 SSH秘钥的(TortoiseGit 软件内置了 puttyken 软件的)。

  注意:puttyken获取鼠标行为来生成密钥。鼠标移动速度越快,密钥生成就越快。(鼠标不动的话是非常慢的) 参考:  https://jingyan.baidu.com/article/6c67b1d69134a92787bb1ee3.html

2、使用TortoiseGit+码云 管理项目代码    : https://blog.csdn.net/yl2isoft/article/details/53493194

3、git本地项目代码上传至码云远程仓库  : https://blog.csdn.net/fox9916/article/details/78253714?locationNum=5&fps=1   或   https://blog.csdn.net/ts_zxc/article/details/40795225

4、码云上的公钥只能一个有效,github应该也是一样。

5、github如何用浏览器直接打开项目里的html页面  :   https://www.cnblogs.com/futai/p/6733358.html

posted @ 2018-06-03 13:44  吴飞ff  阅读(1469)  评论(0编辑  收藏  举报