GIT 使用筆記
GIT 基本筆記
1. 進入暫存區(ADD)、提交版本(COMMIT)
1 | git clone |
如果已經被加入repository過的檔案,絕對不行用git rm –cached,因為這行指令是把檔案從Repository中幹掉:
- 若檔案不在Repository內 : git rm –cached幫我們從stage刪除,且檔案本來就是untracked,執行完還是untracked,還在預期之內。
- 若檔案已經在repository內 : git rm –cached會幫我們從repository刪除,並且從stage刪除,因為已經從repository刪除檔案,檔案會從tracked變成untracked。
因此要移除Staing Area中的檔案,我們必須根據檔案狀態採用不同的指令: __
- 若該檔案不在repository內 : git rm –cached 檔案名稱
- 若檔案已經在repository內 : git reset HEAD 檔案名稱
2. 查看目前狀態的常用指令 (DIFF, LOG, SHOW)
從Git命令列鍵入git diff就可以看到修改過後的紀錄。
1 | diff --git a/hello.txt b/hello.txt |
要怎麼知道每一項commit確切到底改了什麼
git show來查看某項特定commit的修改內容:
1 | $ git log |
然後我們把上面第一欄的commit代碼複製起來 (複製六碼或以上)後輸入在git show後面,就會顯示該次詳細的修改內容:
1 | $ git show 8a8509 |
在git diff後面輸入commit代碼,也可以比較兩次commit間修改的差異:
1 | $ git diff 8a8509 0dc97a |
總結
1 | git log |
3. 推送程式碼至REMOTE端 (PUSH/PULL)
在GitHub上創建一個和本地端名稱相同的資料夾,專案描述可寫可不寫、權限設為開放、README不用勾選,最後按下 :
將hello.txt檔案打開,在Remote端的第三行加入一排的驚嘆號「!!!!!!」、再打開Local端加入一排的問號「?????」。
接下來一樣透過和git commit -m,將Local端的程式碼送進Repository。有趣的來了,當我們將輸入 git pull 將程式碼從Remote端拉下來到Local端這邊時:
1 | git pull |
Git表示:你們有一些衝突(conflicts),待解決完我才會幫你們成功把Remote端的東西融合到Local端這邊噢。先來打開Local端的hello.txt檔案:
最後再一次git commit、git add,最後用git push將目前這個版本「推送」到Remote端 (一樣須輸入GitHub帳號密碼)。
這時回到GitHub網站重新整理,可以發現…Remote端的程式碼從驚嘆號變成最新修改完成的問號了!
4. 切換(CHECKOUT), 開分支(BRANCH)與融合(MERGE)
branch
Git作為分散式版本管理系統的好處是不需仰賴中央單一一條主幹道開發,可根據開發需求、隨時在某一時間點開分支(branch)獨立開發某一項功能,待開發完成後再融合(merge)回去主幹道。
概念圖:
主幹(master)與分支(branch)是稱呼專案的主要版本和分支版本。在Git第一個建立的專案版本會被稱為master版本。
然而實際上master也僅是其中一條branch,所有branch間的關係都是平等的、彼此間無主從關係。一般習慣將穩定版本稱主幹,其餘的變動、開發中版本則都稱作分支。
開branch的方式非常簡單,直接輸入git branch 即可。git branch branch_a
是意圖:
checkout
目前master幹道上有五個commit的版本;若沒有指定要回溯至哪一個歷史版本,branch就會採用最新一次commit的版本。 但若我們想切到某一個commit版本開一條branch時
我們可以先輸入git log查看所有commit的歷史紀錄:
1 | git log |
選好回溯的時間點後使用 git checkout
(checkout後面輸入commit代碼至少6碼);待checkout過去之後,就可以開一條branch了:
1 | $ git checkout adb3238 |
但這邊我們只是先建立了一個branch噢,實際上我們人還待在master這條幹道上。
因此我們必須利用checkout的另外一個功能、也就是切換各條branch的功能! (別忘了master也只是其中一條branch)。輸入git checkout :
1 | $ git ckeckout branch_a |
輸入git branch -a可以查看目前我們開的所有branch:
1 | $ git branch -a |
輸入git branch -a可以查看目前我們開的所有branch(*代表當前所在位置):
1 | $ git branch -a |
當我們不想要這條branch時,可以用git branch -d 刪除:
1 | git branch -d branch_a |
MERGE
首先必須利用checkout回到想要merge過去的主幹道上;比如在此例中我們用git checkout回到master線上之後,再輸入要merge過去的branch名稱git merge 。
1 | $ git checkout master |
進階 Git reset 取消上一次的操作
取消 merge
版本控制最大的好處之一就是讓你永遠可以後悔,因此我們常會希望把已暫存的檔案、已提交的 commit 或是已合併的 branch 取消修改,這時候我們可以使用 git reset
這個指令來幫助我們,像現在我若是想要取消剛剛的 merge 動作,我只要下:
1 | $ git reset --hard ORIG_HEAD |
取消已暫存的檔案
有時候手殘不小心將還沒修改完的檔案使用 git add
加入了 stage
,這時候可以使用 git reset HEAD <file>
來將這支檔案取消 stage:
你可以看到我使用 git add
將檔案加入 stage 後,在我的 status 狀態顯示 lib/cat.rb 這支檔案現在已經準備好被 commit ,但這時我使用了 git reset HEAD
將這支檔案取消 stage,再使用 status 查看時它就變回一支還沒加入 stage 的檔案了。
取消修改過的檔案
連續剛剛的情況,若是我想完全放棄這次修改 (將檔案狀態回復到最新的一次 commit 時的狀態),我可以使用 git checkout -- <file>
來回復這支檔案:
1 | $ git checkout -- lib/cat.rb |
修改上一次的commit
手誤打太快, commit 訊息打錯時,我們可以使用 git commit –amend 來幫助我們重新修改:
.
在上面我想要修改打錯字的 commit 訊息 “Cat initiae”,因此我使用 git commit –amend 來修改成正確的訊息。
強制回復到上一次 commit 的版本
有時候我們想要放棄所有修改回到 commit 時的狀態,這時候我們可以下 git reset --hard HEAD
來回復,HEAD 參數可以加上一些變化,例如 HEAD^ 表示目前版本的上一個版本 HEAD~2 則是再上一個,因此你可以自由的跳回去之前的狀態。
如果您想要保存修改過的檔案,請勿下此指令,請用上面的方式去解決。!!