###### tags: `筆記` `Git` # 🌗[N]Git概念、常用語法 ![](https://i.imgur.com/slRhyLr.png) ## Git介紹 Git 是一種==分散式版本的版本控制系統(Version Control System)==,它可以快速又有效率的管理專案,並提供各種作業系統平台版本,==免費==自由下載使用,建立個人或團隊的版本控制,可以==協助開發人員同步開發==。 **為什麼要使用Git?** 假如,今天你想保留編輯前的檔案,方便編輯後不滿意還可以找回原檔會怎麼做? 我想大多數的人都是會直接在編輯前先複製一份,然後再對檔案做編輯,並在檔名上依照日期命名,但這麼時間一長就很容易造成檔名混亂,且不清楚內容到底改了什麼還需要一支一支點開來看。 ![](https://i.imgur.com/MwJ7KPc.png) 或許一個人的時候,可能還可以接受這樣的方式運作,因為檔名都是依照自己既有的方式命名,檔案可能也沒有多少支,頂多就多花一些時間找檔案罷了,但今天如果是跟團隊要一起維護專案呢? 那麼就來假設今天團隊要維護專案,開了一個用共的資料夾,為了解決上面的問題,他們決定不保留舊的檔案,直接對目前的檔案做修改,這麼一來就沒問題了吧!,但過了一陣子他們發現,在兩個人要同時修改一個檔案的時候,很常會有B把A調整的東西給蓋掉了...... ![](https://i.imgur.com/IRwt2lc.png) 而Git的出現就是為了解決上面所說的上些問題,我們可以透過使用Git來做好版本控制,Git不僅可以幫我們解決檔案編輯新舊的問題,也會替我們在檔案被兩人同時編輯後做整合的處理,最棒的就是他甚至可以在兩人編輯有衝突(同時編輯到同一段)時提醒我們讓我們來自行處理衝突的地方。 網路也有許多教學文章,目前也有許多厲害的現成圖形介面工具,可以讓使用者不需要打複雜指令界可以輕鬆的使用Git功能(ex. `SourceTree`)。 ### 運行概念 ### 分支運用 #### #Git Flow ![](https://i.imgur.com/Q7fHbDk.png) ### 常用語法 ```git= git clone <url> #複製版本庫 git clone <url> <repo_name> #複製版本庫,並將資料夾命名為repo_name git init #初始化新版本庫,目錄中生成一個.git資料夾 git init --bare #創建一個無本地分支的庫,當需要一個公共的中央庫時,初始化為bare git status #當前Git狀態 git add <file list> #將檔加入跟蹤或者將修改後的檔放入暫存區(staging area) git add -u #只增加修改過的檔,新增的檔不加入 git add -i #進入互動模式 git rm <file> #git刪除檔 git mv <old_file> <new_file> #git重命名檔 git checkout HEAD <file list> 或者 git checkout -- <file list> #撤銷指定檔列表尚未暫存的修改 git checkout HEAD . #撤銷所有尚未暫存的修改 git checkout <版本號> . #將所有檔都恢復到指定版本號所在的狀態 git reset HEAD 或者 git reset HEAD <file list> #撤銷指定檔列表尚未提交的修改 git reset <版本號> #撤銷指定版本號之後的所有提交 git commit #提交當前暫存區的修改 git commit -m '<message>' #輸入提交資訊,跳過檔編輯message階段 git commit -a #直接提交所有修改的檔,跳過暫存階段,但新增加的檔還需要先add git commit -v #提示當前commit的修改記錄 git commit --amend #修改最後一次提交的message git diff #顯示當前位置與暫存區的差異 git diff --cached #顯示已經暫存的檔和上次提交時的快照之間的差異 git diff <file> #顯示file檔還沒有暫存起來的變化內容 git diff --cahced <file> #顯示已經暫存的file檔和上次提交時的快照之間的差異 git diff <前版本號>..<後版本號> #比較兩個版本號之間的差異 git diff <前版本號>..<後版本號> <file> #比較指定檔在兩個版本號之間的差異 git log #歷史記錄 git log <file> #查看file的所有log git log <directory> #查看directory目錄的所有log git log -p #詳細日誌,包括檔變動明細 git blame <file> #關於file的所有commit記錄 git show <版本號> #查看指定版本號的提交內容 git show <tag> #查看指定tag的提交內容 git show <tag>:<file> #查看指定tag中file檔的修改內容 git show HEAD #查看此版本提交的內容 git show HEAD^ #查看上一版本(父版本)提交的內容 git show HEAD^^ #查看(祖父版本)提交的內容 git show HEAD~4 #查看第四個祖先提交的內容 git stash #丟進暫存區 git stash list #列出所有暫存區的資料 git stash pop #取出最新的一次暫存的資料, 並從暫存區移除 git stash apply #取出最新的一次暫存的資料, 但不從暫存區移除 git stash clear #清理stash git remote #顯示遠端倉庫名稱 git remote -v #顯示遠端倉庫名稱和位址 git remote show #同git remote git remote show <remote> #查看名為remote的遠程倉庫 git remote add <remote> <remote_url> #添加遠程庫的別名 git remote rm <remote> #刪除遠端庫和相關分支 git pull #獲取併合並到當前本地分支 git pull <remote> <branch> #獲取remote庫branch分支,併合並到本地的branch分支 git pull <remote> <remote_branch>:<local_branch> #提取遠程的remote_branch,並更新到local_branch git push <remote> <branch> #提取本地的branch分支,並更新到遠端倉庫的branch分支 git push <remote> <local_branch>:<remote_branch> #提取本地的local_branch分支,並更新到遠端倉庫的分支remote_branch,如果remote_branch不存在,則在遠端倉庫新建remote_branch分支 git push <remote> :<remote_branch> #刪除遠端分支remote_branch git checkout -b <local_branch> <remote>/<remote_branch> #在本地新建local_branch分支,用來跟蹤遠端的remote_branch分支 git checkout --track <remote>/<branch> #在本地新建branch分支,用來跟蹤遠端的branch分支(git1.6.2之後) git branch #列出本地分支 git branch -r #列出遠端分支 git branch -a #列出所有分支 git branch -v #每個分支最後的提交 git branch <branch> #基於當前分支的末梢創建新分支 git branch <branch> <提交、分支或標籤> #基於某次提交、分支或標籤創建新分支,用來查 ``` [學習GIT分支](https://learngitbranching.js.org/index.html?locale=zh_TW) [Git 概念、常用語法及 GitHub 使用介紹](https://hackmd.io/@Yu040419/SyHrpos6V) [[Git]常用指令整理](https://dotblogs.com.tw/grayyin/2017/01/04/211514) [Git Flow 是什麼?為什麼需要這種東西?](https://gitbook.tw/chapters/gitflow/why-need-git-flow.html)