Git 入門 (二):遠端操作 (使用 GitHub 的伺服器)、檔案狀態與還原

所謂的遠端操作,就是將本地端(電腦)版本控制狀態的資料傳送到遠端伺服器上,我們要使用的是最有名的 GitHub,它是最大的 Git (版本控制系统軟體) 服務提供商 (Git Server)。

使用 GitHub 的好處有如下幾點:

  1. 程式碼托管 (其實就是備份在 GitHub 的伺服器)
  2. 項目管理 (它最初是為了管理開發項目而產生)
  3. 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
2
3
4
$ cd 資料夾1/資料夾2/.../資料夾n/目標資料夾
$ git init
$ git add <資料名稱 or .>
$ git commit -m "first commit"

指令說明:
cd:移動到"xx資料夾"。
init:初始化。
add:想要增加什麼資料到儲存庫中。例如:想要買東西前,要先列一個清單。網購時,要先把物品加到購物車。
.:加入全部的檔案的意思。
commit:英文有「把xx交託給a;把xx提交給a」的含義。也就是確定把剛剛列的清單中的檔案,交給儲存庫的意思。
-m:message,後面的訊息請加 ""雙引號

到這邊都還是在對本地端的檔案,進行版本管理。

Push an existing repository from the command line

如果你的檔案已經在版本管理的狀態下,就直接或接著上面的指令輸入下面兩行指令碼。

1
2
$ git remote add origin https://github.com/jenifers001d/test.git
$ git push -u origin master

指令說明:
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)