---
# System prepended metadata

title: Git 指令

---

# Git 指令
### 初始化
每一個新的資料夾,對其初始化建立一個.git

    git init

### 檢視檔案狀態
```=git
git status    #查看當前於工作目錄,暫存區檔案
git branch    #查看當前head位置以及所有分支名稱
```

### 檢視變更紀錄
```git
git log
git log --online  #檢視一行紀錄
git log -p 檔案名稱 #檢視單一紀錄
```

###	查看檔案紀錄
    git blame 檔案名稱

### 檢視程式變更紀錄
顯示差異點
```=git
git diff
````

### 列出跳轉紀錄過程
```=git
git reflog
git reflog -n  #n為任意數字，想列出的紀錄數量
```

### 工作目錄，暫存區，儲存區
起始建立檔案後都在工作目錄
```=git
git add 檔案名稱  #將檔案加入暫存 
git add .       #將資料夾下全部加入暫存
```

對暫存進行commit進入儲存區，並給予一個適當的存檔命名
```=git
git commit -m "適當的命名"   # git cm "xx"
```

### 暫存檔案
將變更到一半的檔案暫存，稍後再取回
```git
git stash  #暫存
git stash list # 列出所有
git stash pop #吐出來
```

### Head移動(分支切換)，檔案救回
checkout => co
```=git
git checkout   #檔案回覆
git checkout . #當前資料夾全回覆
git restore    #檔案回覆 ps:ver 2.23
git checkout --檔案名稱
               #若剛好要回覆的檔案名稱和分支名稱相同，則會進行分支切換，所以直接指定名稱

git checkout 檔案名稱   #head移動（分支切換）
```

### 分支創造，刪除
```=git
git branch             #創造新的分支
git branch -d 分支名稱  #刪除分支（標籤）
```

### 分支合併
先將head移動到master(使用 checkout )，在執行合併
```=git
git merge 分支名稱   #合併分支（快轉合併）
git merge 分之名稱 --no-ff  #不快轉合併（殘留分支圖）
git rebase 分支名稱   #（要移動的位置 ） #將分支合併成一條線
                    #優：較merge少一個節點  ，缺：不易辨別ＡＢ分支創建時間
```

### Reset 
性質類似become
```=git
git reset 要回去的點       -mixed  #回到工作目錄(預設)
                         -soft   #回到暫存
                         -hard   #直接丟棄
git reset head^n     #n為數量
                    #可使用^後方+  ~5 =^^^^^ (倒退五步)
                    
                    # ^ (caret) 
                    # ~ (Tilde)
```

### 刪除資料夾
```
rm -rf .git  #-r 刪除  -f 不要問砍了就對了
```

### 標籤
使用 tag 時，若是刪除分支，也不會消失，因為還有一個 tag 指著他
```git
git tag 1.0.0 b174a5a
```

### ssh 密鑰
先 ssh-keygen
創建名稱(當前目錄，直接enter會到ssh資料夾)
密碼（通常省略）
接著到 cd ~/.ssh
找到 cat id_rsa.pub (id_rsa 是私密)
再到 github 設定的ssh中設定
 
 
 
### 推上 github
```git
git remote add origin  xxx(ssh協定)
git push -u origin master  
git push -f  (不能隨便用，會導致自己記錄把整個蓋掉)
```
（把本地的 master 分支，推往 origin 這個遠端節點，並且在遠 端形成一個 master 分支」）

### 同步 github
git pull = git fetch + git merge

```
git fetch    or git pull
```

### 複製專案
只需要進行第一次 ， 接下來都是使用 pull
```
git clone 專案網址
```