騰訊課堂javascript
git clean
命令用來從你的工做目錄中刪除全部沒有tracked過的文件。php
命令 | 說明 |
---|---|
git clean -n |
告訴你哪些文件會被刪除. 記住他不會真正的刪除文件, 只是一個提醒。 |
git clean -d |
刪除未跟蹤的目錄 |
git clean -f |
刪除當前目錄下全部沒有track過的文件。忽略文件不被刪除! |
git clean -df |
-d表明刪除目錄,-f強制刪除。 |
git clean -xf |
刪除當前目錄下全部沒有track過的文件. 無論他是不是.gitignore文件裏面指定的文件夾和文件 |
git clean -X |
刪除全部被忽略的文件 |
若是被刪除的子文件夾中有 .git目錄,那麼會被忽略掉,若是想刪除必須添加-f參數。java
好比實例:讓當前工做目錄回滾到上一次提交的情況,新添加的文件也被刪除掉。git
# 讓暫存區和工做目錄把已經被跟蹤的文件清理乾淨 $ git reset --hard # 讓未追蹤的文件進行清理 $ git clean -f
項目分支就是版本庫的一個副本,有了分支後能夠把你的工做從開發主線上分離開來, 以避免影響開發主線。github
建立分支: git branch 分支名字
命令,切換分支的命令使用 git checkout 分支名字
shell
$ git branch dev
$ git checkout dev
# -b建立分支,checkout是切換分支 $ git checkout -b dev
當一個分支完成了使命的時候,通常咱們會把它刪除掉。ruby
# -d 命令是刪除的意思,delete $ git branch -d hotfix
$ git branch -v dev eba9a31 update the a.txt by dev * master d47fbfb update the a.txt by master;
帶*的表明是當前的分支。bash
合併分支就是把其餘分支的代碼合併到當前的分支中。git會自動將當前分支和要合併的分支找到共同的基點,而後將當前分支的全部變化和要合併分支的變化進行三方合併,併產生一個新的提交,這次提交有兩個父提交。服務器
例如操做:網絡
# 進入主分支 $ git checkout master # 合併dev分支 $ git merge dev
合併分支:
合併分支前,確保當前分支已經提交狀態
快速合併: 若是兩個分支之間沒有分叉,要被合併的分支提交比當前分支更新,那麼只是HEAD指針的移動。
衝突解決: 若是合併的兩個分支有分叉,那麼自動添加一個新的提交,若是有衝突須要先解決完衝忽然後再提交。
解決衝突的辦法:就是移除代碼中的特殊符號,留下本身想要的代碼。好比:衝突文件以下:
ssss
<<<<<<< HEAD 22222222 33333333 44444444 ======= devdevdevdev >>>>>>> dev
移除上面的 <<<<<<< HEAD
和 =======
>>>>>>> dev
而後留下本身想要的代碼就完成了衝突解決,最後add和commit一下就能夠了。
完整的解決衝突的流程:
# 切換到主分支 $ git checkout master # 把dev分支的內容合併到主分支 $ git merge dev # 若是產生衝突後,先修改文件,去掉衝突的符號。 # 最後提交修改到倉庫 $ git add . $ git commit -m '合併衝突'
合併過程當中,隨時均可以中止合併,只須要 git merge abort ,倉庫和工做去會回到合併以前的狀態。
Git 能夠給歷史中的某一個提交打上標籤。 比較有表明性的是人 們會使用這個功能來標記發佈結點(v1.0 等等)。
在 Git 中列出已有的標籤是很是簡單直觀的。 只須要輸入 git tag
:
$ git tag
v0.1 v1.3
這個命令以字母順序列出標籤;
你也可使用特定的模式查找標籤,若是隻對 1.8.5 系列感興趣,能夠運行:
$ git tag -l 'v1.8.5*' v1.8.5 v1.8.5-rc0 v1.8.5-rc1 v1.8.5-rc2 v1.8.5-rc3 v1.8.5.1 v1.8.5.2 v1.8.5.3 v1.8.5.4 v1.8.5.5
Git 使用兩種主要類型的標籤:輕量標籤(lightweight)與附註標籤(annotated)。 一個輕量標籤很像一個不會改變的分支 - 它只是一個特定提交的引用。
在 Git 中建立一個附註標籤是很簡單的。 最簡單的方式是當你在運行 tag 命令時指定 -a 選項:
$ git tag -a v1.4 -m 'my version 1.4' $ git tag v0.1 v1.3 v1.4
-m 選項指定了一條將會存儲在標籤中的信息。
經過使用git show命令能夠看到標籤信息與對應的提交信息:
$ git show v1.4 tag v1.4 Tagger: Ben Straub <ben@straub.cc> Date: Sat May 3 20:19:12 2014 -0700 my version 1.4 commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon <schacon@gee-mail.com> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number
輸出顯示了打標籤者的信息、打標籤的日期時間、附註信息,而後顯示具體的提交信息。
另外一種給提交打標籤的方式是使用輕量標籤。 輕量標籤本質上是將提交校驗和存儲到一個文件中 - 沒有保存任 何其餘信息。 建立輕量標籤,不須要使用 -a、-s 或 -m 選項,只須要提供標籤名字:
$ git tag v1.4-lw $ git tag v0.1 v1.3 v1.4 v1.4-lw v1.5
你也能夠對過去的提交打標籤。
$ git tag -a v1.2 9fceb02
在 Git 中你並不能真的檢出一個標籤,由於它們並不能像分支同樣來回移動。 若是你想要工做目錄與倉庫中特定 的標籤版本徹底同樣,可使用git checkout -b [branchname] [tagname]在特定的標籤上建立一個 新分支:
$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'
固然,若是在這以後又進行了一次提交,version2 分支會由於改動向前移動了,那麼 version2 分支就會和 v2.0.0 標籤稍微有些不一樣,這時就應該小心了。
rebase 命令將提交到某一分支上的全部修改都移至另外一分支上,就好像「從新 播放」同樣。翻譯成通俗的話: 找到參照的倉庫和當前的倉庫的相同的提交,而後把當前分支後續的提交挪動到參照倉庫的提交的最後,造成一條線性的提交順序。
例如:experiment分支參照master分支進行變基
$ git checkout experiment $ git rebase master
遠程分支的pull命令的時候的--base能夠直接變基合併
修改多個提交信息.若是想要修改最近三次提交信息,或者那組提交中的任意一個提交信息,將想要修改的最近一次提交的父 提交做爲參數傳遞給git rebase -i命令,即HEAD2^或HEAD3。記住~3可能比較容易,由於你正嘗試 修改最後三次提交;
$ git rebase -i HEAD~3
此時會進入vi的編輯器模式,這是須要你瞭解一點vi的快捷鍵否則無法繼續操做。
pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file # Rebase 710f0f8..a5f4a0d onto 710f0f8 # # Commands: # p, pick <commit> = use commit # r, reword <commit> = use commit, but edit the commit message # e, edit <commit> = use commit, but stop for amending # s, squash <commit> = use commit, but meld into previous commit # f, fixup <commit> = like "squash", but discard this commit's log message # x, exec <command> = run command (the rest of the line) using shell # d, drop <commit> = remove commit # l, label <label> = label current HEAD with a name # t, reset <label> = reset HEAD to a label # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>] # . create a merge commit using the original merge commit's # . message (or the oneline, if no original merge commit was # . specified). Use -c <commit> to reword the commit message. # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST.
把最上面的pick對應改爲你想要的效果,好比刪除某個提交信息,則把pick改爲 d爲刪除當前提交信息,e是修改,p默認就留下
遠程倉庫是指託管在因特網或其餘網絡中 的你的項目的版本庫。
克隆遠程倉庫,就是把遠程倉庫拷貝一個副本下載到本地。
$ git clone https://github.com/malun666/aicoder_vip_doc # 本地目錄會增長一個文件,就是把遠程倉庫下載到本地了
查看遠程倉庫的遠程的關聯信息
$ git remote -v
origin https://github.com/malun666/aicoder_vip_doc (fetch) origin https://github.com/malun666/aicoder_vip_doc (push)
origin - 這是 Git 給你克隆的倉庫服務器的默認名字。origin就表明遠程倉庫的別名。
語法:git remote add <shortname> <url>
$ cd /path/to/gitresp
$ git remote add aicoder https://github.com/malun666/aicoder_vip_doc $ git remote -v
通常先創建好遠程倉庫的別名後,而後用fetch命令進行拉取遠程倉庫的內容。
$ git fetch <遠程倉庫別名> <遠程分支名>
# 例如: $ git fetch origin dev # 下載全部的遠程分支 $ git fetch --all
若是你使用 clone 命令克隆了一個倉庫,命令會自動將其添加爲遠程倉庫並默認以 「origin」 爲簡寫。
若是想要重命名引用的名字能夠運行 git remote rename 去修改一個遠程倉庫的簡寫名。 例如,想要將 pb 重命名爲paul,能夠用git remote rename這樣作:
$ git remote rename pb paul $ git remote origin paul
$ git remote rm paul $ git remote origin
若是想要查看某一個遠程倉庫的更多信息,可使用 git remote show [remote-name]
命令。
$ git remote show origin
* remote origin
Fetch URL: git@github.com:malun666/aicoder_egg.git Push URL: git@github.com:malun666/aicoder_egg.git HEAD branch: master Remote branches: dev tracked master tracked Local branches configured for 'git pull': dev merges with remote dev master merges with remote master Local refs configured for 'git push': dev pushes to dev (up to date) master pushes to master (up to date)
當你想分享你的項目時,必須將其推送到上游。 這個命令很簡單:git push [remote-name] [branch-name]
。 當你想要將 master 分支推送到 origin 服務器時(再次說明,克隆時一般會自動幫你設置好那兩個 名字),那麼運行這個命令就能夠將你所作的備份到服務器
具體語法:
$ git push <遠程主機名> <本地分支名>:<遠程分支名>
實例:
$ git push origin master
只有當你有所克隆服務器的寫入權限,而且以前沒有人推送過期,這條命令才能生效。
注意推送以前,必須先把遠程分支的最新內容拉取下來合併或者變基成爲最新的內容才能夠推送。
設置關聯,自動推送。
第一次執行推送的時候,添加 -u參數,例如:
$ git push -u origin master
# 後續的推送,就直接使用 git push便可,已經關聯無需再指定 origin和master
拉取以前,確保當前倉庫爲提交完成狀態。
拉取全部的遠程分支:
$ git fetch --all
$ git branch --all
# 此時能夠看到全部的遠程分支和當前分支內容 aicoder * master remotes/origin/HEAD -> origin/master remotes/origin/aicoder remotes/origin/master
此時remotes開頭的都是遠程的分支的最新的內容,能夠用merge命令進行合併分支,也能夠rebase變基。
例如:
# 切換到aicoder分支 $ git checkout aicoder # 合併遠程的aicoder分支 $ git merge remotes/origin/aicoder
以上操做都太麻煩,最簡單的辦法就是直接使用pull命令,是以上fetch命令和merge命令的合體:
# 獲取遠程的aicoder分支並與當前的aicoder分支進行合併。 $ git pull origin aicoder # 若是合併的不一樣分支名字: 最後須要用 遠程分支名:本地分支名 # $ git pull <遠程主機名> <遠程分支名>:<本地分支名> $ git pull origin aicoder:master
若是合併過程當中有任何的衝突,須要手動修改衝突代碼,最後git add 和git commit提交。
遠程拉取和合並能夠只用git pull命令,變基也是能夠的。
git pull --rebase origin master
# 簡寫 git pull -r origin master # 從遠程origin的master分支上拉取最新的結果而且讓當前倉庫依照遠程倉庫進行變基操做。
變基過程當中能夠隨時進行 abort中止。
GitHub 是最大的 Git 版本庫在線託管商,是一個免費託管開源項目的遠程倉庫,非開源項目收費。
直接訪問 https://github.com
第一步:登陸github 第二步:點擊github右上角頭像,彈出菜單選擇setting,而後選擇SSH and GPG keys
菜單,點擊 New SSH Key
按鈕.
第三步:找到以前生成的ssh的公鑰 打開終端或者命令行(gitbash)
$ cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/ssdfsfsdfadfadfasdfasdfaslajfdaljADFASdfkasdflasjflasjdflajA23ljlsdjfaljf
把~/.ssh/id_rsa.pub
文件中的內容拷貝到github的祕鑰框中。以下圖所示:
在github的網站頂部點擊 加號按鈕。
而後輸入倉庫的名字和倉庫的描述。
好的此時遠程倉庫建立好了,而後就能夠進行遠程關聯和推送和拉取工做。
例如:
在本地新建倉庫並進行關聯:
echo "# gitlearn" >> README.md git init git add README.md git commit -m "first commit" git remote add origin git@github.com:malun666/gitlearn.git git push -u origin master
在本地已有的倉庫上進行關聯:
git remote add origin git@github.com:malun666/gitlearn.git git push -u origin master
詳情請參考: Git工做流指南
集中式工做流以中央倉庫做爲項目全部修改的單點實體。相比SVN缺省的開發分支trunk,Git叫作master,全部修改提交到這個分支上。
基本的開發模式:
進入公司後,須要問項目經理要一下公司的源碼git倉庫的地址,以及把本身的公鑰給管理員,讓他們幫你設置上權限,就能夠clone項目了。
本工做流比較簡單,就再也不概述。
派生(Fork)項目,若是你想要參與某個項目,可是並無推送權限,這時能夠對這個項目進行「派生」。 派生的意思是 指,GitHub 將在你的空間中建立一個徹底屬於你的項目副本,且你對其具備推送權限。
流程一般以下:
通常一個完整的項目都會有不少分支,每一個分支都有一些管理的規則。
# 把一個空分支推送到遠程的dev分支,也就是刪除遠程的dev分支 $ git push origin :dev
Git 能在特定的重要動做發生時觸發自定義腳本。這些特定的能註冊執行腳本的事件就稱爲鉤子。
客戶端鉤子分爲不少種。 下面把它們分爲:提交工做流鉤子、電子郵件工做流鉤子和其它鉤子。
鉤子名 | 做用 |
---|---|
pre-commit | 鉤子在鍵入提交信息前運行。 它用於檢查即將提交的快照,例如,檢查是否有所遺漏,確保測試 運行,以及覈查代碼。 若是該鉤子以非零值退出,Git 將放棄這次提交,不過你能夠用 git commit --no -verify 來繞過這個環節。 你能夠利用該鉤子,來檢查代碼風格是否一致(運行相似 lint 的程序)、尾隨空 白字符是否存在(自帶的鉤子就是這麼作的),或新方法的文檔是否適當。 |
prepare-commit-msg | 鉤子在啓動提交信息編輯器以前,默認信息被建立以後運行。 它容許你編輯提交者所 看到的默認信息。 該鉤子接收一些選項:存有當前提交信息的文件的路徑、提交類型和修補提交的提交的 SHA- 1 校驗。 它對通常的提交來講並無什麼用;然而對那些會自動產生默認信息的提交,如提交信息模板、合併提 交、壓縮提交和修訂提交等很是實用。 你能夠結合提交模板來使用它,動態地插入信息。 |
commit-msg | 鉤子接收一個參數,此參數即上文提到的,存有當前提交信息的臨時文件的路徑。 若是該鉤子腳本以非零值退出,Git 將放棄提交,所以,能夠用來在提交經過前驗證項目狀態或提交信息。 在本章的最後一節,咱們將展現如何使用該鉤子來覈對提交信息是否遵循指定的模板。 |
post-commit | 鉤子在整個提交過程完成後運行。 它不接收任何參數,但你能夠很容易地經過運行 git log -1 HEAD來得到最後一次的提交信息。該鉤子通常用於通知之類的事情。 |
例如: git提交的標籤工具
An emoji guide for your commit messages. 😜
其餘鉤子請直接參考官網。
服務器端的鉤子能夠幫我作不少事情,好比檢測到提交好自動執行某些自動化部署的腳本,就能實現自動化的部署和提交。 全部服務器端的工做都將在你的 hooks 目錄下的 update 腳本中完成。 update 腳本會爲每個提交的分支各 運行一次,它接受三個參數:
例如:
Git 並不會在你輸入部分命令時自動推斷出你想要的命令。 若是不想每次都輸入完整的 Git 命令,能夠經過 git config 文件來輕鬆地爲每個命令設置一個別名。 這裏有一些例子你能夠試試:
$ git config --global alias.co checkout $ git config --global alias.br branch $ git config --global alias.ci commit $ git config --global alias.st status
若是定義的別名想帶上參數,那麼須要對命令名加上引號。
$ git config --global alias.lf 'log --graph --oneline' # 使用: $ git lf # 等價於: $ git log --graph --oneline
請直接參考: CentOS搭建Git服務器及權限管理
git stash命令