1. 配置 GitHub SSH key
否則每次 push
到遠端都需要輸入 GitHub 的密碼。
$ ssh-keygen # 其實后面什么參數不加都行
之后可一路回車,生成的兩個文件默認存放在 ~/.ssh
目錄下。
打開 id_rsa.pub
文件,復制內容,找到 GitHub 的 Settings -> SSH and GPG keys -> New SSH key
,粘貼。
2. 新建 GitHub repository
按照網站的提示就好,注意有一個 Add .gitignore
選項,這個文件非常必要,指示了 Git repo 中無需提交的目錄或文件,我們可以選擇一門熟悉的編程語言,建立后打開這個文件看一看。
3. Clone 這個 repo:clone
請選擇 SSH 地址,形如 git@github.com:username/reponame.git
,之后
$ git clone git@github.com:username/reponame.git
這時你可以看到當前目錄下新的 reponame
文件夾了。
4. 從鍵盤到網絡——提交:status / add / commit / push
這部分講解一個文件從創建到被 push
到 GitHub repo 的各個步驟: add -> commit -> push
。
- add 命令的最基礎用法
進入reponame
目錄,新建一個文件 new0.txt
,內容為數字 1
。使用
$ git status
隨時查看工作區和暫存區的變化。
使用
$ git add new0.txt # 也可以使用 git add -A 提交當前目錄的全部修改
將改動添加到暫存區 stage
。
注:關于工作區、暫存區和版本庫 的概念,請點擊這里查看。這十分重要,下面的內容默認你已經理解了這些概念。
- commit 命令的最基礎用法
使用
$ git commit -m "initial commit" # -m 參數指定對于本次 commit 的說明,以便使人明白它的目的
如果是第一次使用 git,需要根據提示設置你的 name
和 email
,這些內容將會包含在今后的 commit 信息中。
- push 命令的最基礎用法
使用
$ git push
將本地 repo 的改動 push
到遠程 origin
repo,默認使用 origin
指代遠程 repo。
這時我們可以從 GtiHub 上看到改動了。
5. 從網絡到鍵盤——回退:checkout / reset / log / reflog / revert
這部分講解當我們風風火火瞎操作之后,如何回到之前的狀態。根據操作進程,回退可以分為以下情況:
- 修改之后立即回退
目前我們的工作區中有一個 new0.txt
,內容為 1
。將內容修改為 2
。
使用 $ git status
查看狀態,便可以看到提示:
use "git checkout -- <file>..." to discard changes in working directory
按照提示使用
$ git checkout -- new0.txt # 注意文件名前的空格
再用 $ cat new0.txt
查看內容,發現已經變回了 1
。
注:如果我們新建了一個 new1.txt
,這個命令會將 new1.txt
刪除掉嗎?這涉及到 $ git checkout -- <file>
究竟做了什么。有興趣的可以在閱讀完下個小節后,點擊這里多了解一下。
- add 后回退
同樣,修改 new0.txt
內容為 2
。之后
$ git add -A
可以看到提示
use "git reset HEAD <file>..." to unstage
照貓畫虎
$ git reset HEAD new0.txt
之后我們便回到了上一小節的狀態,可以繼續使用 checkout
命令了。
- commit 后回退
在本小節和下一小節中會使用 reset
和 revert
兩個命令,主要講前者。
不難想象,每一個 commit
必有其編號(這里的 commit 是名詞)。使用
$ git log
查看所有的 commit
,比如你想回退到誤操作的上一次 commit
,那么就在列表中復制從上數的第二項內容里的 commit_id
,也就是一大串數字密碼的組合(只需復制前幾位即可,當然全復制下來也沒問題)。
然后使用
$ git reset --hard <commit_id> # 若只撤銷一次 commit,也可以使用 git reset --hard HEAD^
在更特殊的情況下,我們需要恢復剛剛被撤銷的 commit
,而這時 log
里已經找不到它的 commit_id
了,怎么辦!別怕,口中輕吟“天空飄來五個字”,手指不慌不忙不亂不抖而又非常優雅地敲下
$ git reflog
你會懂的。
- push 后回退
由于我們的操作一直是在本地的 repo,要想在 push
到遠端 repo 后回退,那么思路便是在本地先回退,再 push
到遠端。
所以我們可以先用上一小節的方法,撤銷 commit
,然后再用
$ git push --force # 不加 --force 會提示本地的進度落后于遠端而失敗
強行 push
。
其實,在這里 revert
是更好的選擇。revert
相當于將 repo 內容的回退視作一次新的修改,從而建立一次新的 commit
。而 reset
相當于直接刪除一次 commit
。
關于 revert
的用法,請自行查詢。
6. 從一人飲酒醉到阿里郎體操——分支
這部分是理解 git 的核心部分,但寫起來太累了,又必須要配圖,直接點擊這里查看廖雪峰的教程。也包括之后的「解決沖突」部分。