Day 28 : Git

1. 为什麽要学 Git,可以做什麽呢?

学习到现在大家一定累积很多的程序码或是各式的档案,如何去做有效的控管其实是非常重要!

想像有个情境是你上线了一段程序码,但顾客抱怨使用上有问题,你需要紧急还原到上一版,这是就可以靠 Git 来协助你进行程序码或档案版控,快速还原上一版,就不用急忙打电话给同事找程序码。我们可以利用 Git 指令将程序码每次的版本记录起来,当哪一天需要回头检视的时候就可以直接查看。

2. 环境设定

安装 Git

终端机常用指令简介

由於 Git 指令是打在终端机,因此有必要认识一下基本的终端机指令。
以下指令在 MacOs 与 Linux 通用

指令 说明 范例
cd change directory 切换目录 cd 目录
cd change directory 切换上一层 cd ..
tab 系统提示该指令 (需搭配其他指令,例如 cd 搭配 tab 可以直接看到可以切换目录) cd (按tab)
ls list 列出目录有的档案 -l 显示完成档案权限(可不加) -a 显示.开头的档案(可不加) ls -al
mkdir make directory建立一个资料夹 mkdir 资料夹名称
cp copy 复制档案或资料夹 -r 代表是资料夹操作(可不加) cp -r 原档案或资料夹路径 新档案或资料夹路径
rm remove 删除档案或资料夹 -r 代表是资料夹操作(可不加) rm -r 档案或资料夹路径
mv move 移动或重新命名 (1) 将档案由 oldfile.txt 更名为 newfile.txt,所在目录不变: mv ./oldfile.txt ./newfile.txt (2) 将档案 ./dir1/filename.txt 移动到 ./dir2/ 目录下,档案名称不变:mv ./dir1/filename.txt ./dir2/
pwd print working directory 显示目前路径 pwd
crtl+c 强制停止目前指令执行
cat concatenate 由第一行开始显示档案内容 cat 档案
tac 由最後一行开始显示档案内容 tac 档案
more 一页一页显示档案内容 more 档案
less 与more相似,此指令可以往前翻页 less 档案

绝对路径与相对路径

  • 绝对路径:/usr/lib
  • 相对路径: 若系统目前在 /usr/lib 这个目录,可以用 cd ../bin 切换到 /usr/bin

目录相关

  • . 代表此层的目录
  • .. 代表上层的目录
  • ~ 代表自己的家目录

更详细资讯

鸟哥的 Linux 私房菜-第六章、Linux 档案与目录管理

设定 Git Config

设定帐号名称和信件

$ git config --global user.name "your github id"
$ git config --global user.email "your [email protected]"

查看设定的资讯,按Q可以离开

git config --list

3. Git 工作流程

  • git add 会将档案从工作目录推到暂存区
  • git commit 会将档案从暂存区推到本地端储存库
  • git push 会将档案从本地端储存库推到远端储存库
  • git pull 会将档案从远地端储存库同步回工作目录
  • git fetch 会将档案从远地端储存库同步回本地端的储存库
  • git merge 合并

image

4. 开始使用 Git

(1) 查看状态

使用 git status ,我们可以查看目前修改了什麽档案(modified)、删除什麽档案(deleted)以及哪些档案尚未被追踪(Untracked files)

image

新增一个 test.txt 档案,会在 Untracked files 列出
image

(2) git add

使用 git add 档案 ,我们将档案或资料夹推到暂存区,若我们再用一次 git status 就会发现有提示一个新档案(new file)

image

不建议使用 git add *,这个动作虽然可以一次把所有档案加上,但可能会加到你不要的档案(除非你有确定,不要的档案类型可以写 .gitignore )

这里有 python gitignore 的 template 就不用自己辛苦打文件XD

(3) git reset

假设刚刚的档案反悔不想要放到暂存区或是等一下教的commit要取消, 操作git reset 即可

image

可以利用 git log 查询纪录,也可以直接某一次的版号
git reset 号码(前6码即可)

(4) git commit

接着就可以进行提交 commit, 操作git commit -m "这次提交想要传达的讯息"
为了让每次的提交都知道在做什麽,会写有意义的内容(你或你的同事要看R),记得讯息一定要写!!

image

通常我们讯息为了要分别,有一些原则可以参考,会将下列中括号替换成下面的文字

原则文字 说明
feature 新增功能
fix 修 bug
refactor 重构(不是新增功能也不是修 bug )
docs 文件
style 格式
revert 回上一个版本

更改讯息

  • 改最後一次
    利用 --amend 来修改 git commit 的讯息
    git commit --amend -m "Hello World!"
  • 改之前
    利用 git rebase commit_id号码(6码即可) 来修改 git commit 的讯息
    • 先看 git log 知道 commit id
      萤幕快照 2021-08-26 下午4 01 54
    • 输入 git rebase
    • 进入 vim 编辑器进行修改
      会显示从现在到这个 commit id 的所有 commit 纪录
      将 pick 改成 reword 或是 r ,并修改後面的讯息
      按 i 进入编辑模式 
      按 esc 输入 :wq! 存挡离开
      
      萤幕快照 2021-08-26 下午4 21 03
      萤幕快照 2021-08-26 下午4 21 57
    • 会再进人第二次 vim 编辑器
      再输入一次

看起来只有简单改讯息,但大家可以看 commit id 都变了,实际上是修改一个 commit
基本上不建议大家用这招,因为把过去讯息改掉可能会造成错乱呀!

(5) git push

接着就可以将本地端程序码推到远端啦!操作 git push

image

5. 分支 (Branch)

Git Flow

有人制定了规则让大家一起遵守
https://nvie.com/posts/a-successful-git-branching-model/

用比较简单的流程跟大家说明
image

  • main: 稳定、可以上线的版本,而且这个版本只能从别的分支合并过来,基本上开发者不能直接对这个分支进行 commit
  • develop: 这个分支纪录所有开发者的基础分支,所有的 feature 分支必须从此分支切出,而 feature 分支完成後也都会合并回来此分支
  • feature: 新增功能的意思,通常我们会从 develop 分支切出来,并加上此次要新增的功能。 feature/名称,名称通常可以取有意义的名称,让专案或其他成员可以看懂你这次要干麽。

查看分支

git branch -a
image

  • 星号代表你现在在哪一个分支
  • 按 Q 可以离开
  • remote/origin/HEAD -> origin/main 本地端追踪分支
  • remote/origin/develop -> 远端分支 develop
  • remote/origin/main -> 远端分支 main
  • origin 是远端储存库的别名,可以 git remote -v 查看远端储存库的路径

新增分支

git branch <branch name>
git checkout -b <branch name>

删除分支

git branch -d <branch name>

切换分支

git checkout <branch name>

合并分支

git merge <branch name>
更详细的说明:https://gitbook.tw/chapters/branch/merge-branch.html

远端协作

  • 拉远端分支
    git checkout origin/develop -b develop
  • FETCH
    可以更新远端储存库的资料在本地端 git fetch
    image
    基本上对本地端的 main 来说 origin/main 也是一种分支,结果在 fetch 之後 main 居然落後 origin/main,这时候就可以利用合并分支git merge origin/master
    image
  • PULL
    • git pull
      这个指令也是更新远端储存库的资料在本地端,而这个指令的功用是 git pull = git fetch + git merge ,会自动帮你做完 merge 快转模式(Fast Forward)的步骤
    • git pull --rebase 加上此参数之後会自动做 rebase
      多人开发的时候,大家会在自己分支commit并在远端协作,你拉回本地端的时候也会因为合并而产生一个额外的commit,如果你不想要这个多余的commit可以加上此参数

冲突

假设你与同事或专案成员共用开发,你的同事在 develop 分支上先改了一下操作(这边远端用 master 示范)

image

但你的 local 端,没有先更新到最新,也对同一行程序码进行编辑修改。你一样先 git add 、 git commit,当你发现 git push 时候悲剧了!

image

怎麽会有冲突呢? 这时候什麽东西

image

冲突发生在不同的分支纪录要合并时,发现居然不同的状况。 git 很贴心会把冲突的部分秀出来,这时候好好找你同事聊一聊讨论一下要改成什麽吧!把标记删除再重新推一次就可以解冲突罗!

image

把标记删除再重新推一次就可以解冲突罗!

image

6. 标签 (Tag)

列出标签

git tag

建立标签

git tag -a v1.5 -m "my version 1.5 and it add some ..."

查看标签资讯

git show v1.5

分享标签

  • git push 指令预设不会将标签传送到远端服务器,你必须要用以下指令才能推送
    git push origin v1.5
  • 传送多个标签
    git push origin --tags
  • 参考资讯

7. 其他操作

(1) 删除档案

你可以直接砍档案 rm 档案

把特!你会看到这个
萤幕快照 2021-08-26 下午3 39 20

因此你要继续做 git add 和 commit 的动作

484很麻烦!!所以贴心的 git 有这个功能 git rm 档案 可以一键呵成

萤幕快照 2021-08-26 下午3 42 43

(2)更换档名

跟刚刚一样,你可以使用 mv 指令换档名然後再 add commit

但 git 一样有提供一键呵成 git mv 原档名或路径 新档名或路径 可以一键呵成
萤幕快照 2021-08-26 下午3 48 14


<<:  Day28 Java 注解

>>:  26 | 【区块组合套件介绍】Qubely

OpenStack 介绍 2

本系列文章同步发布於笔者网站 前一篇文章以比较非技术角度介绍了 OpenStack 这个专案。今天开...

[26] 用 python 刷 Leetcode: 150 evaluate reverse polish notatio

原始题目 Evaluate the value of an arithmetic expressio...

笔记:好用HTML5 的表单input元件及属性

html的form标签之input小记录 前言本篇是上课中所提及好用,但是笔者小新手之前未发现的上课...

[NestJS 带你飞!] DAY15 - Dynamic Module

前面有介绍过 Module 的一些基本使用方式,然而有一项非常强大的功能没有被提及,就是 动态模组(...

强型闯入DenoLand[31] - MongoDB 安装教学

强型闯入DenoLand[31] - MongoDB 安装教学 本章会分为两个部分: MongoD...