---
# System prepended metadata

title: Git 紀錄

---

# Git 紀錄
## 基本使用
預設分支 master
建立分支 git branch develop
檢視全部分支 git branch
切換分支 git checkout master
建立並切換分支 git checkout -b br1
刪除分支(目前在的分支不能刪) git branch -d br1
分支沒被合併刪除 git branch -D br1

切分支情景：
1. 多人開發時切個人分支
2. 開發新功能時切功能分支
3. 分開發、測試、正式開分支

不小心刪除分支復原
git branch develop 357a612

合併分支：注意誰合併誰
假設要將 dev 合併到 master
先切換到 master
下 git merge dev
合併分支單向合併，線圖比較不會亂，所以需要先決定主分支是哪一支
若需要從主分支開新版本開發，可以再創一個分支繼續進行

解決衝突：
只有在兩個分支同時修改同的檔案的同一個地方時，才會發生衝突
否則會自動合併，所以事前溝通分工很重要

解決衝突的辦法在下 git status 時就會寫的很詳細了

git merge xxx => 發生衝突 => 此時下 git status 會發現狀態是 merging，且會要求處理衝突情況 => 此時可以選擇 1. 放棄合併：git merge --abort 或 2. 解決衝突 => 回到衝突的原始檔案，會標示衝突的位置與兩個版本個別的程式碼(git會自動加上一些符號顯示此處衝突)，處理完成衝突後 => git add 衝突檔，成功的話下 git status 會顯示 All Conflicts fixed，但還是位於 merging 狀態 => 再下 git commit 就成功了

git diff 看目前檔案與版控上的檔案有何不同

快轉機制(Fast-forward)
merge 時，如觸發合併的分支在拆分支出去後都沒有改變，會觸發快轉機制。
觸發合併的分支將會直接跟被合併的分支結合變成同一條。
缺點：dev 分支可能會有一堆 commit 版本，合併到 master 會很亂
但通常會關閉快轉機制，保證線圖好看與可以記錄版本狀態
git merge develop --no--ff

git pull 把遠端儲存庫的版本下載回來
git pull = git fetch + git merge
git fetch：把遠端儲存庫拉下來
git merge：合併到本端主線

快轉機制使用時機：若今天你的同事先把 master push 到遠端儲存庫了，而你這邊的程式還沒 merge，那你執行 git fetch 時會將遠端的 master 拉下來，但意義上遠端根本地的 master 是同一條，這時候就可以用快轉機制把他們兩個合併，線圖看起來也會比較正常。

不產生 commit 的 merge
git merge --no-ff --no-commit develop
下完之後狀態會是 merging
處裡完測試等事項後再下 git commit 來提交

復原合併
 git reset --hard ORIG_HEAD
 
壓縮合併(squash)
將某分支的全部版本壓縮到原分支的新版本上，不能跟 --no-ff 共用(因為本來就不會將子分支拉線到主分支)
不會影響子分支，主分支上會多一個 commit，合併子分支的版本進去
使用情境：如果要做小修改，不構成一個版本或分支，可以開做完版本後，利用壓縮合併到主分支，再刪除修改的版本或分支，讓歷程看起來比較乾淨。

刪除分支
git branch --merged 秀出已經合併過的分支
git branch --no-merged 秀出還沒合併過的分支
git branch -d new2
刪除已經合併過的分支
git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d


## 協同作業
git clone URL
git clone --help

## 上傳到遠端平台
檢查專案是否有連結遠端 git remote -v
列出所有遠端分支 git branch -r

## 取得遠端分支
把專案 clone 下來後，預設只會幫你開master分支
若專案中存在其他分支，可以直接用 git checkout 分支名稱
會自動在本地端建立該分支，並與遠端建立關聯

## 發布本地分支
git push -u origin 分支名稱

## 刪除遠端追蹤分支
git fetch -prune














