zoukankan      html  css  js  c++  java
  • 你还不会Git?那就不要写代码了(学习过程记录)

    Git应用开发学习

    这,仅是我学习过程中记录的笔记。确定了一个待研究的主题,对这个主题进行全方面的剖析。笔记是用来方便我回顾与学习的,欢迎大家与我进行交流沟通,共同成长。不止是技术。

    一旦你会使用了Git,就再也不想使用SVN了。永远也回不去了。

    Mac上使用Git,肯定离不开对Mac上的操作。就要使用常用的Linux命令来进行操作。通过终端来进行操作。

    学习Git一定要使用命令行的方式来学习。不要使用图形界面来操作学习。会大大折扣的哦。

    花了时间来学习一门东西。一定要得到自己想要喜欢的东西。

    课程的内容

    • Git官网
    • 常见Linux命令介绍
    • Git在各平台下的安装与配置
    • 分布式与集中式版本控制系统的差别
    • 缓存区、工作区与Git提交
    • 版本回退
    • 修改与撤销修改、文件的添加与删除
    • Git对象类型与索引
    • Git分支branch
    • 如何创建、切换与删除分支
    • Git分支在项目开发中的作用
    • Git分支在工程化项目中的最佳实践
    • 分支常见重要命令详解
    • Git merage
    • Git冲突解决策略
    • HEAD详解
    • Git Commit修改详解
    • 远程版本库介绍
    • 如何使用远程版本库
    • Git puah 、pull、fetch使用与注意事项
    • Git合并的基本原则
    • Git别名、config文件详解
    • Git tag详解
    • 如何创建于推送tag
    • Git feature分支详解
    • 合适应该使用submodule
    • Git subtree详解
    • .gitignore的正确使用方式
    • Git私服gitlab的搭建方法
    • 使用gitlab作为版本控制服务器
    • Gitlab的使用详解
    • 搭建idea的Java开发工具,基于gradle的开发环境
    • Git与idea的整合
    • gradle初步使用
    • .gitignore最佳实践

    开发工具的准备。

    1. Git官网。https://git-scm.com/ 下载Git

      Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.

      Git is easy to learn and has a tiny footprint with lightning fast performance. It outclasses SCM tools like Subversion, CVS, Perforce, and ClearCase with features like cheap local branching, convenient staging areas, and multiple workflows.

    bash 系统自带的终端。

    zsh 增强版的bash

    1. on my zhs 的安装
    sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
    
    1. 常见的Linux命令介绍

    常见的Linux命令介绍

    创建一个文件: touch text.txt

    复制一个文件: cp text.txt

    查看一个文件: cat text.txt

    修改文件的名字: mv text.txt text1.txt

    删除一个文件: rm text.txt

    修改一个文件: vi text.txt :wq 保存退出。

    Git入门指引

    Git GitHub Gitlab

    为什么要使用Git。

    本地建立版本库。本地版本控制。多主机异地协同工作。重写提交说明。有后悔药可以吃。更好的提交列表,比较好的差异比较。更完善的分支系统。速度快。

    Git工作模式

    git 基础

    直接记录的快照,而非差异比较

    近乎所有操作都在本地执行。

    时刻保持数据的完整性。

    多数操作仅添加数据。

    文件的三种状态。 已修改,已暂存(stage),已提交(commit)。

    Git文件:以被版本库管理的文件

    已修改:在工作目录修改Git文件

    已暂存:对已修改的文件执行Git暂存操作,将文件存入暂存区。

    已提交:将已暂存的文件执行Git提交操作,将文件存入版本库。

    Git的文件状态

    image-20200115083152657

    MAC上推荐的工具 homebrew

    SSH:Secure Shell

    Git常用命令

    mkdir mygit 创建一个目录

    获得版本库

    git init 初始化一个版本仓库

    git clone

    查看信息

    git help

    git log 查看提交日志

    git diff 比较文件在不同状态下的区别

    版本管理

    git add 将已修改的文件添加到暂存区

    git commit -m 提交修改

    git rm 删除版本库中的特定文件

    远程协作

    git pull 拉取代码到本地

    git push 推送代码到远端

    其他常用命令

    touch test.txt 新建一个文件

    cat test.txt 查看这个文件

    vi test.txt 修改这个文件

    git status 查看当前分支文件的状态

    配置username && email**

    对于user.name 与user.email来说,有三个地方可以设置

    1. etc/gitconfig (几乎不常用) git config --system
    2. ~/.gitconfig(对于单个用户的,常用) git config --global
    3. .git/config (针对于特定项目) git config --local

    优先级 3>2>1


    2020年01月16日09:17:33

    Git 命令练习

    git的删除,添加,修改与日志

    which vi 查看命令的目录

    ⌃ a 光标去开头

    ⌃ E 光标去结尾

    ehco 'hellow world asd' > test.txt 修改内容, 重定向到文件中。等于修改了文件。

    删除-恢复操作

    rm

    image-20200116084302862

    git rm

    image-20200116084553913

    使用 rm 和 git rm 的区别。

    git rm : 1. 删除了一个文件 2. 将被删除的文件纳入到暂存区.

    若想恢复被删除的文件,需要进行两步操作。

    a. git rest HEAD test2.txt 将待删除的文件从暂存区恢复到工作区

    b. git checkout -- test2.txt 将工作区中的修改丢弃掉

    rm : 将文件删除,这时,被删除的问价并未被纳入到暂存区

    重命名操作

    git mv oldname newname 重命名

    mv oldname newname 重命名

    git mv 和 mv 的却别 相当于 rm 和 git rm 的区别。

    修改commit注释

    git commit --amend -m '修改commit注释' ; 把上次提交的commit记录给修改了

    git log -n ;查看最近几条的日志

    查看帮助文档

    git help log ; git log --help ; man git log

    .gitignore 与 分支

    .gitignore的作用:过滤不需要上传的文件。

    • *.a #忽略掉所有.a结尾的文件
    • !lib.a # 但lib.a除外
    • /TODO #仅仅忽略项目根目录下的TODO文件,不包括subdir/TODO
    • build/ # 忽略build/目录下的所有文件
    • doc/*.txt # 忽略doc/a.txt 但不包括 doc/b/a.txt
    • /**/test.txt 忽略所有的test.txt

    -- 2020年01月18日18:16:58

    rm -rf file 删除一个文件 或者一个文件包

    echo 'hello world ' > test.txt 创建一个文件

    分支的重要操作:

    分支的本质到底是什么?

    分支,一个commit 对象链,一条工作记录线。

    HEAD指向的是当前的分支

    master指向提交

    合并之后 是一个快照 Fast - forward

    git branch : 查看分支

    git branch new_branch : 创建一个分支

    git checkout - : 切换到上一个分支

    git checkout master : 切换到master分支

    git branch -d erwa : 删除erwa 分支 。 不能删除当前分支;不能删除未合并的分支。 要删的话 需要 -D

    git branch -D erwa: 不管分支合并了没,直接删除

    git checkout -b erwa4 : 创建,并切换到erwa4分支

    git merge erwa4: 将erwa4分支合并到当前分支

    git branch -v : 显示分支最近的修改信息

    git log --graph : 查看图形化的日志

    git commit -am '第三次提交' : 修改之后 add 并且 commit

    冲突时手动解决冲突

    分支进阶与版本回退

    分支进阶

    fast-forward :

    如果可能的话,合并分支时,Git会使用fast-forward模式

    在这种模式下,删除分支时,会丢掉分支信息

    合并时加上--no -ff 参数,会禁用fast-forward快照模式。这样会多出来一个commit ID

    如 : git merge --no -ff dev

    查看图形化的日志 git log -graph

    版本回退

    git reset --hard HEAD^ : 回退一个版本

    git reset --hard HEAD^^ : 回退两个版本

    git reset --hard HEAD~2 : 回退第二个提交

    git reset --hard commit_id : 回退到某个commit_id


    回到最新的提交怎么办呢?

    git reflog 查看操作日志。 然后再回退

    checkout进阶与stash操作

    checkout进阶

    vi操作:
    1.跳到文本的最后一行:按“G”,即“shift+g”
    2.跳到最后一行的最后一个字符 : 先重复1的操作即按“G”,之后按“$”键,即“shift+4”。
    3.跳到第一行的第一个字符:先按两次“g”,
    4.跳转到当前行的第一个字符:在当前行按“0”。

    git reset HEAD test.txt : 将添加到暂存区的内容从暂存区移除到工作区

    git checkout -- ... : 丢弃当前的工作空间当对于暂存取当中的最后一次的修改。

    git checkout master : 切换到master分支

    git checkout -b test : 创建,并切换到test分支

    git checkout 986d4a30a : 切换到当前分支的 某个log之前的状态。 游离状态

    git branch -m test dev : 将test分支 名字修改成 dev

    stash操作

    适用场景,在当前分支开发,需要切换到其余分支。保存当前分支的现场。恢复现场等

    git stash : 保存现场

    git stash list : 查看保存现场

    git stash apply :恢复现场( stash内容不删除,需要通过git satsh drop stash@{0} 手动删除)

    git stash apply stash@{0}:恢复某个现场

    git stash pop : 恢复现场(恢复的同时也将stash内容删除)

    标签与diff

    标签

    标签的基本使用和作用

    作用: 发布系统,或者到了一个历程碑时,给当前项目打一个版本标签

    标签有两种: 轻量级标签与带有附注的标签

    git tag v1.0 : 创建一个轻量级标签

    git tag -a v1.1 -m '注释' : 创建一个带有附注的标签

    git tag :查看当前分支的标签

    git tag -l '1.0' : 根据条件查找当前的分支

    git tag -d v1.0 : 删除标签

    diff

    diff 两个文件之间的差异性比较

    git blame test.txt : 查看此文件的修改不同

    diff a b : 比较a b 两个文件的不同 -- Unix自带的diff的使用

    diff -u a b : 更清楚的比较 a b

    git diff : 比较 暂存区 和工作区的区别 ; 暂存区作为原始文件。 工作区作为目标文件。

    git diff HEAD : 比较工作区与最新提交的差别

    git diff commit_id : 比较工作区与commit_id 那次的差别

    git diff --cached : 比较的是最新的提交与暂存区之间的差别

    远程与GitHub

    git config --list : 查看当前git的配置

    推送远程版本库:

    git remote add origin https://github.com/584tiegan/gitlecture.git
    git push -u origin master
    

    Git远程操作

    git remote show : 查看当前代码关联的远程仓库

    git remote show origin : 查看远程仓库的信息

    1. Gitflow 建议和参考。
    2. 基于Git分支的开发模型:
      • master -- 生产发布分支。变化非常不频繁的分支。
      • hotfix -- 热修分支。用于紧急修复的分支。
      • test -- 测试分支。 供测试和产品等人员使用的分支,变化不是特别频繁。
      • develop -- 开发分支,频繁变化的一个分支。
      • feature -- 开发者分支。针对于单个的功能点。

    使用SSH方式clone代码和push pull

    先获取本地SSH

    ➜ ~ cd .ssh
    ➜  .ssh ls
    known_hosts
    ➜  .ssh ssh-keygen -t rsa
    ➜ .ssh cat id_rsa.pub
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/SmZ8VvFLJIRurSXRaCsSeOgGN0bqKFt/3Qdk6MVqywHJEoYXlKdy4/NM/eMcgnNdpDnQkB5TbUyTppbVeMfuKz4RBH3bCw9oL44ZGm0bXB6hJU1kpnMMpSVriN+Ssv8GqBO/Vd4oK5vEywQV2e/cAvkqtC6Vb5Duf84Ho9n/U1IlcQVmbWw02TMzkzDwZqDbDoVWQBJ4sFRjq6lOFfZGFRtfXrBPnTkCibDlAjg0s0j7/FOcQupy4r4fbkXr+D4925ummuXD+E0F5+HIUWqddFhWgfMcs5T+JY+vh8D0Gbm7Q4g8A1DfAOwIWqFlBiFErQtgqNOGy14rv9g5IP2Z erwa@erwa.local
    

    之后再GitHub里配置一下SSH 就可以了

    image-20200118222048658

    Git协作

    Git协作的基本过程介绍:

    A人员push到远程仓库,B人员pull到本地仓库。AB进行了同步,可以进行同时开发。

    push代码前,要先pull代码。

    AB人员都有本地的版本库。也有一个公共的远程版本库。

    一个本地库可以对应多个远程仓库。

    git remote show : 查看远程仓库的信息

    git remote show origin : 查看某个具体的远程仓库的信息。

    ➜ mygit git:(master) git remote show origin
    Warning: Permanently added the RSA host key for IP address '140.82.114.3' to the list of known hosts.

    • remote origin
      Fetch URL: git@github.com:584tiegan/gitlecture.git
      Push URL: git@github.com:584tiegan/gitlecture.git
      HEAD branch: master
      Remote branch:
      master tracked
      Local branch configured for 'git pull':
      master merges with remote master
      Local ref configured for 'git push':
      master pushes to master (up to date)

    git branch -a : 查看本地所有的分支,包括远程分支。

    git branch -av: 查看所有分支的最后一次提交内容

    git checkout origin/master: 本地切换到远端master时,不会支持修改。

    git clone SSH地址/HTTPS地址: 克隆远程仓库的代码

    git clone SSH地址 mygit2 : 克隆代码,代码仓库的名字设置为mygit2

    git add 有三个作用:

    • 将文件纳入到缓存区
    • 将已经被工作区的文件纳入到缓存区
    • 如果一个文件产生了冲突,冲突解决后,调用一下git add 。表示冲突已经被解决了。

    vi操作:
    1.跳到文本的最后一行:按“G”,即“shift+g”
    2.跳到最后一行的最后一个字符 : 先重复1的操作即按“G”,之后按“$”键,即“shift+4”。
    3.跳到第一行的第一个字符:先按两次“g”,
    4.跳转到当前行的第一个字符:在当前行按“0”。

    :set number . 打开行号

    :4d 删除第四行

    dd 删除光标所在行

    git fetch : 只拉取代码,不merge

    git pull : git fetch + git merge

    git远程分支,别名,gitk与git gui

    一开始,千万不要直接使用gui 。 推荐使用git命令的方式来操作。更能深入了解Git

    在git仓库中: gitk : 打开gitk图形化界面。

    image-20200119180058313

    云梯。。。

    Git合并的原则

    Git合并遵循三方合并的原则

    Git redspec

    本地分支与远端分支的对应关系

    git 别名的操作:

    git config --global alias.br branch : br 代替 branch

    ​ st status

    ​ co checkout

    创建远端的分支:

    新分支推送远端时,直接 git push 不可以。 要使用 git push --set-upstream origin dev

    git push -u origin dev: 老版本的 推送本地的分支到远程、 推荐使用--set-upstream origin dev

    git push 的完整写法: git push origin dev:dev2 将dev的内容推送到远端的dev2的分支上

    删除远端的分支:

    • git push origin :dev 将一个空分支推到远端分支

    • git push origin --delete dev 删除远端的dev分支

    修改远端的分支名: 删除远端分支,重命名本地分支,推送本地分支。

    git remote show origin :查看本地和远程分支的关系

    git remote prune origin : 清楚本地没有的远端分支。

    1. git push 的完整写法: git push origin dev:dev2 将dev的内容推送到远端的dev2的分支上

    2. git pull 操作的完整命令: git pull origin dev:dev2 dev 是远端分支,dev2是本地分支

    3. HEAD标记: HEAD文件是一个指向你当前所在分支的引用标识符,该文件内部并不包含SHA-1值(commit_id),而是包含一个指向另外一个引用的指针。

    4. 当执行git commit 命令时,git 会创建一个commit 对象,并且将这个commit对象的parent对象设置为HEAD所指向的引用的SHA-1值。

    5. 我们对于HEAD修改的任何操作,都会被reflog完整的记录下来。

    6. 实际上,我们可以通过Git底层命令symbolic-ref来操作HEAD

    将标签推送到远端

    git show v1.0 : 查看本地的标签

    git tag -l '2' : 搜索

    git push origin v1.0 : 推送标签到远端

    git push origin v1.0 v2.0 : 推送两个标签到远端

    git push origin --tags : 推送全部标签到远端

    git push origin :refs/tags/v2.0 : 删除远端的某个标签

    git push origin --delete tag v2.0 : 删除远端的某个分支

    推送分支的完整语法: git push origin refs/tags/v2.0:refs/tags/v2.0

    git fetch origin tag v7.0 : 拉取某个标签

    git 远程分支的底层剖析

    在缺省情况下,refspec会被git remote add命令自动生成,git 会获取远端上refs/heads下的所有引用,并将它们写到本地的refs/remote/origin 目录下。所以,如果远端有一个master分支,你可以在本地通过下面几种方式来访问它们的历史记录:

    1. git log origin/master
    2. git log remotes/origin/master
    3. git log refs/remotes/origin/master

    fetch = +reds/heads/* :refs/remotes/origin/*

    ➜  .git git:(dev) cat config
    [core]
    	repositoryformatversion = 0
    	filemode = true
    	bare = false
    	logallrefupdates = true
    	ignorecase = true
    	precomposeunicode = true
    [remote "origin"]
    	url = git@github.com:584tiegan/gitlecture.git
    	fetch = +refs/heads/*:refs/remotes/origin/*
    [branch "master"]
    	remote = origin
    	merge = refs/heads/master
    [gui]
    	wmstate = normal
    	geometry = 854x447+744+398 181 201
    [branch "dev"]
    	remote = origin
    	merge = refs/heads/dev
    

    Git gc

    Git 的垃圾回收机制

    git gc

    ➜ .git git:(dev) cat packed-refs : 调用git gc 后,内容打包放在这里

    git mv hello.txt hello.txt : 可以当做是重命名的操作。

    git remote rename origin origin2 : 重命名远程仓库

    Git裸库与submodule

    Git裸库

    作用: 只有一个远程仓库,没有工作区。用来中转开发者的代码

    git init --bare 创建一个裸库

    submodule

    Git仓库里再包含一层Git仓库,便于远程调用。

    将一个Git仓库引用到另外一个Git仓库。git submodule add SSH地址 mymodule

    引用之后,被引用的仓库修改信息,本地的仓库git pull 便可得到最新的信息。

    git submodul foreach git pull : 一次性的更新本仓库所有的引用仓库

    git clone SSH地址 : 第二个人重新引用clone副项目,之后需要重新初始化submodule

    git clone SSH地址 --recurive :此方式克隆的项目,会把项目所有的引用都给下来下来。

    submodul 的删除步骤:

    1. git rm --cached mymodule
    2. rm -rf mymodule
    3. rm -rm .gitmodule
    4. git push

    Git subtree

    另外的一种仓库引用仓库,实现代码的双向传递

    git remote add origin SSH地址 : 本地仓库添加到远程仓库

    使用subtree地址引用:

    1. Git remote add subtree-origin SSH地址

    2. git subtree add --prefix==subtree subtree-origin master :

    (--squah)参数:--squah 参数 是否合并代码,并且作者也是当前的作者。作用:防止被引用的仓库的log污染当前的仓库。如果使用了,就一直使用。如果不使用,就一直不要使用。不然会冲突。

    git subtree pull --prefix==subtree subtree-origin master : 更新引用代码。

    git push 时,代码不会更新到被引用的仓库中。

    git subtree push --prefix==subtree subtree-origin master : 推送代码到被引用的仓库中。

    git subtree 深度剖析

    --squah 参数,如果使用了,就一直使用。如果不使用,就一直不要使用。不然会冲突。

    git subtree split : 分割git模块

    学习要沉下心来,不要浮躁。

    Git cherry-pick

    将本地分支的修改应用到另外的一个分支上

    git cherry-pick commit_id : 将此commit_id的改动应用到当前的分支

    出现冲突时,手动解决冲突。

    移动后,记得删除元分支上的不想要的commit记录。

    Git rebase

    变基,衍合 。修改分支的根基

    rebase的功能类似于merge

    区别: merge不会修改历史。rebase会修改分支提交的历史。

    git checkout test

    git rebase dev : 将test的修改打补丁到dev上

    rebase注意事项:

    1. rebase过程中也会出现冲突。解决冲突后执行 git rebase - - continue

    2. 任何时候都可以终止rebase。分支恢复到rebase之前的状态。 git rebase - - abort

    3. 不要对master分支执行rebase,否则会引起很多问题

    4. 一般来说,执行reabse的分支都是本地的分支,没有推送到远程版本库

    idea和gradle的使用

    1. 搭建基于gradle的项目

    2. gretty插件

    内置Tomcat

    3. Git、idea、gradle

    Gitlab

    Gitlab推荐安装在Unix上

    中小型公司不会自己买服务器,一般都放在云服务器就够用了

    阿里云ECS

    ssh root@地址

    课程回顾总结

    常用命令的使用

    Git分支的使用

    Linux常用命令

    Git缓存的功能

    Git的工作区,暂存区,提交区

    Git远程操作的使用

    Github的使用

    Git协作模型的使用

    Git分支使用策略介绍

    Git别名操作

    Git GUI使用

    pull push 的使用

    Git GC的介绍

    Git subtree 和 Git subModule的使用

    2020年01月20日17:31:26 结束学习。

    工作不止,学习不止,生活不止。现实世界的软件开发是复杂的,复杂性并不体现在具体的技术栈上。如Java,Spring,Docker,MySQL等等具体的技术是可以学习很快就熟练掌握的。软件真正复杂的部分,往往是业务本身,比如航空公司的超售策略,在超售之后Remove乘客的策略等;比如亚马逊的打折策略,物流策略等。

  • 相关阅读:
    2013上半年中国CRM市场分析报告
    windows运行命令大全
    JVM探索(二)
    JVM探索(一)
    1.数据结构和算法的基础笔记
    java程序性能优化
    http状态码
    mongodb清洗数据
    List的数据结构
    Foundation Data Structure
  • 原文地址:https://www.cnblogs.com/wobushitiegan/p/12199116.html
Copyright © 2011-2022 走看看