---
# System prepended metadata

title: 實戰Git-commit
tags: [git]

---

---
title: 實戰Git-commit
tags: git
---
# 實戰Git-commit

[TOC]

---
### git commit
-m 代表message
```bash=
git commit -m "1st commit"
```

我們可以從圖中發現（根提交）後面有一組hash(d6735aa)，圖中的100644則在linux系統中代表檔案屬性（不必在意）
![](https://i.imgur.com/QiUzfjs.png)

我們可以根據以下兩個指令得到commit後所產生的檔案類別與內容。

```bash=
git cat-file -t 雜湊值 #取得類別
git cat-file -p 雜湊值 #取得內容
```

在此圖中+0800以前的數字代表在電腦系統中的時間（從1970開始）
![](https://i.imgur.com/FOyCeGs.png)

我們透過一樣的方式來檢視剛剛所生成的Tree會發現Tree是一個目錄。
![](https://i.imgur.com/snOKK01.png)

#### refs
因為顯示的關係，我們可以透過以下指令來顯示git中目錄
```bash=
tree .git/
```
我們可以看到在refs裡面有一個heads資料夾，透過`cat`來看其內容會發現是一組hash，這組hash則紀錄最新的commit
![](https://i.imgur.com/DsJsY9B.png)

#### HEAD
git資料夾中HEAD如同一個指標，會紀錄當前的分支，可以透過`cat`來檢視。
![](https://i.imgur.com/c7dJLnV.png)

#### 架構
![](https://i.imgur.com/gqWRCLn.png)

#### 檔案遭修改後再進行commit會怎樣？
若我們今天將file2透過Vim進行修改，接下來再確認git status 我們會發現，git 一如往常會幫我們找出遭修改的部分。

此時我們需要將遭修改的檔案進行add
![](https://i.imgur.com/yjhcMZF.png)

當我們add完成後進行commit後會發現，出現了不同的版本。
我們可以從

![](https://i.imgur.com/3XE1YAG.png)

`git cat-file -p 雜湊`發現，第二次的commit會有一個Parent的屬性承接另一個commit如圖所示。

![](https://i.imgur.com/gL55FIa.png)

繼續進行新增檔案，透過mkdir創建一個資料夾在該資料夾內新增一筆資料
![](https://i.imgur.com/cMEpKR0.png)

進行add與commmit後則會發現他的Parent是剛剛我們第二筆commit的hash。
![](https://i.imgur.com/6obuFOW.png)

詳細的關係圖如下所示
![](https://i.imgur.com/6G6sDIE.png)

### git的文件狀態
![](https://i.imgur.com/Eb4Cdqf.png)

#### 刪除索引區的檔案
首先我們先針對file1.txt進行修改，加入額外內容再將他add，完成後確認git status
![](https://i.imgur.com/kmjdMgw.png)

若今天突然發現該檔案不是我們要的需要進行刪除時可使用以下指令。
```bash=
git rm --cached fileName
```

執行後我們會發現他從索引中移除了，並跑出可加入追蹤的提示字。
![](https://i.imgur.com/Xd1hGg6.png)

#### 將索引區的檔案回到上一次的版本

當我們今天修改了file1的內容並add後我們後悔了，但又不希望從索引區刪除該檔案，而是希望回復到上一個版本怎麼辦？
![](https://i.imgur.com/9PQxgas.png)

可以使用以下指令來回復到上一次的版本。
```bash=
git restore --staged fileName
```

#### 將檔案回復至如索引區的內容
我們可以透過以下指令來載入索引區中的版本並修改實體的檔案內容。
```bash=
git restore fileNmae
```

#### commit的歷史
```bash=
git log
git log --oneline #只顯示一行
git log -n #顯示最近n次的commit
git log --oneline -n #以一行顯示最近n次的commit
git log --after='2020-05-21' #只顯示5/21號以後的commit如果要5/21以前只要把after改成before.
git shortlog
git log --stat #顯示詳細修改
```
