Bash – CMD – GUI 区别
◼
Bash
,
Unix shell
的一种,
Linux
与
Mac OS X
都将它作为默认
shell
。
- Git Bash 就是一个 shell,是 Windows 下的命令行工具,可以执行 Linux 命令;
- Git Bash 是基于 CMD 的,在 CMD 的基础上增添一些新的命令与功能;
- 所以建议在使用的时候,用 Bash 更加方便;
◼
Git CMD
- 命令行提示符(CMD)是 Windows 操作系统上的命令行解释程序;
- 当你在 Windows 上安装 git 并且习惯使用命令行时,可以使用 cmd 来运行 git 命令;
◼
Git GUI
- 基本上针对那些不喜欢黑屏(即命令行)编码的人;
- 它提供了一个图形用户界面来运行 git 命令;
◼
Git
自带一个
git config
的工具来帮助设置控制
Git
外观和行为的配置变量:
/etc/gitconfig
文件
:包含系统上每一个用户及他们仓库的通用配置
- 如果在执行 git config 时带上 --system 选项,那么它就会读写该文件中的配置变量;
- 由于它是系统配置文件,因此你需要管理员或超级用户权限来修改它。(开发中通常不修改)
~/.gitconfig
或
C/
用户
/coderwhy/.gitconfig
文件
:只针对当前用户
- 你可以传递 --global 选项让 Git 读写此文件,这会对你系统上 所有 的仓库生效;
当前使用仓库的
Git
目录中的
config
文件(即
.git/config
)
:针对该仓库
- 你可以传递 --local 选项让 Git 强制读写此文件,虽然默认情况下用的就是它;
◼
安装Git后,
要做的第一件事就是设置你的用户名和邮件地址。
- 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改;
- 如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息;
◼ 检测当前的配置信息:git config --list
◼
Git 并不会在你输入部分命令时自动推断出你想要的命令:
- 如果不想每次都输入完整的 Git 命令,可以通过 git config 文件来轻松地为每一个命令设置一个别名。
获取Git仓库 – git init/git clone
◼
我们需要一个Git来管理源代码,那么我们本地也需要有一个Git仓库。
◼
通常有两种获取 Git 项目仓库的方式:
- 方式一:初始化一个Git仓库,并且可以将当前项目的文件都添加到Git仓库中(目前很多的脚手架在创建项目时都会默认创建一个Git仓库);
- 方式二:从其它服务器 克隆(clone) 一个已存在的 Git 仓库(第一天到公司通常我们需要做这个操作);
◼
方式一:初始化Git仓库
- 该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的核心;
- 但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪;
◼
方式二:从Git远程仓库
- 获取Git仓库 – git init/git clone
◼
现在我们的电脑上已经有一个Git仓库:
- 在实际开发中,你需要将某些文件交由这个Git仓库来管理;
- 并且我们之后会修改文件的内容,当达成某一个目标时,想要记录下来这次操作,就会将它提交到仓库中;
◼
那么我们需要对文件来划分不同的状态,以确定这个文件是否已经归于Git仓库的管理:
- 未跟踪:默认情况下,Git仓库下的文件也没有添加到Git仓库管理中,我们需要通过add命令来操作;
- 已跟踪:添加到Git仓库管理的文件处于已跟踪状态,Git可以对其进行各种跟踪管理;
◼
已跟踪的文件又可以进行细分状态划分:
- staged:暂缓区中的文件状态;
- Unmodified:commit命令,可以将staged中文件提交到Git仓库
- Modified:修改了某个文件后,会处于Modified状态;
◼
在工作时,你可以选择性地将这些修改过的文件放入暂存区;
Git操作流程图
检测文件的状态 - git status
◼
我们在有Git仓库的目录下新建一个文件,查看文件的状态:
◼
Untracked files:未跟踪的文件
- 未跟踪的文件意味着 Git 在之前的提交中没有这些文件;
- Git 不会自动将之纳入跟踪范围,除非你明明白白地告诉它“我需要跟踪该文件”;
◼ 我们也可以查看更加简洁的状态信息:
git status –s
git status --short
文件添加到暂存区 – git add
◼
跟踪新文件命令:
- 使用命令 git add 开始跟踪一个文件。
◼
跟踪修改的文件命令:
- 如果我们已经跟踪了某一个文件,这个时候修改了文件也需要重新添加到暂存区中;
◼
通过
git add .
将所有的文件添加到暂存区中:
- git add aaa.js
- git add .
git忽略文件
◼
一般我们总会有些文件无需纳入
Git
的管理,也不希望它们总出现在
未跟踪文件列表。
- 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等;
- 我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件的模式;
◼
在实际开发中,这个文件通常不需要手动创建,在必须的时候添加自
己的忽略内容即可;
◼
比如右侧是创建的Vue项目自动创建的忽略文件:
- 包括一些不需要提交的文件、文件夹;
- 包括本地环境变量文件;
- 包括一些日志文件;
- 包括一些编辑器自动生成的文件;
文件更新提交 – git commit
◼
现在的暂存区已经准备就绪,可以提交了。
- 每次准备提交前,先用 git status 看下,你所需要的文件是不是都已暂存起来了;
- 再运行提交命令 git commit;
- 可以在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行;
◼
如果我们修改文件的add操作,加上commit的操作有点繁琐,那么可以将两个命令结合来使用:
查看提交的历史 – git log
◼
在提交了若干更新,又或者克隆了某个项目之后,有时候我们想要查看一下所有的历史提交记录。
◼
这个时候我们可以使用
git log
命令:
- 不传入任何参数的默认情况下,git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面;
- 这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明;
◼ git reflog可以查看历史回退版本操作
版本回退 – git reset
◼
如果想要进行版本回退,我们需要先知道目前处于哪一个版本:Git通过HEAD指针记录当前版本。
- HEAD 是当前分支引用的指针,它总是指向该分支上的最后一次提交;
- 理解 HEAD 的最简方式,就是将它看做 该分支上的最后一次提交 的快照;
◼
我们可以通过HEAD来改变Git目前的版本指向:
- 上一个版本就是HEAD^,上上一个版本就是HEAD^^;
- 如果是上1000个版本,我们可以使用HEAD~1000;
- 我们可以可以指定某一个commit id;
git reset --hard HEAD^
git reset --hard HEAD~1000
git reset --hard 2d44982
远程仓库的验证
◼
常见的远程仓库有哪些呢?目前比较流行使用的是三种:
- GitHub:https://github.com/
- Gitee:https://gitee.com/
- 自己搭建Gitlab
◼
目前Git服务器验证手段主要有两种:
- 方式一:基于HTTP的凭证存储(Credential Storage);
- 方式二:基于SSH的密钥;
◼
因为本身HTTP协议是无状态的连接,所以每一个连接都需要用户名和密码:
- 如果每次都这样操作,那么会非常麻烦;
- 幸运的是,Git 拥有一个凭证系统来处理这个事情;
◼
下面有一些
Git Crediential
的选项:
- 选项一:默认所有都不缓存。 每一次连接都会询问你的用户名和密码;
- 选项二:“cache” 模式会将凭证存放在内存中一段时间。 密码永远不会被存储在磁盘中,并且在15分钟后从内存中清除;
- 选项三:“store” 模式会将凭证用明文的形式存放在磁盘中,并且永不过期;
- 选项四:如果你使用的是 Mac,Git 还有一种 “osxkeychain” 模式,它会将凭证缓存到你系统用户的钥匙串中(加密的);
- 选项五:如果你使用的是 Windows,你可以安装一个叫做 “Git Credential Manager for Windows” 的辅助工具;
◼
Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。
◼
SSH以非对称加密实现身份验证。
- 例如其中一种方法是使用自动生成的公钥-私钥对来简单地加密网络连接,随后使用密码认证进行登录;
- 另一种方法是人工生成一对公钥和私钥,通过生成的密钥进行认证,这样就可以在不输入密码的情况下登录;
- 公钥需要放在待访问的电脑之中,而对应的私钥需要由用户自行保管;
◼
如果我们以SSH的方式访问Git仓库,那么就需要生产对应的公钥和私钥:
远程仓库的验证 – SSH密钥
- ssh-keygen -t ed25519 -C “your email"
管理远程服务器
◼
查看远程地址:比如我们之前从GitHub上clone下来的代码,它就是有自己的远程仓库的:
-v是—verbose的缩写(冗长的)
◼
添加远程地址:我们也可以继续添加远程服务器(让本地的仓库和远程服务器仓库建立连接):
git remote add <shortname> <url>
git remote add gitlab http://152.136.185.210:7888/coderwhy/gitremotedemo.git
◼ 重命名远程地址:
git remote rename gitlab glab
◼ 移除远程地址:
git remote remove gitlab
本地分支的上游分支(跟踪分支)
◼
问题一:当前分支没有track的分支
◼
原因:当前分支没有和远程的origin/master分支进行跟踪
在没有跟踪的情况下,我们直接执行pull操作的时候必须指定从哪一个远程仓库中的哪一个分支中获取内容;
◼
如果我们想要直接执行git fetch是有一个前提的:必须给当前分支设置一个跟踪分支:
拒绝合并不相干的历史
◼
问题二:合并远程分支时,拒绝合并不相干的历史
◼
原因:我们将两个不相干的分支进行了合并:
简单来说就是:过去git merge允许将两个没有共同基础的分支进行合并,这导致了一个后果:新创建的项目可能被一个毫不 怀疑的维护者合并了很多没有必要的历史,到一个已经存在的项目中,目前这个命令已经被纠正,但是我们依然可以通过
--
allow-unrelated-histories
选项来逃逸这个限制,来合并两个独立的项目;
远程仓库的交互
◼
从远程仓库clone代码:
将存储库克隆到新创建的目录中;
git clone http://152.136.185.210:7888/coderwhy/gitremotedemo.git
◼
将代码push到远程仓库:将本地仓库的代码推送到远程仓库中;
默认情况下是将当前分支(比如master)push到origin远程仓库的;
git push
git push origin master
◼
从远程仓库fetch代码:从远程仓库获取最新的代码
默认情况下是从origin中获取代码;
git fetch
git fetch origin
获取到代码后默认并没有合并到本地仓库,我们需要通过merge来合并;
git merge
git merge origin/master
◼
从远程仓库pull代码:上面的两次操作有点繁琐,我们可以通过一个命令来操作
远程仓库的交互
git pull
git fetch + git merge(rebase)
总结
情况一:已有远程仓库
- git clone XXX
- git add.
- git commit -m "提交"
- git pull
- git push
情况二:全新项目
- 创建远程仓库
- git clone XXX
- 在clone下来的文件夹中搭建项目
- git add.
- git commit -m ""
- git push
情况三:本地仓库搭建
- 创建一个本地仓库和搭建本地项目
- git remote add origin 远程地址
- git branch --set-upstream-to=origin/master
- git fetch
- git merge --allow-unrelated-histories
- git push