Day 10 Git

还记的这篇主题吗?因为 Flask 是用 Python 写的,所以前面讲了那麽多有关 Python 的东西也还可以理解,那为什麽突然出现一个跟 Python 都没有关系的 git 呢?

因为这系列主要是让你之後再进行多人的专案开发或维护的时候,能够更快的进入状况,减少出包(被从顶楼丢出去实测自由落体)的机会。而在多人的专案开发或维护时,常用的版本控制软件就是 git。

安装准备

开始使用 git 前要准备什麽?当然是安装 git 啊!那要怎麽安装 git 呢?有两个方式:

1. 安装 cmder(个人推荐)

推荐原因:因为 cmder 内建 git 指令 + 可以使用 Linux 指令 (个人觉得比 windows 的指令好用,我知道 powershell + git 也可以做同样的事,不过黑色背景比较潮)。那 cmder 要怎麽安装呢?

  1. cmderDownload Full (Full 版本确定有 git 指令,Mini 我不知道)。

  2. 把下载下来的东西解压缩後放在你想放的位置(我是放在 C:/cmder/ 下面)。

  3. 设定环境变数:设定 -> 系统 -> 关於 -> 进阶系统设定 -> 环境变数 -> 系统变数 -> Path -> 新增 -> C:/cmder/ (刚刚放的位置)




  4. 开启 CMD(内建的命令提示字元),输入 set PATH=C: ,让环境变数立即生效,不用重开机

  5. 关闭 CMD 再重启,输入 echo %PATH% ,查看是否有增加 C:\cmder (恩,对,某窗户就反骨,斜线就要跟其他人不一样)。

  6. 开启 cmder,等待初始化结束。

  7. 安装完成

  8. 输入 git --version 查看 git 版本(如有有提示需要升级就直接输入 git update-git-for-windows 即可)。

有关 cmder 要设定的

  • λ 改成 $ (推荐)
    推荐原因:不改会有画面残留文字的问题,虽然不影响指令输入,而且下个 cls 或 clear 就不见了。

    打开 vender/clink.lua

    local lambda = "λ"
    

    改成

    local lambda = "$"
    
  • 使用 lua Config (看个人喜好)
    让你的 cmder 看起来更好看的

    1. 下载 cmder-powerline-prompt
    2. 将下载的所有 .lua 档放入 C:/cmder/config
    3. 重启 cmder。

    * 设定完会变回 λ,要改的话参考下面方式:

    powerline_core.lua

    plc_prompt_lambSymbol = "λ"
    

    改成

    plc_prompt_lambSymbol = "$"
    

2. 安装 git (不想要搞太麻烦可以选择这个方式)

git官网下载 好以後,安装就可以了(应该会出现超多可以选的东西,但是不要理它,放心大胆的下一步到底就对了)














按下 install 等待安装完就可以了

git 设定

本地设定

  • 查看个人设定

      # 查看个人设定
      $ git config --list
    
  • 设定个人资料(基本上要设定 user.nameuser.email 才可以)

      # 设定名称
      $ git config --global user.name <name>
    
      # 设定 email
      $ git config --global user.email <email>
    

远端设定

先申请一个 Github 或 Gitlab 帐号(它要啥填啥就对了,应该没问题吧?)

然後因为 Github 无法在采用密码认证 所以要先设定好 SSH(虽然也可以用GPG 或其他的东西,但是我的肝表示用熟悉的 SSH 就好了)。

首先先产生一组rsa公私钥(email记得改成自己的),先打开 cmder 输入:

$ ssh-keygen -t rsa -b 4096 -C "<[email protected]>"

# 输入 keys 档案要放的位置与名称,没有要改就 Enter
> Enter file in which to save the key:

# 设定通行密码,没有要改就 Enter
> Enter passphrase

# 再输入一次通行密码,没有一样 Enter 就好
> Enter same passphrase again:

再输入

# id_rsa 是预设名称
# 没附档名的是私钥,给自己用的
# .pub 是公钥,给外部系统用的,这边要打开的就是公钥
$ notepad .ssh/id_rsa.pub

然後再点右上角的倒三角形->Settings->SSH and GPG keys->New SSH key,记事本全选复制後贴到 Key 那栏里面(Title 随便填,不填也没差),最後在按Add SSH key 就可以了,这时可以透过下面的指令测试有无设置成功。

$ ssh -T [email protected]
# 成功的话就会像下面这样
> Hi <your name>! You've successfully authenticated, but GitHub does not provide shell access.

windows 中 ssh-agent 设定

ssh-agent 是用来管理 SSH 的私钥,如果前面设定了通行密码,每次使用都需要输入。ssh-agent 可以免除重复输入密码的麻烦。这边只讲如何设定。

* Windows 10 1709之前没有内建 Open ssh,要使用必须自行安装
* Windows 10 1803~21H1(目前最新)的 ssh-agent 有内建,但是是关闭的(???),可以透过 cmder 输入 winver 来确认版本

PowerShell 的系统管理员 MODE

# 查看 ssh 位置
$ Get-Command ssh

# 查看 ssh-agent 状态
$ Get-Service ssh-agent | select -property Status,Name,DisplayName,Starttype

# 改变 ssh-agent 状态
$ Set-Service ssh-agent -StartupType Manual

# 启动 ssh-agent
$ Start-Service ssh-agent

# 取得 ssh-agent 状态
$ Get-Service ssh-agent

# 新增私钥
$ ssh-add <私钥 Path>/<私钥 Name>

# 列出管理中的私钥
$ ssh-add -l

# 让 git 使用 Windows 的 ssh-agent,不使用 git 自带的
$ git config --global core.sshCommand "'C:/Windows/System32/OpenSSH/ssh.exe'"

重要
强烈建议您将私密金钥备份至安全的位置,然後在将它新增至 ssh-agent 之後,从本机系统将它删除。

如果您失去私密金钥的存取权,就必须建立新的金钥组,并在您互动的所有系统上更新公开金钥。

Git 介绍与使用

Git 主要功能是控管每个档案的版本关系,自然会记录有关档案状态的东西(我不太知道如何形容)。

Git 中档案的状态(可以这样说吗?)可分为 4 种,而每个档案版本所在的区块也有 4 种。根据我个人的理解,把它们组合起来看会长这样:

先稍微介绍一下很明显的档案区块的4种:
Working Directory (在此简称: W): 现在存在於资料夹内的、编辑器可以打开的位置。
Staging Area (在此简称: S): 暂存状态。
Local Repository (在此简称: L): 本地(自己的电脑上的)仓库。
Remote Repository (在此简称: R): 远端(不在自己的电脑上的)仓库。

再来稍微介绍一下档案状态的4种:
Untracked: 未被追踪。
Unmodified: 追踪中,未修改。
Modified: 追踪中,已修改。
Staged: 追踪中,待提交。

好,首先是档案区块, Working Directory 很容易懂,你看到的、可以修改的档案都属於它; Staging Area 里面都是追踪中、会提交进仓库的档案; Local Repository 就是在本地(自己的电脑上)的仓库; Remote Repository 就是远端(不在自己的电脑上)的仓库;基本上修改完毕都必须提交进仓库储存,档案区块大概就是这样。

接着是档案状态,档案状态就是档案储存後的内容,离开 Working Directory 才会Care 版本的问题(虽然有点不精确,但大概是这样的概念)。如果是新建一个 git 的仓库( init 不是 clone 後面会讲道),所有档案一开始会处於 W-WS(突然出现的集合论??) 的区块;只要加入追踪,就会从 W-WS 的区域移到 WS 的区域;到这里应该知道了 Untracked (W-WS)的档案状态了吧?再来是 Staged (S-WS)的状态,这里面是预备提交进入仓库的状态;阿剩下两个状态是怎麽回事?Unmodified 简单说就是 S-WS 跟 WS 之间状态一样;而 Modified 就是 S-WS 跟 WS 之间状态不一样。

顺便插入说明一下 Branch,Branch 功能主要是让不同 Branch 可以有不同任务,例如稳定发行版、开发测试版等等;跟分支很像的功能叫 Fork,Fork 是主要是给不同人可以同时开发不同东西,不会互相影响的;而两个都可以透过 merge 合并(虽然 Fork 要原作者同意才可以 merge ),然後自己可以 Fork 别人的专案(可以选择 Fork 别人的不同 Branch )後 Branch,但没有自己 Branch 自己的专案後再 Fork 的。

是不是有点概念但好像还不太懂?只要记得你可以打开来操作的档案全部都在 Working Directory (包括 W-WS 跟 WS),Working Directory 以外的都是状态就好,接着搭配着语法看应该就懂了!

开始

# 将现在所在的资料夹变成一个仓库 | 资料夹内的档案都是 Untracked (W-WS)
$ git init

# 复制一个专案到现在位置 | 专案资料夹内的档案都是 Unmodified
$ git clone <url>

完成

# 加入追踪 | 英文句号 . 代表全部档案 | W-WS 移进 WS, WS 复制状态进 S-WS
# 第一次 W-WS 移进 WS 的时候会顺便复制状态进 S-WS
$ git add <filename>

# 取消追踪 | WS 移进 W-WS
$ git rm --cached <filename>

# S-WS 的状态取代 WS 的状态(对,你辛苦做好的程序只要下这个指令就会不见了)
$ git restore <filename>

# S-WS 的状态提交给 L,顺便加上一段说明了你干了什麽的讯息
$ git commit -m "<commit message>"

# S 的状态提交给 L,顺便加上一段说明了你干了什麽的讯息
$ git commit -am "<commit message>"

分支

Fork 请在网页上操作

# 查看 L 有哪些 Branch
$ git branch

# 新增 L 的 Branch
$ git branch <branch name>

# 切换现在 L 的 Branch
$ git checkout <branch name>

# 合并 L 的 Branch | B 要并进去 A 要先切回 A 後 merge B
$ git merge <branch name>

远端(推错会自由落体的)

# 查看现在有哪些 R | 正常会出现 <remote name> <remote url> 这样
$ git remote -v

# 把 L 的 branch 推到 R 的 | R 没有这支 branch 会自动新增
$ git push <remote name> <remote branch>

其他

# 查看 L 的历史纪录
$ git log --graph

.gitignore

纪录一些要忽略掉不想追踪的档案,git add . 就可以把剩下的全部加入了。

.gitignore

# 忽略 .env 档案
.env

# 忽略 package 底下所有附档名是 .py 的档案
package/*.py

大概就酱。

参考资料

Generating a new SSH key and adding it to the ssh-agent

OpenSSH 金钥管理

Windows 1803之後git for windows无法透过Start-SshAgent啓用ssh agent - 需要一直输入passphrase的问题

那麽就大概这样,git 真的要好好学好,推到远端前一定要看清楚,不然真的会出大事。

大家掰~掰~


<<:  框架与挑选实作的阶段 | ML#Day17

>>:  Day 10 - Spring Boot 建立专案

【Day 25】- 什麽几百张几千张的猫猫图片,戳一戳就结束了(实战 requests 向 API 请求获得回应)

前情提要 昨天介绍了 Postman 这款 API 管理、测试工具,也在上面测试了猫猫图片的 API...

初探网路安全(四):加密演算法,何谓对称及非对称式加密?

在前面聊到 HTTPS 时,我们有提到透过加密,可以让你传输的资料不会被「中间人」所窃取。 但这会有...

改善计划(精简版)

对於企业或机构的改善计划来说,除了改善事项以外应检附相关佐证。 例如:资讯机房网路安全运作与架构改善...

[CSS] Flex/Grid Layout Modules, part 14

中秋连假写稿好像有点不太应景,所以今天不会讲太多东西,最後把 Grid 单元的对齐稍微补一下,连假嘛...

Day22 - Sort2

大家好,我是长风青云。今天是铁人赛第二十二天。 因为我堂姊一直跟我说话所以影片没办法录。先发。 成功...