視頻課程地址
git 清理
git clean
命令用來從你的工作目錄中刪除所有沒有tracked過的文件。
命令 | 說明 |
---|---|
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參數(shù)曲秉。
比如實例:讓當前工作目錄回滾到上一次提交的狀況,新添加的文件也被刪除掉疲牵。
# 讓暫存區(qū)和工作目錄把已經被跟蹤的文件清理干凈
$ git reset --hard
# 讓未追蹤的文件進行清理
$ git clean -f
git分支管理
項目分支就是版本庫的一個副本承二,有了分支后可以把你的工作從開發(fā)主線上分離開來, 以免影響開發(fā)主線瑰步。
創(chuàng)建分支
創(chuàng)建分支: git branch 分支名字
命令矢洲,切換分支的命令使用 git checkout 分支名字
$ git branch dev
$ git checkout dev
# -b創(chuàng)建分支,checkout是切換分支
$ git checkout -b dev
刪除分支
當一個分支完成了使命的時候缩焦,一般我們會把它刪除掉读虏。
# -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;
帶*的代表是當前的分支袁滥。
合并分支
合并分支就是把其他分支的代碼合并到當前的分支中盖桥。git會自動將當前分支和要合并的分支找到共同的基點,然后將當前分支的所有變化和要合并分支的變化進行三方合并题翻,并產生一個新的提交揩徊,此次提交有兩個父提交。
例如操作:
# 進入主分支
$ git checkout master
# 合并dev分支
$ git merge dev
合并分支:
合并分支前嵌赠,確保當前分支已經提交狀態(tài)
快速合并: 如果兩個分支之間沒有分叉塑荒,要被合并的分支提交比當前分支更新,那么只是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 ,倉庫和工作去會回到合并之前的狀態(tài)。
git標簽
Git 可以給歷史中的某一個提交打上標簽沿盅。 比較有代表性的是人 們會使用這個功能來標記發(fā)布結點(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
創(chuàng)建標簽
Git 使用兩種主要類型的標簽:輕量標簽(lightweight)與附注標簽(annotated)韧掩。 一個輕量標簽很像一個不會改變的分支 - 它只是一個特定提交的引用。
- 注標簽
在 Git 中創(chuàng)建一個附注標簽是很簡單的窖铡。 最簡單的方式是當你在運行 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
輸出顯示了打標簽者的信息、打標簽的日期時間费彼、附注信息滑臊,然后顯示具體的提交信息。
- 輕量標簽
另一種給提交打標簽的方式是使用輕量標簽箍铲。 輕量標簽本質上是將提交校驗和存儲到一個文件中 - 沒有保存任 何其他信息雇卷。 創(chuàng)建輕量標簽,不需要使用 -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]在特定的標簽上創(chuàng)建一個 新分支:
$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'
當然资盅,如果在這之后又進行了一次提交调榄,version2 分支會因為改動向前移動了,那么 version2 分支就會和 v2.0.0 標簽稍微有些不同呵扛,這時就應該當心了每庆。
變基
變基的基本操作
rebase 命令將提交到某一分支上的所有修改都移至另一分支上,就好像“重新 播放”一樣今穿。翻譯成通俗的話: 找到參照的倉庫和當前的倉庫的相同的提交扣孟,然后把當前分支后續(xù)的提交挪動到參照倉庫的提交的最后,形成一條線性的提交順序荣赶。
例如:experiment分支參照master分支進行變基
$ git checkout experiment
$ git rebase master
遠程分支的pull命令的時候的--base可以直接變基合并
改變提交歷史
修改多個提交信息.如果想要修改最近三次提交信息,或者那組提交中的任意一個提交信息鸽斟,將想要修改的最近一次提交的父 提交作為參數(shù)傳遞給git rebase -i命令拔创,即HEAD2^或HEAD3。記住~3可能比較容易富蓄,因為你正嘗試 修改最后三次提交;
$ git rebase -i HEAD~3
此時會進入vi的編輯器模式剩燥,這是需要你了解一點vi的快捷鍵不然沒法繼續(xù)操作。
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
# 本地目錄會增加一個文件娇斑,就是把遠程倉庫下載到本地了
查看遠程倉庫的遠程的關聯(lián)信息
$ 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
只有當你有所克隆服務器的寫入權限,并且之前沒有人推送過時蒲牧,這條命令才能生效撇贺。
注意推送之前,必須先把遠程分支的最新內容拉取下來合并或者變基成為最新的內容才可以推送冰抢。
設置關聯(lián)松嘶,自動推送。
第一次執(zhí)行推送的時候挎扰,添加 -u參數(shù)翠订,例如:
$ git push -u origin master
# 后續(xù)的推送,就直接使用 git push即可遵倦,已經關聯(lián)無需再指定 origin和master
遠程分支拉取與合并
拉取之前尽超,確保當前倉庫為提交完成狀態(tài)。
拉取所有的遠程分支:
$ 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的公鑰 打開終端或者命令行(gitbash)
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/ssdfsfsdfadfadfasdfasdfaslajfdaljADFASdfkasdflasjflasjdflajA23ljlsdjfaljf
把~/.ssh/id_rsa.pub
文件中的內容拷貝到github的秘鑰框中曙强。如下圖所示:
github 創(chuàng)建倉庫并設置管理
在github的網站頂部點擊 加號按鈕残拐。
好的此時遠程倉庫創(chuàng)建好了碟嘴,然后就可以進行遠程關聯(lián)和推送和拉取工作溪食。
例如:
在本地新建倉庫并進行關聯(lián):
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
在本地已有的倉庫上進行關聯(lián):
git remote add origin git@github.com:malun666/gitlearn.git
git push -u origin master
git工作流
詳情請參考: Git工作流指南
git集中式工作流
集中式工作流以中央倉庫作為項目所有修改的單點實體。相比SVN缺省的開發(fā)分支trunk娜扇,Git叫做master错沃,所有修改提交到這個分支上。
- 所有成員都以中央倉庫為基礎進行clone
- 所有成員代碼提交到本地倉庫雀瓢,進行遠程推送前先進行獲取最新解決沖突后再push
- 可以選擇merge模式也可以rebase模式
基本的開發(fā)模式:
- 項目維護者推送到主倉庫枢析。
- 貢獻者克隆此住倉庫,做出修改刃麸。
- 貢獻者將數(shù)據(jù)推送到自己的公開倉庫醒叁。
- 貢獻者給維護者發(fā)送郵件,請求拉取自己的更新泊业。
- 維護者在自己本地的倉庫中把沼,將貢獻者的倉庫加為遠程倉庫并合并修改。
- 維護者將合并后的修改推送到主倉庫吁伺。
進入公司后智政,需要問項目經理要一下公司的源碼git倉庫的地址,以及把自己的公鑰給管理員箱蝠,讓他們幫你設置上權限,就可以clone項目了。
本工作流比較簡單宦搬,就不再概述牙瓢。
github的fork工作流
派生(Fork)項目,如果你想要參與某個項目,但是并沒有推送權限间校,這時可以對這個項目進行“派生”矾克。 派生的意思是 指,GitHub 將在你的空間中創(chuàng)建一個完全屬于你的項目副本憔足,且你對其具有推送權限胁附。
流程通常如下:
- 從 master 分支中創(chuàng)建一個新分支
- 提交一些修改來改進項目
- 將這個分支推送到 GitHub 上
- 創(chuàng)建一個合并請求(pr)
- 討論,根據(jù)實際情況繼續(xù)修改
- 項目的擁有者合并或關閉你的合并請求
項目分支管理模型
一般一個完整的項目都會有很多分支滓彰,每個分支都有一些管理的規(guī)則控妻。
如何刪除遠程分支
# 把一個空分支推送到遠程的dev分支,也就是刪除遠程的dev分支
$ git push origin :dev
git的鉤子與自動化集成
Git 能在特定的重要動作發(fā)生時觸發(fā)自定義腳本揭绑。這些特定的能注冊執(zhí)行腳本的事件就稱為鉤子弓候。
客戶端鉤子
客戶端鉤子分為很多種。 下面把它們分為:提交工作流鉤子他匪、電子郵件工作流鉤子和其它鉤子菇存。
提交鉤子
鉤子名 | 作用 |
---|---|
pre-commit | 鉤子在鍵入提交信息前運行。 它用于檢查即將提交的快照邦蜜,例如依鸥,檢查是否有所遺漏,確保測試 運行悼沈,以及核查代碼贱迟。 如果該鉤子以非零值退出,Git 將放棄此次提交井辆,不過你可以用 git commit --no -verify 來繞過這個環(huán)節(jié)关筒。 你可以利用該鉤子,來檢查代碼風格是否一致(運行類似 lint 的程序)杯缺、尾隨空 白字符是否存在(自帶的鉤子就是這么做的)蒸播,或新方法的文檔是否適當。 |
prepare-commit-msg | 鉤子在啟動提交信息編輯器之前萍肆,默認信息被創(chuàng)建之后運行袍榆。 它允許你編輯提交者所 看到的默認信息。 該鉤子接收一些選項:存有當前提交信息的文件的路徑塘揣、提交類型和修補提交的提交的 SHA- 1 校驗包雀。 它對一般的提交來說并沒有什么用;然而對那些會自動產生默認信息的提交,如提交信息模板亲铡、合并提 交才写、壓縮提交和修訂提交等非常實用葡兑。 你可以結合提交模板來使用它,動態(tài)地插入信息赞草。 |
commit-msg | 鉤子接收一個參數(shù)讹堤,此參數(shù)即上文提到的,存有當前提交信息的臨時文件的路徑厨疙。 如果該鉤子腳本以非零值退出洲守,Git 將放棄提交,因此沾凄,可以用來在提交通過前驗證項目狀態(tài)或提交信息梗醇。 在本章的最后一節(jié),我們將展示如何使用該鉤子來核對提交信息是否遵循指定的模板撒蟀。 |
post-commit | 鉤子在整個提交過程完成后運行叙谨。 它不接收任何參數(shù),但你可以很容易地通過運行 git log -1 HEAD來獲得最后一次的提交信息牙肝。該鉤子一般用于通知之類的事情唉俗。 |
例如: git提交的標簽工具
An emoji guide for your commit messages. ??
其他鉤子請直接參考官網。
服務器端鉤子
服務器端的鉤子可以幫我做很多事情配椭,比如檢測到提交好自動執(zhí)行某些自動化部署的腳本虫溜,就能實現(xiàn)自動化的部署和提交。 所有服務器端的工作都將在你的 hooks 目錄下的 update 腳本中完成股缸。 update 腳本會為每一個提交的分支各 運行一次衡楞,它接受三個參數(shù):
- 被推送的引用的名字
- 推送前分支的修訂版本(revision)
- 用戶準備推送的修訂版本(revision)
例如:
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
如果定義的別名想帶上參數(shù),那么需要對命令名加上引號镰惦。
$ git config --global alias.lf 'log --graph --oneline'
# 使用:
$ git lf
# 等價于:
$ git log --graph --oneline
git服務器端私有部署及權限管理
請直接參考: CentOS搭建Git服務器及權限管理
搭建gitlab
作業(yè)
git stash命令