git remote add origin <git倉庫地址>
# 如下三種方式都可 git config get --remote.origin.url git remote -v git remote show origin
git remote rm origin
接下來以添加 github ssh keys 爲例,請注意替換 github 文件名:php
# 運行如下命令,一直回車,文件名可隨意指定 ssh-keygen -t rsa -b 4096 -C "kaiye@macbook" -f ~/.ssh/github # 若是不是默認密鑰 id_rsa ,則須要如下命令註冊密鑰文件 ssh-add ~/.ssh/github # 將 pub 公鑰的內容粘貼到線上網站的後臺 cat ~/.ssh/github.pub # 測試 git ssh 是否鏈接成功 ssh -T git@github.com
修改包含四種狀況,需單獨區分。git
此類文件的狀態爲 Untracked files
,撤銷方法以下:github
git clean -fd .
其中,.
表示當前目錄及全部子目錄中的文件,也能夠直接指定對應的文件路徑,如下其餘狀況相似。服務器
此類文件的狀態爲 Changes not staged for commit
,撤銷方法:app
git checkout .
此類文件的狀態爲 Changes to be committed
,撤銷方法:ssh
git reset .
執行以後文件將會回到以上的 1 或者 2 狀態,可繼續按以上步驟執行撤銷,若 git reset 同時加上 --hard
參數,將會把修改過的文件也還原成版本庫中的版本。編輯器
每次提交都會生成一個 hash 版本號,經過如下命令可查閱版本號並將其回滾:svn
git log git reset <版本號>
若是須要「回滾至上一次提交」,可直接使用如下命令:工具
git reset head~1
執行以後,再按照 1 或者 2 狀態進行處理便可,若是回滾以後的代碼同時須要提交至 origin 倉庫(即回滾 origin 線上倉庫的代碼),須要使用 -f
強制提交參數,且當前用戶須要具有「強制提交的權限」。gitlab
若是是以上的狀況 1 或者 2,只能歇屁了,由於修改沒入過版本庫,沒法回滾。
若是是狀況 4,回滾以後經過 git log 將看不到回滾以前的版本號,但可經過 git reflog
命令(全部使用過的版本號)找到回滾以前的版本號,而後 git reset <版本號>
。
兩個分支進行合併時(一般是 git pull 時),可能會遇到衝突,同時被修改的文件會進入 Unmerged
狀態,須要解決衝突。
大部分時候,「最快解決衝突」的辦法是:使用當前 HEAD 的版本(ours),或使用合併進來的分支版本(theirs)。
# 使用當前分支 HEAD 版本,一般是衝突源文件的 <<<<<<< 標記部分,======= 的上方 git checkout --ours <文件名> # 使用合併分支版本,一般是源衝突文件的 >>>>>>> 標記部分 git checkout --theirs <文件名> # 標記爲解決狀態加入暫存區 git add <文件名>
用編輯器打開衝突的源文件進行修改,可能會發生遺留,且體驗很差,一般須要藉助 git mergetool 命令。
在 Mac 系統下,運行 git mergetool <文件名>
能夠開啓配置的第三方工具進行 merge,默認的是 FileMerge 應用程序,還能夠配置成 Meld 或 kdiff3,體驗更佳。
有三個好的習慣,能夠減小代碼的衝突:
git pull
一下;若是你的項目週期比較長,還應該養成「按期 rebase 的習慣」,git pull --rebase
可讓分支的代碼和 origin 倉庫的代碼保持兼容,同時還不會破壞線上代碼的可靠性。
它的大概原理是,先將 origin 倉庫的代碼按 origin 的時間流在本地分支中提交,再將本地分支的修改記錄追加到 origin 分支上。若是發生衝突,則能夠即時的發現問題並解決,不然到項目上線時再解決衝突,可能會發生額外的風險。
rebase 大概的操做步驟以下:
# 將當前分支的版本追加到從遠程 pull 回來的節點以後 git pull --rebase # 若發生衝突,則按以上其餘方法進行解決,解決後繼續 git rebase --continue # 直到全部衝突得以解決,待項目最後上線前再執行 git push origin # 若屢次提交修改了同一文件,可能須要直接跳事後續提交,按提示操做便可 git rebase --skip
有些修改沒有徹底完成以前,可能不須要提交到版本庫,圡方法是將修改的文件 copy 到 git 倉庫以外的目錄臨時存放,pull / merge 操做完成以後,再 copy 回來。
這樣的作法一個是效率不高,另一個可能會遺漏潛在的衝突。此類需求最好是經過 git stash
命令來完成,它能夠將當前工做狀態(WIP,work in progress)臨時存放在 stash 隊列中,待操做完成後再從 stash 隊列中從新應用這些修改。
如下是 git stash 經常使用命令:
# 查看 stash 隊列中已暫存了多少 WIP git stash list # 恢復上一次的 WIP 狀態,並從隊列中移除 git stash pop # 添加當前 WIP,注意:未提交到版本庫的文件會自動忽略,只要不運行 git clean -fd . 就不會丟失 git stash # 恢復指定編號的 WIP,同時從隊列中移除 git stash pop stash@{num} # 恢復指定編號的 WIP,但不從隊列中移除 git stash apply stash@{num}
默認的 git log 會顯示較全的信息,且不包含文件列表。使用 --name-status
能夠看到修改的文件列表,使用 --oneline
能夠將參數簡化成一行。
git log --name-status --oneline
每次手動加上參數很麻煩,能夠經過自定義快捷命令的方式來簡化操做:
git config --global alias.ls 'log --name-status --oneline --graph'
運行以上配置後,可經過 git ls
命令來實現「自定義 git log」效果,經過該方法也能夠建立 git st
、 git ci
等一系列命令,以便沿用 svn 命令行習慣。
更多 git log 參數,可經過 git help log
查看手冊。
若是是看上一次提交的版本日誌,直接運行 git show
便可。
例如,在執行 git submodule update 時有如下錯誤信息:
fatal: reference is not a tree: f869da471c5d8a185cd110bbe4842d6757b002f5 Unable to checkout 'f869da471c5d8a185cd110bbe4842d6757b002f5' in submodule path 'source/i18n-php-server'
在此例中,發生以上錯誤是由於 i18n-php-server 子倉庫在某電腦 A 的「本地」commit 了新的版本 「f869da471c5d8a185cd110bbe4842d6757b002f5」,且該次 commit 未 push origin。但其父級倉庫 i18n-www 中引用了該子倉庫的版本號,且將引用記錄 push origin,致使其餘客戶機沒法 update 。
解決方法,在電腦 A 上將 i18n-php-server 版本庫 push origin 後,在其餘客戶機上執行 git submodule update 。或者用以上提到的 git reset 方法,將子倉庫的引用版本號還原成 origin 上存在的最新版本號。
設置本地分支與遠程分支保持同步,在第一次 git push 的時候帶上 -u
參數便可
git push origin master -u
支持中文目錄與文件名的顯示(git 默認將非 ASCII 編碼的目錄與文件名以八進制編碼展現)
git config core.quotepath off
經常使用的打 tag 操做,更多請查看《Git 基礎 - 打標籤》
# 列出全部本地 tag git tag # 本地新增一個 tag,推送至 origin 服務器 git tag -a v1.0.0 -m 'tag description' git push origin v1.0.0 # 刪除本地與 origin tag git tag -d v1.0.0 git push origin --delete v1.0.0
使用 git GUI 客戶端(如,SoureTree、Github Desktop)能極大的提高分支管理效率。分支合併操做一般只有兩種狀況:從 origin merge 到本地,使用 git pull
便可;從另一個本地分支 merge 到當前分支,使用 git merge <分支名>
,如下是經常使用命令:
# 新建分支 branch1,並切換過去 git checkout -b branch1 # 查看全部本地與遠程分支 git branch -a # 修改完成後,切換回 master 分支,將 branch1 分支合併進來 git checkout master git merge branch1 # 刪除已完成合並的分支 branch1 git branch -d branch1