---
# System prepended metadata

title: Git筆記

---

# Git筆記

Git可以把檔案的狀態作為更新歷史記錄保存起來。因此可以把編輯過的檔案復原到以前的狀態，也可以顯示編輯過內容的差異

不同含義的更改盡量分開提交

Git的標準提交訊息：

第1行：提交時修改內容的摘要
第2行：空行
第3行以後：修改的理由

![image alt](https://backlog.com/git-tutorial/tw/img/post/intro/capture_intro1_4_1.png)

初始設定
$ git config --global user.name "<使用者名字>"
$ git config --global user.email "<電子信箱>"

設定輸出顏色
$ git config --global color.ui auto

設定別名，例如：「checkout」可以省略為「co」來執行。
$ git config --global alias.co checkout

建立tutorial資料庫並在裡面設定為git資料庫
$ mkdir tutorial
$ cd tutorial
$ git init

輸出該目錄狀態
$ git status

> 位於分支 master
> 
> 尚無提交
> 
> 未追蹤的檔案:
>   （使用 "git add <檔案>..." 以包含要提交的內容）
> 	samlple.txt
> 
> 提交為空，但是存在尚未追蹤的檔案（使用 "git add" 建立追蹤）

檔案加入索引
$ git add <file>...（空白鍵分隔檔案）
$ git add .  表示加入目錄裡面所有檔案

此時status會有新增的訊息

提交檔案
$ git commit -m "<提交訊息>"

查看提交紀錄
$ git log

> commit 401ff2e1cb1aa495e362528d836aed02f3f4bc3c (HEAD -> master)
> Author: linweipo <linweipo@gmail.com>
> Date:   Mon Oct 18 15:10:51 2021 +0800
> 
>     first comment

圖形化界面
$ sudo apt install gitk
$ gitk

上傳(push)到數據庫（先在貝格樂建立project）
增加數據庫網址以及名稱
$ git remote add <name> <url>

上傳數據庫
$ git push <repository> <refspec>
$ git push -u <repository> <refspec> 之後可以省略分支
<repository> 數據庫名稱 
<refspec> 分支名稱
>  * [new branch]      XXX -> XXX2
> 分支 'XXX' 設定為追蹤來自 'XXX' 的遠端分支 'XXX2'。

複製數據庫
$ git clone <repository> <directory>
<repository> 數據庫網址
<directory> 複製之後的名稱
（會複製到本機，電腦目錄裡面會出現）

（修改之後）增加內容
$ git add 檔名
$ git commit -m "增加的內容"
增加之後可以直接在這裡push
$ git push

下載更新到本地庫(pull)
$ git pull <repository> <refspec>...
<repository> 數據庫名稱 
<refspec> 分支名稱
$ git log 查看歷史紀錄

若兩次push期間有其他的上傳但自己沒有pull到，再push就會拒絕
修改在同一個地方的話會無法自動合併（需要手動）

$ git pull 下載到自己的資料夾
會出現標記需要修改的地方
（XXXXXX1 XXXXXX2為衝突的地方）

```
<<<<<<< HEAD
XXXXXX1
=======
XXXXXX2
>>>>>>> 0a3fe5a0bb4a8938a7ba7fc7d345abfa6f18f418
```

修改完裡面的檔案之後再用add提交 commit加上註解
再push

$ git log --graph --oneline
圖表化表示版本演進

分支
Intergration/Topic兩種
![image alt](https://backlog.com/git-tutorial/tw/img/post/stepup/capture_stepup1_2_1.png)

分支切換
checkout 切換到某個分支並查看最新檔案，之後的提交也是針對該分支

head
~n代表最後的前n代
^n代表該代的前n代

![image alt](https://backlog.com/git-tutorial/tw/img/post/stepup/capture_stepup1_3_2.png)

分支合併（最後通常都會併回intergration分支）
Merge 若有分支則會保留分支

fast-forward（快轉） 直接併入
![image alt](https://backlog.com/git-tutorial/tw/img/post/stepup/capture_stepup1_4_2.png)

non fast-forward 中間可能有重疊需要解決
![image alt](https://backlog.com/git-tutorial/tw/img/post/stepup/capture_stepup1_4_4.png)



Rebate 併入後面變成一條線（增加到master後面）
若有衝突則需要修改後再提交，head跑到最後面
![image alt](https://backlog.com/git-tutorial/tw/img/post/stepup/capture_stepup1_4_6.png)

![image alt](https://backlog.com/git-tutorial/tw/img/post/stepup/capture_stepup1_4_7.png)

分支種類
![image alt](https://backlog.com/git-tutorial/tw/img/post/stepup/capture_stepup1_5_6.png)

master: 拿來發表的
develop: 主要負責開發的
feature: 修復小錯誤
release: 發表釋出之前的準備
hotfix: 發表版緊急出現的小問題需要修復

分支
$ git branch <branchname> 建立分支
$ git branch 查看分支（*表示現在的分支）
$ git checkout <branchname> 切換分支
$ git checkout -b <branchname> 建立分支並切換
$ git merge <branchname> 將branchname合併到現在的分支（快轉），分支併入，若有衝突修改則為非快轉，分支會保留
$ git branch -d <branchname> 刪除分支