zoukankan      html  css  js  c++  java
  • Git 从入门到熟练|不敢说精通

    前言

    如果有一定版本管理软件基础或使用过 svn 的你,这篇 git 的文章应该是最适合你的。作者也是从 svn 过来,从开始的觉得 git 麻烦,到最后还是感觉 git 是最好用的版本控制软件。

    虽然,大部分情况下,IDEA 已经对 Git 兼容特别好;可以完成大部分的 Git 的提交,push ,合并等操作,但有时候一些回退的操作还是通过命令来操作会方便点。

    预期读者

    • 有一定软件版本管理基础的同学
    • 事先有了解过 git 的同学
    • 想系统学习 git 的同学

    文章思路

    本文不会像大多数文章一样,通篇给你介绍一堆的 git 命令。个人认为,这种命令的东西用多了自然记住了,没用到的时候记再多,用的时候一样忘,而且用的时候可以使用 git 的帮助或直接网上搜命令。

    文章从 git 的仓库,分支,常用 git 工具及 git 和 svn 的区别来说明

    git 版本库

    git 分为两个版本库,所有 git 信息都保存在 .git 隐藏文件夹中,大部分情况,我们会在本地维护自已的版本信息。

    • 一个是本地版本库,改动和提交的信息都是保存在本地的,默认会有一个 master 分支
    • 一个远程仓库,这是真正和别人协作的仓库,通过 push ,pull 等来和远程仓库提交获抓取数据

    常见的仓库命令

    # 初始化本地仓库,默认会初始化一个 master 分支 
    git init 
    # clone 一个远程仓库, 创建了一个本地仓库,一个本地仓库的 master 分支,拉取远程仓库 master 的内容 
    git clone address 
    # 初始化本地仓库后,添加一个远程仓库
    git remote add 仓库Id 仓库地址
    

    远程仓库的增删改查,通过在 git 控制台 git remote 双击 tab 即可看到所有操作,包含 rename,remove,set-url,add 等。

    官网示例-把代码添加到版本库

    创建本地版本库,然后添加远程版本库,然后把文件 commit 到本地,最后 push 到远程版本库

    # 在你的代码文件夹根目录中初始化本地版本库
    git init
    # 添加需要提交的文件
    git add .
    # 提交到本地仓库
    git commit -m "初始提交"
    # 添加远程仓库,并命仓库名为 test
    git add test git@gitee.com:sanri/test.git
    # 推送代码到远程版本库的 master 分支 
    git push test master 
    

    本地版本库(又叫工作区)

    工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库(Repository)。

    工作区,暂存区,版本库

    Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

    • git add 实际就是把文件添加进了暂存区
    • git commit 把暂存区的所有内容提交到了版本库

    Git 和 Svn 的区别

    Git跟踪并管理的是修改,而非文件,你每次修改工作区中的内容,都需重新添加到暂存区才能提交。

    Svn 是跟踪文件的,文件状态:untracked -> tracked -> commited

    Git 是跟踪修改的,只要文件有修改,就需添加到暂存区,然后提交

    撤销修改

    建议下载 sourceTree 来看这部分内容,比 git status 会更加清晰,它会明确的给你标出暂存区,工作区,本地仓库和远程仓库。

    • git add 添加到暂存区了,想撤回

      git reset HEAD file 不加 file 表示全部撤回,只是撤回添加,不会影响工作区文件

    • git commit 添加到版本库了,想撤回

      git reset --soft HEAD^ ^ 表示撤回一次提交,关于有几次提交,在 IDEA 中可以看得更清楚

      这个撤回撤回到了暂存区,也不会影响工作区文件。

    • 再使用 git checkout -- file 可以把工作区的文件还原成暂存区的或版本库中的文件

      1. 如果暂存区有此文件,使用暂存区的版本替换工作区文件,与 git reset HEAD file 区别是,git reset 不会影响工作区的文件,但 git checkout -- 会替换工作区的文件。
      2. 如果暂存区没有此文件,但版本库中有,则使用版本库文件替换工作区文件
    总结
    • 如果当前工作区改乱了,还没添加到暂存区;可以使用 git checkout -- file 来还原。

    • 如果改乱的代码添加到了暂存区,还没提交; 先撤回暂存区文件,然后使用 git checkout -- file 还原来版本库版本

      git reset HEAD file git checkout -- file

    • 如果改乱的代码已经提交,还没有推送到远程库 ;先查看需要的 commitId ,然后git checkout commitId file

    git 分支管理

    本地仓库和远程仓库都会有分支,一般来说是一一对应的,创建仓库时会默认初始化一个 master 分支。

    真实项目如何建立分支

    建立仓库时,会有一个默认分支master 分支,现已经基本约定这个分支是可以随时发布的分支。

    最佳分支管理实践

    个人理解 :

    • master 分支,用于发布可用版本 *
    • develop 分支,用于开发目前的需求 *
    • test 分支,即上面链接中说的的 release 分支,用于测试和修改 bug 。从 develop 分支创建,上线时合并进 master 和 develop 并删除,改 bug 后合并进 develop 分支
    • hotfix 分支,从 master 分支创建,用于修改线上 bug ,然后合并回 master 和 develop

    解决冲突

    当拉取远程代码的时候,如果你和别人改的是同一个文件,则很有可能出现冲突,展示如下

    $ git merge feature1
    Auto-merging readme.txt
    CONFLICT (content): Merge conflict in readme.txt
    Automatic merge failed; fix conflicts and then commit the result.
    

    查看 readme.txt 的内容

    Git is a distributed version control system.
    Git is free software distributed under the GPL.
    Git has a mutable index called stage.
    Git tracks changes of files.
    <<<<<<< HEAD
    Creating a new branch is quick & simple.
    =======
    Creating a new branch is quick AND simple.
    >>>>>>> feature1
    

    <<<<<<< HEAD 表示远程的内容,>>>>>>> feature1 表示你的分支的内容,中间用 ======== 分隔,有几个这样的区志就是有几个冲突,使用 compare 可 idea 工具解决冲突后,然后重新添加,提交,推送。

    常用 Git 工具及下载地址

    SourceTree 工具

    Git 工具

    SourceTree 的安装

    在需要注册的时候,关闭安装,然后找到 %LOCALAPPDATA%AtlassianSourceTree 添加文件 accounts.json 内容如下:

    [
      {
        "$id": "1",
        "$type": "SourceTree.Api.Host.Identity.Model.IdentityAccount, SourceTree.Api.Host.Identity",
        "Authenticate": true,
        "HostInstance": {
          "$id": "2",
          "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountInstance, SourceTree.Host.AtlassianAccount",
          "Host": {
            "$id": "3",
            "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountHost, SourceTree.Host.AtlassianAccount",
            "Id": "atlassian account"
          },
          "BaseUrl": "https://id.atlassian.com/"
        },
        "Credentials": {
          "$id": "4",
          "$type": "SourceTree.Model.BasicAuthCredentials, SourceTree.Api.Account",
          "Username": "",
          "Email": null
        },
        "IsDefault": false
      }
    ]
    

    常见问题解决

    忽略特殊文件

    .git 目录添加一个文件 .gitignore 每一行是忽略的文件,可以使用能配符,目录。

    被 github 标记为 javascript 标签的问题

    可能你的项目中 js 脚本比较多,被 github 自动判断为 javascript 项目了,可以强制改回来,git 目录添加一个文件 .gitattributes 内容为

    *.js linguist-language=Java
    

    ssl 证书错误,或一直需要用户名密码

    fatal:unable to access ': SSL certicate problem: unable to get local issuer certificate

    解决办法,两种:

    1. 使用 ssh 模式 ,配置免登录,参考我的免登录配置文章 https://blog.csdn.net/sanri1993/article/details/52203010

    2. 配置全局用户名密码和跳过 ssl 认证

      # 跳过 ssl 认证
      git config --global http.sslVerify false
      # 存储用户名密码认证信息,不需要每次都输入用户名密码
      git config --global credential.helper store
      

    常用命令

    # 初始化本地仓库,默认会初始化一个 master 分支 
    git init 
    # clone 一个远程仓库, 创建了一个本地仓库,一个本地仓库的 master 分支,拉取远程仓库 master 的内容 
    git clone address 
    # 初始化本地仓库后,添加一个远程仓库
    git remote add 仓库Id 仓库地址
    
    # 创建分支
    git branch 分支名
    # 合并分支到当前分支
    git merge 分支名
    # 切换分支
    git checkout 分支名
    
    # 版本还原相关
    git reset --mixed # 此为默认方式,不带任何参数的git reset,它 回退 commit 和 add 信息
    git reset --soft # 回退到某个版本,只回退了commit的信息。如果还要提交,直接commit即可
    git reset  --hard # 彻底回退到某个版本,本地的源码也会变为上一个版本的内容,慎用!
    # stage -> workspace                         
    	git reset HEAD <files>                 
    # repository -> stage                        
    	git reset --soft <hash>
        git reset --soft HEAD^
        git reset --soft HEAD~2
    # repository -> workspace                    
    	git reset --mixed <hash>
    # workspace 重置为 repository 内容          
    	git reset --hard <hash>                
    
    # 使某个文件使用上次的内容
    git checkout -- file 
    # 使某个文件使用某个版本的内容
    git checkout commitId file 
    

    一点小推广

    创作不易,希望可以支持下我的开源软件,及我的小工具,欢迎来 gitee 点星,fork ,提 bug 。

    Excel 通用导入导出,支持 Excel 公式
    博客地址:https://blog.csdn.net/sanri1993/article/details/100601578
    gitee:https://gitee.com/sanri/sanri-excel-poi

    使用模板代码 ,从数据库生成代码 ,及一些项目中经常可以用到的小工具
    博客地址:https://blog.csdn.net/sanri1993/article/details/98664034
    gitee:https://gitee.com/sanri/sanri-tools-maven

  • 相关阅读:
    Keil MDK5 硬件仿真之查看变量的值(内附变量值不随程序的运行而刷新的解决办法)
    15 Q点稳定的放大电路和基本共集放大电路
    13 H参数等效模型
    12 放大电路的分析方法
    文件处理
    基本数据类型及内置方法
    for循环及字符串操作
    while循环
    用户交互、运算符
    变量与基本数据类型
  • 原文地址:https://www.cnblogs.com/sanri1993/p/11552252.html
Copyright © 2011-2022 走看看