今天同大家聊一下Git扩展
CVS作為最早的開源而且免費的集中式版本控制系統,直到現在還有不少人在用。由于CVS自身設計的問題,會造成提交文件不完整,版本庫莫名其妙損壞的情況。同樣是開源而且免費的SVN修正了CVS的一些穩定性問題,是目前用得最多的集中式版本庫控制系統。
? 除了免費的外,還有收費的集中式版本控制系統,比如IBM的ClearCase(以前是Rational公司的,被IBM收購了),特點是安裝比Windows還大,運行比蝸牛還慢,能用ClearCase的一般是世界500強,他們有個共同的特點是財大氣粗,或者人傻錢多。
? 微軟自己也有一個集中式版本控制系統叫VSS,集成在Visual Studio中。由于其反人類的設計,連微軟自己都不好意思用了。
? 分布式版本控制系統除了Git以及促使Git誕生的BitKeeper外,還有類似Git的Mercurial和Bazaar等。這些分布式版本控制系統各有特點,但最快、最簡單也最流行的依然是Git
Git模型
- 主要分支 master ——最新版本,相較于master,release可以認為是穩定版,版本存在bug時會及時修復并重新發布
- 主要開發分支 develop ——當develop分支中的源代碼到達穩定點并準備好發布時,所有更改都應以某種方式合并到master
- 功能分支 feature ——主要用于為下一個版本開發新功能。分支出自:develop - 必須合并回:develop
- 發布分支 release ——主要用來發布穩定版本到生產。分支出自:develop - 必須合并回:develop 和 master
- 修補bug分支 hotfix ——主要用來修復生產的緊急bug。分支出自:master - 必須合并回:develop 和 master
Git加速
// 在GitHub的官網名后加 .cnpmjs.org這個鏡像后綴,例如git clone https://github.com.cnpmjs.org/user/bose.gitSSH_KEY配置
一、設置git的user name和email
如果你是第一次使用,或者還沒有配置過的話需要操作一下命令,自行替換相應字段。
git config --global user.name "xxx" git config --global user.email "xxx@qq.com"說明:git config --list 查看當前Git環境所有配置,還可以配置一些命令別名之類的。
二、檢查是否存在SSH Key
cd ~/.ssh ls 或者 ll //看是否存在 id_rsa 和 id_rsa.pub文件,如果存在,說明已經有SSH Key如果沒有SSH Key,則需要先生成一下
ssh-keygen -t rsa -C "email@gmail.com"三、獲取SSH Key
cat id_rsa.pub //拷貝秘鑰 ssh-rsa開頭四、GitHub添加SSH Key
新建一個SSH Key
五、驗證和修改
測試是否成功配置SSH Key
ssh -T git@github.com //運行結果出現類似如下 Hi CC! You've successfully authenticated, but GitHub does not provide shell access. 123之前已經是https的鏈接,現在想要用SSH提交怎么辦?
直接修改項目目錄下 .git文件夾下的config文件,將地址修改一下就好了。
switch 切換分支
切換分支使用git checkout <branch>,撤銷修改則是git checkout -- <file>,同一個命令,有兩種作用,確實有點令人迷惑。
實際上,切換分支這個動作,用switch更科學。因此,最新版本的Git提供了新的git switch命令來切換分支:
創建并切換到新的dev分支,可以使用:
$ git switch -c dev直接切換到已有的master分支,可以使用:
$ git switch master使用新的git switch命令,比git checkout要更容易理解。
分支整理-變基
#rebase操作可以把本地未push的分叉提交歷史整理成直線; #rebase的目的是使得我們在查看歷史提交的變化時更容易,因為分叉的提交需要三方對比。 $ git rebaseFork
- 在GitHub上,可以任意Fork開源倉庫;
- 自己擁有Fork后的倉庫的讀寫權限;
- 可以推送pull request給官方倉庫來貢獻代碼。
Gitees使用
.gitignore
在 .gitignore 文件中,每一行的忽略規則的語法如下:
1)空格不匹配任意文件,可作為分隔符,可用反斜杠轉義
2)以“#”開頭的行都會被 Git 忽略。即#開頭的文件標識注釋,可以使用反斜杠進行轉義。
3)可以使用標準的glob模式匹配。所謂的glob模式是指shell所使用的簡化了的正則表達式。
4)以斜杠"/“開頭表示目錄;”/“結束的模式只匹配文件夾以及在該文件夾路徑下的內容,但是不匹配該文件;”/“開始的模式匹配項目跟目錄;如果一個模式不包含斜杠,則它匹配相對于當前 .gitignore 文件路徑的內容,如果該模式不在 .gitignore 文件中,則相對于項目根目錄。
5)以星號""通配多個字符,即匹配多個任意字符;使用兩個星號"*” 表示匹配任意中間目錄,比如a/**/z可以匹配 a/z, a/b/z 或 a/b/c/z等。
6)以問號"?“通配單個字符,即匹配一個任意字符;
7)以方括號”[]“包含單個字符的匹配列表,即匹配任何一個列在方括號中的字符。比如[abc]表示要么匹配一個a,要么匹配一個b,要么匹配一個c;如果在方括號中使用短劃線分隔兩個字符,表示所有在這兩個字符范圍內的都可以匹配。比如[0-9]表示匹配所有0到9的數字,[a-z]表示匹配任意的小寫字母)。
8)以嘆號”!“表示不忽略(跟蹤)匹配到的文件或目錄,即要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(!)取反。需要特別注意的是:如果文件的父目錄已經被前面的規則排除掉了,那么對這個文件用"!"規則是不起作用的。也就是說”!“開頭的模式表示否定,該文件將會再次被包含,如果排除了該文件的父級目錄,則使用”!"也不會再次被包含。可以使用反斜杠進行轉義。
需要謹記:git對于.ignore配置文件是按行從上到下進行規則匹配的,意味著如果前面的規則匹配的范圍更大,則后面的規則將不會生效;
.gitignore忽略規則簡單說明
# 表示此為注釋,將被Git忽略 *.a 表示忽略所有 .a 結尾的文件 !lib.a 表示但lib.a除外 /TODO 表示僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO build/ 表示忽略 build/目錄下的所有文件,過濾整個build文件夾; doc/*.txt 表示會忽略doc/notes.txt但不包括 doc/server/arch.txtbin/: 表示忽略當前路徑下的bin文件夾,該文件夾下的所有內容都會被忽略,不忽略 bin 文件 /bin: 表示忽略根目錄下的bin文件 /*.c: 表示忽略cat.c,不忽略 build/cat.c debug/*.obj: 表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj **/foo: 表示忽略/foo,a/foo,a/b/foo等 a/**/b: 表示忽略a/b, a/x/b,a/x/y/b等 !/bin/run.sh 表示不忽略bin目錄下的run.sh文件 *.log: 表示忽略所有 .log 文件 config.php: 表示忽略當前路徑的 config.php 文件/mtk/ 表示過濾整個文件夾 *.zip 表示過濾所有.zip文件 /mtk/do.c 表示過濾某個具體文件被過濾掉的文件就不會出現在git倉庫中(gitlab或github)了,當然本地庫中還有,只是push的時候不會上傳。需要注意的是,gitignore還可以指定要將哪些文件添加到版本管理中,如下: !*.zip !/mtk/one.txt唯一的區別就是規則開頭多了一個感嘆號,Git會將滿足這類規則的文件添加到版本管理中。為什么要有兩種規則呢? 想象一個場景:假如我們只需要管理/mtk/目錄中的one.txt文件,這個目錄中的其他文件都不需要管理,那么.gitignore規則應寫為:: /mtk/* !/mtk/one.txt假設我們只有過濾規則,而沒有添加規則,那么我們就需要把/mtk/目錄下除了one.txt以外的所有文件都寫出來! 注意上面的/mtk/*不能寫為/mtk/,否則父目錄被前面的規則排除掉了,one.txt文件雖然加了!過濾規則,也不會生效!---------------------------------------------------------------------------------- 還有一些規則如下: fd1/* 說明:忽略目錄 fd1 下的全部內容;注意,不管是根目錄下的 /fd1/ 目錄,還是某個子目錄 /child/fd1/ 目錄,都會被忽略;/fd1/* 說明:忽略根目錄下的 /fd1/ 目錄的全部內容;/* !.gitignore !/fw/ /fw/* !/fw/bin/ !/fw/sf/ 說明:忽略全部內容,但是不忽略 .gitignore 文件、根目錄下的 /fw/bin/ 和 /fw/sf/ 目錄;注意要先對bin/的父目錄使用!規則,使其不被排除。注意:
如果你不慎在創建.gitignore文件之前就push了項目,那么即使你在.gitignore文件中寫入新的過濾規則,這些規則也不會起作用,Git仍然會對所有文件進行版本管理。簡單來說出現這種問題的原因就是Git已經開始管理這些文件了,所以你無法再通過過濾規則過濾它們。所以大家一定要養成在項目開始就創建.gitignore文件的習慣,否則一單push,處理起來會非常麻煩。
git無法pull倉庫refusing to merge unrelated histories
如果合并了兩個不同的開始提交的倉庫,在新的 git 會發現這兩個倉庫可能不是同一個,為了防止開發者上傳錯誤,于是就給下面的提示
$ fatal: refusing to merge unrelated histories如我在Github新建一個倉庫,寫了License,然后把本地一個寫了很久倉庫上傳。這時會發現 github 的倉庫和本地的沒有一個共同的 commit 所以 git 不讓提交,認為是寫錯了 origin ,如果開發者確定是這個 origin 就可以使用 --allow-unrelated-histories 告訴 git 自己確定
遇到無法提交的問題,一般先pull 也就是使用 git pull origin master 這里的 origin 就是倉庫,而 master 就是需要上傳的分支,因為兩個倉庫不同,發現 git 輸出 refusing to merge unrelated histories 無法 pull 內容
因為他們是兩個不同的項目,要把兩個不同的項目合并,git需要添加一句代碼,在 git pull 之后,這句代碼是在git 2.9.2版本發生的,最新的版本需要添加 --allow-unrelated-histories 告訴 git 允許不相關歷史合并
假如我們的源是origin,分支是master,那么我們需要這樣寫git pull origin master --allow-unrelated-histories 如果有設置了默認上傳分支就可以用下面代碼
$ git pull --allow-unrelated-histories也可以通過強制覆蓋的方法覆蓋當前分支
$ git push -u origin master -fwarning: LF will be replaced by CRLF in 解決辦法
warning: LF will be replaced by CRLF in
原因是存在符號轉義問題
windows中的換行符為 CRLF, 而在linux下的換行符為LF,所以在執行add . 時出現提示,解決辦法:
git config --global core.autocrlf false
error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054解決方法
只需要設置Git忽略ssl證書錯誤即可,使用下面的命令:
git config --global http.sslVerify "false"
再次clone。
子模塊項目
空文件夾是項目的子模塊,需要用submodule下載。
@后面的數字是哈希值,用于確定唯一的提交狀態。文件push時會壓縮,然后上傳同時生成一串檢驗字符串。at后面的數字就是檢驗字符串的前面部分
是帶有子模塊的項目;需要進入下載的文件下,運行命令 git submodule update --init --recursive 即可。
當然也可以使用 git clone --recursive 直接把主模塊和子模塊項目同時拉取下來,不過很可能由于網絡問題導致拉取失敗。
注意加上指定深度拉取。
Git永久刪除某個重要文件文件或文件夾 (包括歷史記錄) 強制
有些時候不小心上傳了一些敏感文件(例如密碼), 或者不想上傳的文件(沒及時或忘了加到.gitignore里的),
而且上傳的文件又特別大的時候, 這將導致別人clone你的代碼或下載zip包的時候也必須更新或下載這些無用的文件,
因此, 我們需要一個方法, 永久的刪除這些文件(包括該文件的歷史記錄).
首先, 可以參考 github 的幫助:
https://help.github.com/articles/remove-sensitive-data
注意以下操作完后,如果遠程庫中無文件,則會刪除主分支。
步驟一: 從你的資料庫中清除文件
以Windows下為例(Linux類似), 打開項目的Git Bash,使用命令:
$ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch path-to-your-remove-file' --prune-empty --tag-name-filter cat -- --all其中, path-to-your-remove-file 就是你要刪除的文件的相對路徑(相對于git倉庫的跟目錄), 替換成你要刪除的文件即可. 注意一點,這里的文件或文件夾,都不能以 ‘/’ 開頭,否則文件或文件夾會被認為是從 git 的安裝目錄開始。
如果你要刪除的目標不是文件,而是文件夾,那么請在 git rm --cached' 命令后面添加 -r 命令,表示遞歸的刪除(子)文件夾和文件夾下的文件,類似于rm -rf` 命令。
此外,如果你要刪除的文件很多, 可以寫進一個.sh文件批量執行, 如果文件或路徑里有中文, 由于MinGW或CygWin對中文路徑設置比較麻煩, 你可以使用通配符號, 例如: sound/music_.mp3, 這樣就把sound目錄下以music_開頭的mp3文件都刪除了.
例如這樣, 新建一個 bash 腳本文件,del-music-mp3.sh:
$ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch projects/Moon.mp3' --prune-empty --tag-name-filter cat -- --all $ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch sound/Music_*.mp3' --prune-empty --tag-name-filter cat -- --all如果你看到類似下面這樣的, 就說明刪除成功了:
Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (266/266) # Ref 'refs/heads/master' was rewritten如果顯示 xxxxx unchanged, 說明repo里沒有找到該文件, 請檢查路徑和文件名是否正確.
注意: 補充一點, 如果你想以后也不會再上傳這個文件或文件夾, 請把這個文件或文件夾添加到.gitignore文件里, 然后再push你的repo.
步驟二: 推送我們修改后的repo
以強制覆蓋的方式推送你的repo, 命令下:
$ git push origin master -f這個過程其實是重新上傳我們的repo, 比較耗時, 雖然跟刪掉重新建一個repo有些類似, 但是好處是保留了原有的更新記錄, 所以還是有些不同的. 如果你實在不在意這些更新記錄, 也可以刪掉重建, 兩者也差不太多, 也許后者還更直觀些.
執行結果類似下面:
Counting objects: 4669, done. Delta compression using up to 4 threads. Compressing objects: 100% (4352/4352), done. Writing objects: 100% (4666/4666), 35.16 MiB | 51 KiB/s, done. Total 4666 (delta 1361), reused 0 (delta 0) To https://github.com/defunkt/github-gem.git+ beb839d...81f21f3 master -> master (forced update)為了能從打了 tag 的版本中也刪除你所指定的文件或文件夾,您可以使用這樣的命令來強制推送您的 Git tags:
$ git push origin master --force --tags步驟三: 清理和回收空間
雖然上面我們已經刪除了文件, 但是我們的repo里面仍然保留了這些objects, 等待垃圾回收(GC), 所以我們要用命令徹底清除它, 并收回空間.
命令如下:
$ rm -rf .git/refs/original/$ git reflog expire --expire=now --all$ git gc --prune=now Counting objects: 2437, done. # Delta compression using up to 4 threads. # Compressing objects: 100% (1378/1378), done. # Writing objects: 100% (2437/2437), done. # Total 2437 (delta 1461), reused 1802 (delta 1048) $ git gc --aggressive --prune=now Counting objects: 2437, done. # Delta compression using up to 4 threads. # Compressing objects: 100% (2426/2426), done. # Writing objects: 100% (2437/2437), done. # Total 2437 (delta 1483), reused 0 (delta 0)總結
以上是生活随笔為你收集整理的今天同大家聊一下Git扩展的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ESP32-C3的性价比到底有多高!乐鑫
- 下一篇: 乐鑫代理启明云端用图文带你一分钟快速了解