git管理工具

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” 模式会将凭证用明文的形式存放在磁盘中,并且永不过期;
  • 选项四:如果你使用的是 MacGit 还有一种 “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)

总结

情况一:已有远程仓库 

  1. git clone XXX
  2. git add.
  3. git commit -m "提交"
  4. git pull
  5. git push 

情况二:全新项目

  1. 创建远程仓库
  2. git clone XXX
  3. 在clone下来的文件夹中搭建项目
  4. git add.
  5. git commit -m ""
  6. git push

情况三:本地仓库搭建

  1. 创建一个本地仓库和搭建本地项目
  2. git remote add origin 远程地址
  3. git branch --set-upstream-to=origin/master
  4. git fetch
  5. git merge --allow-unrelated-histories
  6. git push

常见命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值