--- title: 20200702 Astro Camp Git程式碼速記 tags: Astro Camp, rails, vue --- # 20200702 Astro Camp Git程式碼速記 ## git 初始化 `$ git config --list` 確認作者資料 `$ git config --global user.name "xxxxx"` 增加作者名字 `$ git config --global user.email "xxxxx@xxx.com"` 增加作者信箱 `$ git init` git 初始化,創立資料夾後生成紀錄檔(/.git) ## add ![](https://i.imgur.com/qzB1zOq.png) `$ git add (檔名)` 將檔案從工作目錄移到暫存區域 `$ git status` 確認目錄下資料的狀態(是否add?) * untrack:目錄裡面沒有的(已新增尚未add) ``` $ git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) test.html nothing added to commit but untracked files present (use "git add" to track) ``` * modified:已修改尚未add ``` $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: test.html no changes added to commit (use "git add" and/or "git commit -a") ``` ## commit `$ git commit -m "存檔訊息"` 存檔訊息很重要,告訴別人此次存檔做了甚麼 如果沒有輸入,會進入vim畫面 `$ git log (--oneline)` 檢視git 的紀錄(所有commit 的資訊) (可用GUI輔助) `$ git restore (檔名)` 將被刪掉的檔案且尚未commit拿回來 *(add後尚未commit的也可以)* `$ git checkout` 可以是 restore,也可能是 switch ``` 相當於restore $ git checkout (commit ID) 檔案位置和檔名 $ git checkout 4e92 source/layout/index.html ``` 將專案內某一特定檔案回復成當時Commit的狀態 ``` 相當於Switch $ git checkout (commit ID) =>移動HEAD標籤,指到當時commit $ git checkout 分支名稱 =>移動HEAD標籤,指到分支貼紙上 (下次commit 分支貼紙會跟著移動) ``` ## 分支 `$ git branch 分支名稱 (commit ID)` `$ git checkout -b 分支名稱 (commit ID) ` * 開分支就是貼一張貼紙 * 若加上 commit ID 會在指定的節點貼上分支貼紙 * 用`checkout -b` 可以建立分支並切換過去 `$ git branch -d 分支名稱` 撕掉分支貼紙 * 若HEAD正站在你要刪除的分支上,會出現錯誤訊息 * d 改成 D 無提示直接刪除 `$ git merge (想合併的分支名稱)` Fast-forward模式(兩分支圖形上是上下關系) 不用輸入message 合併複雜分支的方式(圖形上有左右關係),會在兩分支的上方增加一個節點(未輸入message會進入vim畫面) `$ git rebase (想合併的分支名稱)` 另一種合併分支的方式,將現在的分支接(踩)在另一分支上 ## 刪除 & 復原 **git 中沒有刪除這件事,只能讓commit被隱藏、看不見** `$ git reset (commit ID)` 將標籤移到指定的commit,顯示當時的狀態 `$ git reset (commit ID) - -mixed (預設)` 多的commit會放到工作目錄 (要先add 在commit) `$ git reset (commit ID) - -soft` 多的commit會放到暫存 (可以直接commit) `$ git reset (commit ID) - -hard` 多的commit會直接拋棄 * commit ID 通常使用代名詞(分支的貼紙、標籤 或 HEAD) * "^" = Caret (倒退一步) 卡洛特 * *冷知識:有些commit 會有多個parent (^2 => 倒退到第二個parent)* * "~" = Tilde (~10) (倒退10步) 提爾達 `$ git reset HEAD^ - -hard` 回到上一步(類似 crtl + Z) * reset 會連分支貼紙一起移動,並把多出來的東西丟到工作目錄或暫存 * checkout 只移動HEAD,不會有東西移動到工作目錄或暫存 `$ git reflog` 是HEAD的移動軌跡紀錄 可以再用reset把被hard reset的檔案再度還原回來~~ ## 標籤 `$ git tag 2.0 (commit ID)` * 在指定的地方貼一張2.0的標籤 * 若沒有打ID,會在HEAD的地方貼 * 標籤不會移動,分支會隨著commit移動 *終端機指令 "cd -" => 回上一動* **"checkout -" 回上一動(有點像電視的往返鍵)** ## 常見的git遠端儲存庫 GitHub BitBucket GitLab Gitea ## 將本地git 推到GitHub ``` $ git remote .... ``` 建立遠端節點 ``` $ git remote -v ``` 是否有遠端節點 `$ git branch -a` 確認遠端節點 ``` $ git remote rm 節點名稱 ``` 刪除遠端節點 ``` $ git push origin master:cat ``` * 將本地master推到遠端origin,並在遠端形成一個cat分支。 * 若本地分支名稱跟想在遠端節點生成的分支名稱相同,則:cat省略。 ^^^不常用 ``` $ git push -u origin master ``` -u 是設定配對,以上面的例子,將master推到遠端origin,接下來只要打 ``` $ git push ``` 就會自動將master推到遠端origin,若要換配對,重新打就好。 ``` $ git push -u origin dog ``` ## 將專案從GitHub拉下來 ``` $ git fetch origin master ``` 要去origin遠端節點把master分支的東西抓下來,並建立一個origin/master的分支 **(需要再merge一次讓進度相同)** fetch 只是把東西抓下來,尚未合併,不會發生衝突。 ``` $ git pull = $ git fetch + $ git merge ``` ## 複製 ``` $ git clone 某個git網址 ``` 第一次碰到專案的時候會用,本地什麼都沒有的情況下無法使用fetch、pull,之後才能用fetch、pull。 ## 技術性的與上游的專案同步 ``` 1. $ git clone user網址 2. $ git remote add upstream(任意名稱) owner網址 3. $ git pull upstream master ``` 1. 複製自己fork的專案到本地 2. 設定一個名為upstream遠端節點,指向owner專案的網址 3. 將網路上遠端節點的東西拉下來到本地,並與本地的master合併。