# Git :::info 日期 : 2024/03/31 課程影片 : [Git 跟Github 實用攻略](https://www.youtube.com/watch?v=Luu7V9Nx1EM) ::: Git --- * 程式碼總結 第一次上傳文件的所有程式碼: ``` git init git config --global user.email "email" git config --global user.name "user name" git add . // 添加資料夾下面的所有文件 git commit -m "first commit" // ""是提交說明 git remote add origin https://github.com/repository網址 git push -u origin master // 上傳到github倉庫(-u代表現在為空) ``` 上傳時倉庫非空時,最後一句改為: ``` git push origin master ``` ----- Git語法 --- * 程式碼總結 ```python git init:建立 .git 資料夾進行追蹤(.git資料夾是隱藏起來的)。 git status:git 狀態。 git add index.html:上傳單一檔案到 staging area. git add . :上傳全部檔案到 staging area。 git add -u:只上傳修改過的檔案到 staging area. git commit -m "填寫此版本資訊":commit 到 Local Repository。 git log:commit 的歷史。 git stash : 獲取目前工作目錄的 dirty state,並保存到一個未完成變更的 stack,以方便隨時回復至當初的 state。 git reflog:commit 的歷史(包含被 reset 過的檔案)。 git reset HEAD^:還原 commit 並將檔案退回到工作目錄,一個^代表退回一個,也可用數字 HEAD^2。 git reset HEAD^ --hard:還原 commit 並刪除檔案。 git reset < commit 編號 > :可以還原已被刪除的 commit。 git revert : 去除錯誤更新 git rebase -i HEAD~融合數字 : 融合多個log紀錄(只需選一個) git branch:查看分支。 git branch name:新增分支。 git branch - < old name >< new name >:更改分支名字。 git branch -D [BRANCH_NAME] : 強制刪除指定分支(須先切換至其他分支再做刪除)。 git checkout:移動分支。 git merge:合併分支,有兩種情況。 git reset --hard [HASH] : 強制恢復到指定的 commit(透過 Hash 值)。 git checkout [HASH] : 切換到指定的 commit(與 git checkout [BRANCH_NAME] 相同)。 ``` ```python 專案遠端指令 git remote:查看遠端數據庫列表。 git remote -v:查看遠端數據庫列表(含 url)。 git remote add <遠端數據庫名稱><遠端數據庫url> :建立遠端數據庫。 git push : 將本地端 Repository 的 commit 發佈到遠端。 git push origin <數據庫名稱,預設為 origin>:上傳到遠端數據庫。 git push -u origin branch : 上傳新的分支到github上 git pull <數據庫名稱><分支名稱> :下載同步更新本地數據庫。 git pull origin main : 把主線分支的存檔抓到支線上 git clone "url":下載遠端數據庫。 ``` ------- ```python git status : 顯示工作目錄狀態,整體版控情況,會顯示已經改過的檔案為紅色 git show (change things) : 查看被改的地方,刪除為紅,新增為綠 git log : 整個文件被編輯的歷程 git commit --amend (do not go code review everytime) : 可以改commit內容或是code,換code內容的話,需要先add,再用amend git commit --amend --no-edit : amends a commit without changing its commit message git commit -m "test" : 註解 git add git checkout branch名 : 移到該線上 git merge branch名 : 在主線上,把支線合併 git merge main : 在支線上,把主線合併 git rebase -i origin/mianline的log id : git rebase -i HEAD~融合commit總量 : 把多個commit合成一個,融合多個log紀錄(只需選一個) git fetch : 把遠端最新內容拉到local git pull : 把遠端最新內容拉到local後直接合併 如果remote有A-B-C-DEV_COMIT 我現在有A-B-C-YU 先git fetch 再來 rebase -i origin/mianline 可以變成A-B-C-DEV_COMIT-YU 冒號+x+! : 儲存退出 冒號+q+! : 退出 ``` ![image](https://hackmd.io/_uploads/rJIDocLQC.png) ------- .gitignore 可以加上不想要被 commit 的檔案 *.gitignore 需要加到 repo ------- cherry-pick --- 只挑自己想要的commit合併到master * master 第一個commit: 新增 test.py 接著第二個commit: 在 test.py 新增兩個 func1, func2 * 切分支作 現在因為要新增一些功能,所以我切出一條 dev 的分支,在上面開始做一些開發的動作: 1. 新增 func3 2. 新增 func4 3. 新增 readme.md 文件,並加註說明 4. 新增 hot_fix function * 情境 需要加readme但不想要把整個dev都合併到master裏頭 ``` $ git checkout master // 轉到 $ git cherry-pick 49a43bf // 要拼接的commit hash(按照先後順序) ``` ------- 參考資料 https://blog.csdn.net/weixin_43629813/article/details/113824388 https://medium.com/%E7%A8%8B%E5%BC%8F%E4%B9%BE%E8%B2%A8/git-cherry-pick-%E4%BD%BF%E7%94%A8%E5%A0%B4%E6%99%AF-59ac61723bfe https://jim1105.coderbridge.io/2022/08/21/git-commands/