前言:
不知道大家有没有使用git提交代码或者拉取代码的经历,自从上一家公司实习结束以后,对git的使用历历在目,从一开始的add、commit到后来的pull都有着许多的疑惑。
自从有一次merge代码以后,被师兄批了一顿以后(不小心把师兄写的代码给覆盖了!!尴尬),我下定决心要搞明白git的基本原理以及使用方法!!!!!
git的安装:
git的安装尽量到官网去安装(毕竟是免费的),当然如果有网盘安装地址也可。
官方安装地址:https://git-scm.com/
根据电脑的系统选择安装的方式:
注:安装路径尽量是英文的安装路径。
安装完成后,如果在桌面右键,菜单里面出现了如下选项:
证明安装成功!!!
注册身份:
由于git是用来适应多人协作工作时的需求,所以每个人提交代码时需要有身份的说明,所以当安装好git以后就需要注册或者说设置使用者的身份,这里我使用
命令框进行身份的设置:
代码如下:
git config --global user.name 你的用户名
git config --global user.email 你的邮箱地址
kong'jian'shuo'm注意:后面你的用户名和邮箱号必须要用 " " 引起来(否则就会报bash: $'\302\226git': command not found错误)
空间说明:
在搞懂git所有使用命令之前首先要了解git的所有存储空间,都有什么作用。
Workspace:工作区(数据存储在缓存中)
Index / Stage:暂存区(数据存储在内存中)
Repository:仓库区(或本地仓库)(数据存储在硬盘中)
Remote:远程仓库(数据存储在远程仓库中)
上述的四个区域对所有命令指令的理解非常重要,需要理解+记忆。
git的使用步骤:
了解了区域以后就可以展开对git使用的理解了。我将从以下几点对git的操作展开:
一:提交文件信息(本地——>远程):
1.git init 初始化git(将指定的文件夹交给git进行管理)
2.git add 将文件添加进暂存区
3.git commit 将文件提交到本地仓库
4.git push 将文件提交到远程仓库
二:拉取远程仓库中的文件信息(远程——>本地):
1.git pull 拉取远程代码
git Init初始化git:
如果此时创建一个普通的文件夹:
里面假设有一个文本文件:
那么我想要把这个文件推送到我的gitee仓库进行管理,我应该怎么做?
首先就是要将这个文件交给git进行管理,此时可以在这个文件中打开git控制台:
之后如果想要将该文件夹创建为git的版本库,也就是交给git进行管理的话,使用:
git init 命令
之后文件夹中会多出一个隐藏文件夹:
如果没有找到的话需要从这里进行勾选"隐藏项目":
如果出现了那证明第一步就完成了,将该文件夹交给git管理成功。
本地——>远程
git add:
add指令是将文件信息放入暂存区,也就是暂存区(内存中),完整代码如下:
git add [选项] [文件路径]
-h , --help | 显示帮助信息 |
-v , --verbose | 显示详细输出,显示每个文件的处理过程 |
-f , --force | 强制添加,即使文件被忽略也会添加 |
-u , --update | 仅添加已跟踪文件的修改,不添加新文件 |
-A , --all | 添加所有文件(包括新文件、修改文件、删除文件) |
--ignore-removal | 忽略删除操作,只添加修改和新文件 |
--patch , -p | 交互式添加,逐块选择要添加的代码变更 |
--intent-to-add | 标记文件为 “待添加”,不实际添加内容,用于后续提交 |
-i , --interactive | 交互式模式,分步选择要添加的文件和变更 |
git add . # 添加当前目录下的所有文件 git add * # 添加当前目录下的所有文件(与 . 类似,但不包含隐藏文件) git add --all # 等价于 git add .,但更明确
一般用的最多的就是add .(适用于大多是程序员)
git commit:
将需要上传的文件信息放入缓存区以后,就需要将缓存区的文件进行整理放入本地仓库中为接下来的往远程仓库提交做准备。
当然有人问了为什么要设计这样一个过程,我直接add完之后,直接把文件信息提交到远程仓库不香吗~
设计git的大佬这样设计肯定有道理滴,如果此时一个文件同时被A,B,C三人改写,B提交了,那么A和C提交的时候会不会就把B的给覆盖了?
答案是肯定会的,那么为了防止出现上述的情况,此时就设计了一个解决冲突的过程,这个后面再说~ (后续在git pull操作会说)
完整代码如下:
git commit [选项] [-m "提交信息"] [文件路径]
选项 | 描述 |
---|---|
-m , --message "信息" | 直接指定提交信息 |
-a , --all | 提交所有已跟踪文件的修改(等价于先 git add -u 再提交) |
-s , --signoff | 在提交信息末尾添加 Signed-off-by 签名 |
-c , --amend | 修改最后一次提交(用于修正提交信息或添加遗漏的变更) |
-v , --verbose | 在提交信息中显示文件差异 |
-F , --file <文件> | 从文件中读取提交信息 |
--no-verify | 跳过提交验证钩子(如代码规范检查) |
--dry-run | 模拟提交,不实际执行 |
-i , --interactive | 交互式选择要提交的代码块 |
-S , --gpg-sign | 使用 GPG 签名提交(需配置 GPG 密钥) |
大多数程序员会用到的操作:
git commit -m "初始化项目结构" # 提交暂存区所有文件并添加信息
git commit src/index.js -m "修改首页布局" # 仅提交指定文件
如果执行上述操作以后就相当于把文件信息放在.git文件中的版本库中了(放在硬盘中) ,当然。git文件中的版本库和普通文件夹是有区别的。
版本库可以记录每一次提交的版本,每次commit的数据内容会被永久的记录在磁盘中方便后续查看历史提交记录。
git的好处是在每次提交时,会保存提交信息的快照内容(完整的副本信息)。每次commit时会通过哈希算法创建一个唯一id,之后将创建一棵git数,如下:
那么有一个问题,在多人合作时,如果上一个人已经push代码,此时我commit时发生了冲突,git是如何发现我commit的内容与其他人的内容是冲突的?(留在后续解答)
git push:
如果完成了上述的操作之后,接下来就需要进行最后一步就可以将信息资源上传到远程仓库了,需要git push操作。
git push 会将上述commit的所有本地仓库中未推送至远程仓库的信息全部推送上去。
具体语法如下:
git push [远程仓库名] [本地分支名]:[远程分支名]
远程——>本地
上述的操作都是如何将信息一步步的推送至远程仓库中。接下来的操作是如何将远程仓库中的信息拉取到本地。
git clone:
如何我们在浏览git hub时,发现有博主研究出新的插件玩法,我们想要拉取博主的源码研究研究,此时可以使用git clone命令拉取。(以网址的方式拉取)
除了以网址的方式拉取以外,还可以以SSH密钥的解密的方式拉取
当然想要将源码获取到的方式也有很多,git clone是方法之一。也可以直接将资源信息下载下来使用。
git pull:
如果之前就已经拉取过代码,此时如果你以后拉过一次代码后可以直接在idea中进行拉取仓库最新代码。
语法如下:
git pull [远程仓库名] [远程分支名]:[本地分支名]
原理分解:
git pull 命令实则是两个命令的合体:
- git fetch:从远程仓库下载所有提交和文件更新。
- git merge:将下载的更新合并到当前本地分支。
所以在没有进行commit,如果直接pull代码的话会出现问题,就是会自动将远程代码与当前本地分支的代码进行合并,有可能会直接覆盖当前自己写的代码。
注意:
如果此时直接进行pull代码,pull过来的代码会直接与当前
如果此时将拉取的代码已经修改过一部分以后,想要pull一下仓库中的最新代码,此时需要做的是先要将所写的代码commit到本地仓库,之后进行pull。