Git 入門 (二):遠端操作 (使用 GitHub 的伺服器)、檔案狀態與還原
所謂的遠端操作,就是將本地端(電腦)版本控制狀態的資料傳送到遠端伺服器上,我們要使用的是最有名的 GitHub,它是最大的 Git (版本控制系统軟體) 服務提供商 (Git Server)。
使用 GitHub 的好處有如下幾點:
- 程式碼托管 (其實就是備份在 GitHub 的伺服器)
- 項目管理 (它最初是為了管理開發項目而產生)
- Github Pages(可以產生靜態網頁,即
gh-pages
分支)
除了 GitHub 之外,還有:
Bitbucket:可擁有私人數據庫,免費方案是五人以下團隊。(公司專案的小型團隊可用)
GitLab:自架 Git 伺服器,有提供 web 視覺化管理介面,常用於企業內部開發
在GitHub(遠端伺服器)中新開一個儲存庫(repository)後…
儲存庫:可以進行版本管理的資料夾
下圖中,可以看到有兩個區塊的指令
Create a new repository on command line
如果你想傳到 GitHub 上的資料,還沒有在版本管理的狀態下,那麼你需要使用終端機或命令提示字元,創建一個本地端的 repository (其實就是對原本一般的資料夾進行初始化 init
動作,想像成使一般的資料夾,新增一個可以進行版本管理的資料夾,也就是 .git
資料夾)
通常 Windows 和 Mac 系統的終端機一打開就是使用者底下的名稱的位置(不知道怎麼形容,哈哈哈),如下圖。
記得使用 cd
指令,一層一層移動到你的目標資料夾後,輸入如下第二行指令碼。例如我是在桌面裡建一個 JeniferCodeWorld 資料夾,就在裡面進行 init。
1 | $ cd 資料夾1/資料夾2/.../資料夾n/目標資料夾 |
指令說明:
cd:移動到"xx資料夾"。
init:初始化。
add:想要增加什麼資料到儲存庫中。例如:想要買東西前,要先列一個清單。網購時,要先把物品加到購物車。
.:加入全部的檔案的意思。
commit:英文有「把xx交託給a;把xx提交給a」的含義。也就是確定把剛剛列的清單中的檔案,交給儲存庫的意思。
-m:message,後面的訊息請加""雙引號
。
到這邊都還是在對本地端的檔案,進行版本管理。
Push an existing repository from the command line
如果你的檔案已經在版本管理的狀態下,就直接或接著上面的指令輸入下面兩行指令碼。
1 | $ git remote add origin https://github.com/jenifers001d/test.git |
指令說明:
remote:遠端儲存庫。
origin:為遠端儲存庫命名、貼一個標籤。通常是 origin,也可以不一樣。
:剛剛新開的github儲存庫的位置。
git remote add:告知本地端的儲存庫,遠端伺服器上有一個儲存庫,標籤名是什麼,位置在哪,我要拿來使用並管理檔案。
push:將本地端版本管理狀態下的檔案,推上去遠端的儲存庫。
git push<遠端分支名稱>:上傳本地端分支修改內容到,標籤名為xx的遠端數據庫的xx分支。
-u:等同於 --set-upstream,將遠端分支設為追蹤目標 (預設會推到哪個遠端儲存庫),會將本地端分支 (如:master) 和遠端分支 (如:origin/master) 建立連結,往後只需要輸入 git push 即可。可不加,需要一直輸入 git push origin master (指定推送位置)。
如果今天要開第二個遠端儲存庫,orgin 已經是第一個遠端儲存庫的名字了,第二個遠端儲存庫的命名就要用不一樣的。
想要切換到不同 git 版本下,查看檔案的狀態
先用 git log
查看版本號
HEAD 指標、reference,是用來標記當前位置。checkout
可以將 HEAD 移動到特定位置,但是不移動分支標籤。
- 回頭觀看版本內容:
git checkout commit編號
- 返回最新的版本:
git checkout master(分支名稱)
使用 Sourcetree 直接點兩下就好。
HEAD 指向 master,Sourcetree 左側欄也可以看到 master 是粗體:
HEAD 指向 eb7c240,Sourcetree 左側欄可以看到多了一個 HEAD 粗體:
檔案狀態
- 檔案新增後還沒輸入
git add <file>
=> 未追蹤- Untracked (紅:untracked_1.html)
- 檔案新增後輸入
git add <file>
=> 已加入索引- new file (綠:newIndex.html)
- new file (綠:second.html)
- new file (綠:not_staged_for_commit_*.html)
- new file (綠:this_is_to_be_committed_*.html)
- 檔案已被 commit 過,又被編輯但還沒有輸入
git add <file>
=> 未加入索引- modified (紅)
- 新增檔案加入索引
(git add)
後,在 commit 前又修改內容,但又還沒輸入git add <file>
=> 未加入索引- modified (紅:newIndex.html)
- modified (紅:not_staged_for_commit_*.html)
檔案還原技巧
Modified / Deleted => Unmodified (Working directory)
- Undo 編輯過的檔案、還原已加入索引但是被刪除的檔案:
git checkout --<file>
把暫存區裡的所有檔案,拿來覆蓋工作區的所有檔案。如果一個 untracked file 被刪除,是沒有辦法用此方法復原的。
【狀況題】啊!不小心把檔案或目錄刪掉了…
Index / Staging area => Working directory
- 將索引區的檔案放回工作目錄:
git reset HEAD
(還原到該版本原先的樣子)
版本還原:reset
- git reset:【狀況題】剛才的 Commit 後悔了,想要拆掉重做…
- 還原 HEAD 前兩個版本,檔案退回索引區狀態:
git reset HEAD^^ --soft
- 還原 HEAD 前兩個版本,檔案退回工作區狀態:
git reset HEAD^^ --mixed
- 還原 HEAD 前兩個版本 (預設是 --mixed):
git reset HEAD^^
- 還原 HEAD 前兩個版本,所有更新檔案都放棄:
git reset HEAD^^ --hard
- 還原到特定 commit:
git reset commit編號
- 觀看詳細歷史紀錄:
git reflog
使用 reset 記得是以當前 HEAD 位置為基準。
實際上 git reset
指令不是真的刪除或是重新設定 commit,而是讓 HEAD 「前往」到指定的 commit編號,那些看起來好像不見的東西只是暫時看不到,但隨時都可以再撿回來。
如果 HEAD 和分支標籤黏在一起的時候,分支標籤會跟著 HEAD 一起移動。
參考資料:
六角學院 -「Git 遠端 Repository 操作」線上講義
Git 入門 系列文
Git 入門 (一):介紹和基本指令
Git 入門 (二):遠端操作 (使用 GitHub 的伺服器)、檔案狀態與還原 ← 你在這~
Git 入門 (三):分支 (branch)、下載遠端儲存庫 (clone)
Git 入門 (四):取得遠端新檔案並合併 (fetch + merge = pull)、衝突 (conflict)