Nice to Meet You

I’m Hannah, a Taiwanese front end developer.
Have experience on building projects from scratch and enjoy solving problems with a productive team.

Skills

  • HTML, RWD
  • JS, React Js, Vue Js, Angular Js, jQuery
  • CSS, SASS, SMACSS/MVCSS
  • PHP, Wordpress
  • Git, Gulp, webpack

Experience

  • 8+ years of working experience as a web developer
  • Sass / css lecturer for DD Studio
  • Host a conference at FEDC
Contact me
# | Jun 15 2017

我想要精通 git


git_main
之前使用 git 都是用到才查語法,所以想好好整理一下讓自己可以更有效率的使用!
以下文章是列出來自己常會弄錯或搞不清楚的地方


Basic Process

基本上有三個環境

local 你的所在目錄

之後開始 coding…,這時檔案狀態都是 Untracked files

Stage

你確定要 commit 的東西

remote 遠端

push 到遠端後,專案的每一個人都可以 pull 下來

git_basic
git_basic2

git branch

以下是開 branch 時的建議

git_chart
develop

開發時的主支

feature branch

功能面向,developer 都是用這個 branch 在自己電腦上 cooding

release

要 release 時

master

上線用

hotfix

上線後發現小的 bug 要修改

ps. HEAD: 代表當前分支的最新提交名稱
 

git 語法

git pull

1. git pull = git fetch + git merge
2. git pull --rebase = git fetch + git rebase
建議用 2,避免以下情況發生
git-merge

git commit –amend

當我已經 commit -m "change style" 了,但我發現有一個東西忘記改
你不需要再重新 git add .git commit -m 'change style 2' 讓歷史記錄多一行

你只要 git add .git commit --amend 就可以了

git log

可以看現在的歷史提交記錄

git status

哪些檔案沒被 track / 哪些檔案被修改

git show

看這次改了什麼

 

git stash

git_stash2
當你手上工作還沒做完也不想 commit 時就要切換到別的 branch (PM 說有一個 issue 要在 5 分鐘內解決),手中的修改內容也會跟著移動到新 branch 讓人會很困惑,其實這時可以把手上工作放到暫存裡,有點像先把這些檔案 ctrl + x 剪下來 (git stash),之後再 ctrl + v 貼回你想要的 branch (git stash pop)

git reset

當有東西沒改到但已經 commit 了,可以把這個 commit 拿回來重新修改而不需要增加另外多餘的 commit

情境 語法 打了語法後狀態
修改檔案,上傳到 stage git add . 狀態由紅(local)轉綠(stage)git2
發現有東西沒改到,想拿回來重改 git reset HEAD . 狀態由綠(stage)轉紅(local)git1
已經 commit -m ‘test’,但發現改錯了不想要這個 commit 要重改git3 git reset --hard HEAD~1: 回到前一個 commit git4

 

–-soft repository 的檔案會被還原到 HEAD,但 stage 與 local 檔案不變
–-mixed repository 與 stage 的檔案都會被還原到 HEAD,但 local 的檔案不變
–-hard repository、stage 與 local 的檔案都會被還原到 HEAD

 

Rebase

合併 commit

本來 log 長這樣

我覺得 commit 太多,想把 b8443cb 跟 03f1f6c 合併
git rebase -i HEAD~2

改完之後你會發現 log 變成

修改 commit

跟單純 git commit –amend 不同的是,git rebase -i 可以一次修改多個 commit
 

Merge & Rebase

合併前

Merge

合併在新增的 G 裡,有衝突的話只要解決一次 conflict

Rebase

D’、E’ 跟原本的 D、E 已經不同了,需要修改各自提交時發生衝突的部分,所以可能需要解決衝突許多次

Merge Rebase
語法步驟
  • git checkout master 先切換回最終要合併的 branch
  • git merge new-feature
  • git checkout new-feature 先切換回目前的分支
  • git rebase master 會讓 new-feature 併進 master 線圖上< /li>
  • git checkout master
  • git merge new-feature
看遠端本地是否有衝突,沒有衝突/也衝突解決後 開一個新的 commit merge
  • 把本地 repo. 從上次 pull 之後的變更暫存起來
  • 回復到上次 pull 時的情況
  • 套用遠端的變更
  • 最後再套用剛暫存下來的本地變更
合併歷史記錄 修改內容的歷史記錄會維持原狀,但是合併後的歷史紀錄會變得更複雜 修改內容的歷史記錄會接在要合併的分支後面,合併後的歷史記錄會比較清楚簡單,但是,會比使用 merge 更容易發生衝突。
缺點 合併後的歷史紀錄會變得更複雜 比較容易發生 conflict
適合時機 修改比較多,預期會有較多的 conflict,建議用 merge 修改範圍較小,不太預期有 conflict,則建議加上 rebase

 

其他

conflict

分割線上方是 local 的檔案
========
下方是遠端檔案

移除檔案

git 移除檔案不像我們在電腦的檔案按 delete 就刪除了
首先要知道你是想刪除哪個環境的檔案 Local / Stage / Remotegit_file_status圖來自

我自己弄了一個範例,總共有四個檔案
local.txt
stage.txt

remote.txt

Local

這是最容易刪除的,因為他還是 Untracked 狀態,所以直接刪就好了

Stage

git rm -f stage.txt : local 跟 stage 上都會刪掉 stage.txt

git reset HEAD <file> 先讓檔案回復 Untracked 狀態,再刪掉( –mixed )

Remote

git rm --cache stage.txt: 檔案從 stage 刪掉但變 Untracked 狀態,代表 local 還是留著 stage.txt

參考資料