Git入門到高級系列2-git高級操做

視頻課程地址

騰訊課堂javascript

git 清理

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 

git分支管理

項目分支就是版本庫的一個副本,有了分支後能夠把你的工做從開發主線上分離開來, 以避免影響開發主線。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標籤

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遠程倉庫

遠程倉庫是指託管在因特網或其餘網絡中 的你的項目的版本庫。

遠程分支克隆

克隆遠程倉庫,就是把遠程倉庫拷貝一個副本下載到本地。

$ 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

GitHub 是最大的 Git 版本庫在線託管商,是一個免費託管開源項目的遠程倉庫,非開源項目收費。

註冊帳號

直接訪問 https://github.com

配置SSH 訪問

第一步:登陸github 第二步:點擊github右上角頭像,彈出菜單選擇setting,而後選擇SSH and GPG keys菜單,點擊 New SSH Key按鈕.

 
設置ssh key

第三步:找到以前生成的ssh的公鑰 打開終端或者命令行(gitbash)

$ cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/ssdfsfsdfadfadfasdfasdfaslajfdaljADFASdfkasdflasjflasjdflajA23ljlsdjfaljf 

~/.ssh/id_rsa.pub文件中的內容拷貝到github的祕鑰框中。以下圖所示:

 
設置ssh key

github 建立倉庫並設置管理

在github的網站頂部點擊 加號按鈕。

 
設置ssh key

 

 

而後輸入倉庫的名字和倉庫的描述。

 
設置ssh key

好的此時遠程倉庫建立好了,而後就能夠進行遠程關聯和推送和拉取工做。

例如:

在本地新建倉庫並進行關聯:

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工做流

詳情請參考: Git工做流指南

git集中式工做流

集中式工做流以中央倉庫做爲項目全部修改的單點實體。相比SVN缺省的開發分支trunk,Git叫作master,全部修改提交到這個分支上。

 
設置ssh key
  • 全部成員都以中央倉庫爲基礎進行clone
  • 全部成員代碼提交到本地倉庫,進行遠程推送前先進行獲取最新解決衝突後再push
  • 能夠選擇merge模式也能夠rebase模式

基本的開發模式:

  1. 項目維護者推送到主倉庫。
  2. 貢獻者克隆此住倉庫,作出修改。
  3. 貢獻者將數據推送到本身的公開倉庫。
  4. 貢獻者給維護者發送郵件,請求拉取本身的更新。
  5. 維護者在本身本地的倉庫中,將貢獻者的倉庫加爲遠程倉庫併合並修改。
  6. 維護者將合併後的修改推送到主倉庫。
 
集中式工做流

進入公司後,須要問項目經理要一下公司的源碼git倉庫的地址,以及把本身的公鑰給管理員,讓他們幫你設置上權限,就能夠clone項目了。

本工做流比較簡單,就再也不概述。

github的fork工做流

派生(Fork)項目,若是你想要參與某個項目,可是並無推送權限,這時能夠對這個項目進行「派生」。 派生的意思是 指,GitHub 將在你的空間中建立一個徹底屬於你的項目副本,且你對其具備推送權限。

流程一般以下:

  1. 從 master 分支中建立一個新分支
  2. 提交一些修改來改進項目
  3. 將這個分支推送到 GitHub 上
  4. 建立一個合併請求(pr)
  5. 討論,根據實際狀況繼續修改
  6. 項目的擁有者合併或關閉你的合併請求
 
github-fork工做流

項目分支管理模型

通常一個完整的項目都會有不少分支,每一個分支都有一些管理的規則。

 
設置ssh key

如何刪除遠程分支

# 把一個空分支推送到遠程的dev分支,也就是刪除遠程的dev分支 $ git push origin :dev 

git的鉤子與自動化集成

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 腳本會爲每個提交的分支各 運行一次,它接受三個參數:

  • 被推送的引用的名字
  • 推送前分支的修訂版本(revision)
  • 用戶準備推送的修訂版本(revision)

例如:

 
git鉤子

git其餘

git命令別名

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 

git服務器端私有部署及權限管理

請直接參考: CentOS搭建Git服務器及權限管理

搭建gitlab

直接參考:4.8 服務器上的 Git - GitLab

做業

git stash命令

視頻課程地址

騰訊課堂

相關文章
相關標籤/搜索