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