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
可以把工作区的文件还原成暂存区的或版本库中的文件- 如果暂存区有此文件,使用暂存区的版本替换工作区文件,与
git reset HEAD file
区别是,git reset
不会影响工作区的文件,但git checkout --
会替换工作区的文件。 - 如果暂存区没有此文件,但版本库中有,则使用版本库文件替换工作区文件
- 如果暂存区有此文件,使用暂存区的版本替换工作区文件,与
总结
如果当前工作区改乱了,还没添加到暂存区;可以使用
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 的安装
在需要注册的时候,关闭安装,然后找到 %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
解决办法,两种:
使用 ssh 模式 ,配置免登录,参考我的免登录配置文章 https://blog.csdn.net/sanri1993/article/details/52203010
配置全局用户名密码和跳过 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 从入门到熟练|不敢说精通的更多相关文章
- Git从入门到熟练
Git的特性 1. 分布式版本控制 集中式VS分布式 保存更新时的文件快照而非差异 (快照 :是文件系统中的概念或者技术:来自照相领域的概念,是指特定时间点的一个状态) 其他系统在每个版本中记录着各个 ...
- GIT 从入门到放弃大整理
跟着廖雪峰学 GIT http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 GUI f ...
- 第三章 Git的入门 - 读书笔记
Android驱动月考3 第三章 Git的入门 - 读书笔记 对于Github,这是全世界最大的开源平台,你可以把你做的项目在这里开源,把你发现的一些新技术在这里开源,向全世界的开发者们分享,大家都彼 ...
- git简单入门
git简单入门 标签(空格分隔): git git是作为程序员必备的技能.在这里就不去介绍版本控制和git产生的历史了. 首先看看常用的git命令: git init git add git comm ...
- Android系统移植与驱动开发--第三章 Git使用入门及在学习中有感
第三章 Git使用入门 使用Git的目的是减少各种版本的Linux的压缩大小,提供源代码在Linux上进行编译. 在这一个章节中,其实就是关键步骤的操作,虽然Git与我们学习的android没有很大的 ...
- 让 Python 带你进入开源的世界——Git 从入门到与他人协作开发
让 Python 带你进入开源的世界--Git 从入门到与他人协作开发 我认为开源社区中有很多优秀的资源,并且可以帮助进阶中的程序员提高编程能力和水平.所以,我发起了<HelloGitHub&g ...
- Git快速入门进阶篇
本文接着Git快速入门篇,继续探讨Git在管理项目中的一些应用. 远程仓库的使用 查看远程仓库 查看你已经配置的远程仓库服务器,可以运行 git remote 命令.指定选项 -v,会显示需要读写远程 ...
- git快速入门 push/clone/reset/merge/切换分支全都有
本文介绍git快速入门,从安装/创建init / 发布push/版本回退reset / branch分支切换/合并分支merge 这些基本的操作都有涉及,方便新人快速入手,有需要的朋友mark一下.首 ...
- Git 快速入门--Git 基础
Git 快速入门 Git 基础 那么,简单地说,Git 究竟是怎样的一个系统呢? 请注意接下来的内容非常重要,若你理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余. 在开始学习 G ...
随机推荐
- Javarscipt中数组或者字符串的随机排序方法
在日常开发中,经常会遇到随机排序的需求,思路就是利用Math.random()方法,抽取随机数,让数组中的元素进行对调: 话不多说直接上代码,方法一:基本思路就是将a中随机抽取一个元素,放入b中,再从 ...
- html5新特性-header,nav,footer,aside,article,section等各元素的详解
Html5新增了27个元素,废弃了16个元素,根据现有的标准规范,把HTML5的元素按优先级定义为结构性属性.级块性元素.行内语义性元素和交互性元素四大类. 下面是对各标签的详解,section.he ...
- Linux任务调度(8)
crond任务调度: 是指系统在某个时间执行特定的命令或程序. 分类:1.系统工作,有些重要的工作必须周而复始地执行,如病毒扫描等:2.个别用户工作,个别用户可能希望执行某些程序,如mysql数据库备 ...
- Flutter学习笔记(23)--多个子元素的布局Widget(Rwo、Column、Stack、IndexedStack、Table、Wrap)
如需转载,请注明出处:Flutter学习笔记(23)--多个子元素的布局Widget(Rwo.Column.Stack.IndexedStack.Table.Wrap) 上一篇梳理了拥有单个子元素布局 ...
- java两个对象属性比较
两个对象进行比较相等,有两种做法: 1,情况一:当仅仅只是判断两个对象是否相等时,只需重写equals()方法即可.这里就不用说明 2.情况二:当除了情况一之外,还需知道是那个属性不同,那么就需要采用 ...
- .NetCore从零开始使用Skywalking分布式追踪系统
本文将从0开妈搭建两个webapi项目,使用Skywalking来追踪他们之间的调用关系及响应时间.开发环境为VisualStudio2019 1:安装Skywalking,可参考:https://w ...
- ECMAScript---数字类型详解
number数字类详解 整数.小数.负数.NaN都是number数字类型的 NaN:not a number ,但是它是数字类型的 isNaN:检测当前值是否 不是有效数字,返回true代表不是有效数 ...
- centos6在安装wdcp以后,导入MySQLdb报错问题
为了方便linux的使用,会先安装好wdcp对服务器进行管理.在装好wdcp会对一些nginx,mysql等自动安装,但是mysql的安装目录会在/www/wdlinux这个目录下,跟一般的mysql ...
- leetcode8 String to Integer
题目描述 Implement atoi which converts a string to an integer. The function first discards as many white ...
- ElasticSearch专栏
1.es的分布式架构原理(es是如何实现分布式)? elasticsearch设计的理念就是分布式搜索引擎,底层其实还是基于lucene的.核心思想就是在多台机器上启动多个es进程实例,组成了一个es ...