前言

如果有一定版本管理软件基础或使用过 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%\Atlassian\SourceTree 添加文件 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

Git 从入门到熟练|不敢说精通的更多相关文章

  1. Git从入门到熟练

    Git的特性 1. 分布式版本控制 集中式VS分布式 保存更新时的文件快照而非差异 (快照 :是文件系统中的概念或者技术:来自照相领域的概念,是指特定时间点的一个状态) 其他系统在每个版本中记录着各个 ...

  2. GIT 从入门到放弃大整理

    跟着廖雪峰学 GIT  http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 GUI f ...

  3. 第三章 Git的入门 - 读书笔记

    Android驱动月考3 第三章 Git的入门 - 读书笔记 对于Github,这是全世界最大的开源平台,你可以把你做的项目在这里开源,把你发现的一些新技术在这里开源,向全世界的开发者们分享,大家都彼 ...

  4. git简单入门

    git简单入门 标签(空格分隔): git git是作为程序员必备的技能.在这里就不去介绍版本控制和git产生的历史了. 首先看看常用的git命令: git init git add git comm ...

  5. Android系统移植与驱动开发--第三章 Git使用入门及在学习中有感

    第三章 Git使用入门 使用Git的目的是减少各种版本的Linux的压缩大小,提供源代码在Linux上进行编译. 在这一个章节中,其实就是关键步骤的操作,虽然Git与我们学习的android没有很大的 ...

  6. 让 Python 带你进入开源的世界——Git 从入门到与他人协作开发

    让 Python 带你进入开源的世界--Git 从入门到与他人协作开发 我认为开源社区中有很多优秀的资源,并且可以帮助进阶中的程序员提高编程能力和水平.所以,我发起了<HelloGitHub&g ...

  7. Git快速入门进阶篇

    本文接着Git快速入门篇,继续探讨Git在管理项目中的一些应用. 远程仓库的使用 查看远程仓库 查看你已经配置的远程仓库服务器,可以运行 git remote 命令.指定选项 -v,会显示需要读写远程 ...

  8. git快速入门 push/clone/reset/merge/切换分支全都有

    本文介绍git快速入门,从安装/创建init / 发布push/版本回退reset / branch分支切换/合并分支merge 这些基本的操作都有涉及,方便新人快速入手,有需要的朋友mark一下.首 ...

  9. Git 快速入门--Git 基础

    Git 快速入门 Git 基础 那么,简单地说,Git 究竟是怎样的一个系统呢? 请注意接下来的内容非常重要,若你理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余. 在开始学习 G ...

随机推荐

  1. 剑指offer总结一:字符、数字重复问题

    问题1:字符串中第一个不重复的字符 题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是" ...

  2. windows安装nginx、mysql等软件并加入系统服务启动详细

    windows类系统安装nginx.mysql软件 (PS:windows系统环境中设置完nginx.mysql环境变量,需要重新启动系统才会生效.) 一.NGINX:首先下载windows版ngin ...

  3. Code signing is required for product type 'Unit Test Bundle' in SDK 'iOS 11.0.1'

    Code signing is required for product type 'Unit Test Bundle' in SDK 'iOS 11.0.1' 进入 projects and lis ...

  4. 多线程之NSThread

    关于多线程会有一系列如下:多线程之概念解析 多线程之pthread, NSThread, NSOperation, GCD 多线程之NSThread 多线程之NSOperation 多线程之GCD一, ...

  5. python+unittest框架第四天unittest之批量执行案例

    今天开始批量执行用例~,场景是这样的: 工作中我们可能有多个模块文件(.py)这些文件根据不同的业务类型或功能,测试案例分布在不同的模块文件下.前面的小示例中,我们的测试用例都是在一个文件中,直接运行 ...

  6. 使用VS Code 开发.NET CORE 程序指南

    1. 前言 近两年来,很多前端的同学都开始将 VSCode 作为前端主力开发工具,其丰富的扩展给程序开发尤其是前端开发带来了很多便利,但是作为微软主力语言的 .NET,却由于有宇宙第一编辑器 Visu ...

  7. HDU 1079

    题意略. 思路:dfs记忆化搜索即可. #include<bits/stdc++.h> using namespace std; ][][]; ][]; bool is_leap(int ...

  8. 原生js之Ajax

    1.什么是Ajax? 全称:Asynchronous JavaScript and XML  (异步的 JavaScript和 xml),是前后端数据交互的一种技术(前端通过 Ajax 发送http请 ...

  9. 搭建Spark高可用集群

      Spark简介 官网地址:http://spark.apache.org/ Apache Spark™是用于大规模数据处理的统一分析引擎. 从右侧最后一条新闻看,Spark也用于AI人工智能 sp ...

  10. mybatis 源码分析(八)ResultSetHandler 详解

    本篇博客就是 myabtis 系列的最后一篇了,还剩 ResultSetHandler 没有分析:作为整个 mybatis 最复杂最繁琐的部分,我不打算按步骤一次详解,因为里面的主要内容就是围绕 re ...