# Git + GitHub / GitLab操作 ###### tags: `好想工作室` 2021.04.14(Wed.)~04.16(Fri.) >參考: [2.5 Git 基礎 - 與遠端協同工作](https://git-scm.com/book/zh-tw/v2/Git-%E5%9F%BA%E7%A4%8E-%E8%88%87%E9%81%A0%E7%AB%AF%E5%8D%94%E5%90%8C%E5%B7%A5%E4%BD%9C) >參考: [Git教學:如何 Push 上傳到 GitHub?](https://gitbook.tw/chapters/github/push-to-github.html) ## 0.遇到的問題 (A)**git跑出"no next tag (press return)"訊息:** > 解決方法:[$git log waits for me to write smth](https://stackoverflow.com/questions/13412572/git-log-waits-for-me-to-write-smth) 按下`q`,就可以解決了! (B)**SSH Key 的建立與設定:** > 解決方法:[Git: Permission denied (publickey) fatal - Could not read from remote repository. while cloning Git repository](https://stackoverflow.com/questions/21255438/git-permission-denied-publickey-fatal-could-not-read-from-remote-repository) > 解決方法:[Git 版本控制筆記 - 使用 github 及 ssh 金鑰設定](https://blog.jaycetyle.com/2018/02/github-ssh/) > 影片參考:[SSH Key 的建立與設定](https://www.youtube.com/watch?v=CeC_qyQHiCE) 先來第一個指令,這個指令他會幫你做出一對鑰匙: 這對鑰匙,一個叫公鑰(public key)、一個叫私鑰(private key) ``` $ ssh-keygen ``` 切記!私鑰絕對不能給出去,要給出去的都是公鑰。 ## 1.與遠端協同工作 **與其它人協同工作包括了:** (A)「管理」遠端版本庫 (B)將分享的資料「推送(push)」到端遠版本庫 (C)從遠端版本庫「拉取(pull)」分享的資料 **管理遠端版本庫包括了了解如何:** (A)「新增」遠端版本庫 (B)「移除」不再有效的遠端版本庫 (C)管理各式各樣的「遠端分支」 (D)定義遠端分支是否被「追蹤」 ## 2. Push 上傳到 GitHub ``` $git remote add origin https://github.com/NoZ-design/git-practice.git $git push -u origin master ``` (A)**第一條指令:** ``` $ git remote add origin https://github.com/NoZ-design/git-practice.git ``` * `$ git remote` 指令:顧名思義,主要是跟遠端有關的操作。 * `add` 指令:是指要加入一個遠端的節點。 * `origin` :「代名詞」(可依自己喜好更改),指的是後面那串 GitHub 伺服器的位置。 在慣例上,遠端的節點預設會使用 origin 這個名字。 如果是從 Server 上 clone 下來的話,它的預設的遠端節點就會叫 origin。(關於 Clone 的使用,請參閱「[從伺服器上取得 Repository](https://gitbook.tw/chapters/github/clone-repository.html)」章節說明) (B)**第二條指令:** ``` $ git push -u origin master ``` 先不管`-u`,`origin master`指的是在我本機的`master`這個分支,推一分到`origin`這個節點來,並且在`origin`這個遠端的線上,形成一個叫做`master`的分支。 簡單來說,就是把`master`推上去,在線上形成`master`的分支。 * 把 `master` 這個分支的內容,推向 `origin` 這個位置。 * 在 `origin` 那個遠端 Server 上,如果 `master` 不存在,就建立一個叫做 `master` 的同名分支。 * 如果本來 Server 上就存在 `master` 分支,便會移動 Server 上 `master` 分支的位置,使它指到目前最新的進度上。 * 設定 upstream(上游),就是那個 `-u` 參數做的好事,所以有加上 `-u` 的話,下次直接打`$git push`,就會預設推上 `origin` 。 **補充:** ``` $ git push -u origin master:cat ``` 後面多了個冒號,其實原本也有,只是預設就是:master,所以就省略看不見了。 那這句的意思就是說,我要把本地的`master`,推一份到遠端的節點`origin`,並且在遠端的節點形成一個`cat`的分支。 <font color="red">**重點總結:**</font> 大概整理下推檔案上去的步驟: ``` //沒檔案先自己新增檔案(可忽略) $ touch file.html //對目錄做初始化 $ git init //讓檔案正式被git追蹤,把檔案放到暫存區(Staging Area) $ git add . //提交修改,正式把檔案放到儲存庫(repository) $ git commit -m"任何你想紀錄的內容" //上述過程做完後,進入到GitHub部分 //將本地數據庫加入遠端數據庫 $ git remote add origin https://github.com/NoZ-design/git-practice.git //把東西推上去囉!第一次加個 -u $ git push -u origin master //第一次有加個 -u,那後面輸入就很簡單 $ git push ``` > 參考網站:[將本地數據庫加入遠端數據庫](https://w3c.hexschool.com/git/fd426d5a) ## 3. Pull下載更新 (A)**Fetch 指令:** 線上版本的 Commit 數就領先本機時,就可以使用fetch。畢竟我們是要從遠端下載東西到我們這邊,所以遠端的東西總要比我們多,做更新才有意義。也就是說Git 看了一下線上版本的內容後,他會把你目前線上有但你這邊沒有的內容抓一份下來到你這邊。 ``` $ git fetch ``` (B)**Pull 指令:** 先來個結論:git pull = git fetch + git merge,也就是說Pull 指令就是去上線抓東西下來(Fetch),並且更新本機的進度(Merge)。 ``` $ git fetch ``` ``` $ git merge ``` 完成上面兩個步驟,本機這邊也就會做好更新了。 (C)**Pull指令 + Rebase參數:** 用一般的方式((B)方式)合併的時候常會產生為了合併而產生的額外 Commit,雖然產生的這個 Commit 本身並沒有什麼問題,不過如果你不想要這個額外的 Commit,可考慮使用 Rebase 方式來進行合併。 ``` $ git pull --rebase ``` ## 4. 從伺服器上取得 Repository 如果在GitHub中看到有興趣的專案,想要下載下來使用,可以使用clone指令把整個專案下載下來。 ``` //clone後面那串字可以在專案中「Clone or download」的按鈕複製得到 $ git clone git@github.com:kaochenlong/dummy-git.git ``` 如果想要 Clone 下來之後存成不同的目錄名稱的話,只要在後面加上目錄的名字即可: ``` $ git clone git@github.com:kaochenlong/dummy-git.git hello_kitty ``` 這裡複製的是SSH,所以使用前先設定好SSH Key 的建立與設定(可參考最上方「0.遇到的問題」) **補充:** Clone 跟 Pull 指令有什麼不一樣? 如果這個專案你是第一次看到,想要下載到你的電腦裡,請使用 Clone 指令;如果你已經下載回來了,你只是想要更新最新的線上版內容,請使用 Pull(或 Fetch)指令。 簡單的說,Clone 指令通常只會使用第一次,Clone 之後的更新,就是 Pull/Fetch 的事了。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up