Git基础大全
?
官網:https://git-scm.com/
官網推薦的書籍:https://git-scm.com/book/zh/v2
#1.使用Git之前,需要做的最小配置
#1.1.配置user信息
git config --global user.name 'your_name' git config --global user.mail 'your_mail'然后還可以查看你的配置文件
git config --list你可以通過以下命令查看所有的配置以及它們所在的文件
git config --list --show-origin注意:如果一臺電腦,需要配置兩個不同的git用戶,則需要取消全局配置--global,然后進入到該項目中使用--local本地配置,這樣才能同時使用兩個不同的賬號管理同一套代碼。
#1.2.config三個作用域
缺省等同于local
git config --local注意:local只對某個個倉庫有效
git config --global注意:global對當前用戶所有倉庫有效
git config --system注意:system對系統所有登陸的用戶有效(這個比較少用)
顯示config的配置,加 --list
git config --list --localgit config --list --globalgit config --list --system要注意:如果想要使用local這個屬性,則需要去到該git項目里面才能進行操作,而不像global那樣,隨便在任意目錄下都可以進行設置用戶名和email
#1.3.查看git的日志信息,可以使用git log命令
git log查看日志的時候,使用完git log后一直顯示一個冒號無法退出 :解決方法其實很簡單,(英文狀態下)輸入字母q即可退出?。
#2.獲取Git倉庫的兩種方式
#2.1.將尚未進行版本控制的本地目錄轉換為 Git 倉庫
如果你有一個尚未進行版本控制的項目目錄,想要用 Git 來控制它,那么首先需要進入該項目目錄中,然后使用如下命令:
git init該命令將創建一個名為?.git?的子目錄,這個子目錄含有你初始化的 Git 倉庫中所有的必須文件,這些文件是 Git 倉庫的骨干。 但是,在這個時候,我們僅僅是做了一個初始化的操作,你的項目里的文件還沒有被跟蹤。
創建兩個文件
然后通過git add?命令來指定所需的文件來進行追蹤。然后執行?git commit命令,把文件提交到 Git 倉庫。
最后我們來看看提交后的狀態
#2.2.從其它服務器?克隆?一個已存在的 Git 倉庫
如果你想獲得一份已經存在了的 Git 倉庫的拷貝,比如說,你想為某個開源項目貢獻自己的一份力,這時就要用到?git clone?命令。 如果你對其它的 VCS 系統(比如說 Subversion)很熟悉,請留心一下你所使用的命令是"clone"而不是"checkout"。 這是 Git 區別于其它版本控制系統的一個重要特性,Git 克隆的是該 Git 倉庫服務器上的幾乎所有數據,而不是僅僅復制完成你的工作所需要文件。 當你執行?git clone?命令的時候,默認配置下遠程 Git 倉庫中的每一個文件的每一個版本都將被拉取下來。 事實上,如果你的服務器的磁盤壞掉了,你通常可以使用任何一個克隆下來的用戶端來重建服務器上的倉庫 (雖然可能會丟失某些服務器端的鉤子(hook)設置,但是所有版本的數據仍在?)
克隆倉庫的命令是 :
git clone <url>比如,我們通過下面命令,去克隆一個git項目回來。
git clone https://github.com/libgit2/libgit2這會在當前目錄下創建一個名為 “libgit2” 的目錄,并在這個目錄下初始化一個?.git?文件夾, 從遠程倉庫拉取下所有數據放入?.git?文件夾,然后從中讀取最新版本的文件的拷貝。 如果你進入到這個新建的?libgit2?文件夾,你會發現所有的項目文件已經在里面了,準備就緒等待后續的開發和使用。
#2.3.自定義本地倉庫的名字
git clone https://github.com/libgit2/libgit2 mylibgit這會執行與上一條命令相同的操作,但目標目錄名變為了?mylibgit。
#2.4.關聯本地倉庫和遠程倉庫
git remote add origin xxxxxxx#3.git add 多個文件和文件夾的方法
#3.1.git add 文件
方法一 git add 添加多個文件,文件之間以空格隔開
git add file1 file2 file3方法二 多次git add
git add file1 git add file2 git add file3方法三 添加指定目錄下的文件
config目錄下及子目錄下所有文件,home目錄下的所有.java文件
git config/* git home/*.java方法四 git add . 添加所有的文件, 或者 git add --all 添加所有的文件
git add . git add --all#3.2.git add 文件夾
git add 文件夾名#3.3.git commit 提交到版本庫
git add 目的是將修改文件由工作區提交到暫存區,可以多次提交
然后commit操作,將文件從暫存區提交到版本庫
#4.通過commit來認識暫存區和工作區
#4.1.了解一下ls -al 和ls -l命令的區別
ls -al會把隱藏的文件都顯示出來
#4.2.我們使用一個圖來展示一下add和commit的關系
一般情況下,我們可以通過多次git add files 把文件上傳到暫存區,然后再匯總一次性commit到歷史版本中。
#4.3.狀態簡覽
git status?命令的輸出十分詳細,但其用語有些繁瑣。 Git 有一個選項可以幫你縮短狀態命令的輸出,這樣可以以簡潔的方式查看更改。 如果你使用?git status -s?命令或?git status --short?命令,你將得到一種格式更為緊湊的輸出。
$ git status -sM README MM Rakefile A lib/git.rb M lib/simplegit.rb ?? LICENSE.txt新添加的未跟蹤文件前面有????標記,新添加到暫存區中的文件前面有?A?標記,修改過的文件前面有?M?標記。
輸出中有兩欄,左欄指明了暫存區的狀態,右欄指明了工作區的狀態。
例如,上面的狀態報告顯示:?README?文件在工作區已修改但尚未暫存,而?lib/simplegit.rb?文件已修改且已暫存。?Rakefile?文件已修,暫存后又作了修改,因此該文件的修改中既有已暫存的部分,又有未暫存的部分。
#5.忽略文件
一般我們總會有些文件無需納入 Git 的管理,也不希望它們總出現在未跟蹤文件列表。 通常都是些自動生成的文件,比如日志文件,或者編譯過程中創建的臨時文件等。 在這種情況下,我們可以創建一個名為?.gitignore?的文件,列出要忽略的文件的模式。
GitHub 有一個十分詳細的針對數十種項目及語言的?.gitignore?文件列表, 你可以在?https://github.com/github/gitignore?找到它。
# Compiled class file *.class# Log file *.log# BlueJ files *.ctxt# Mobile Tools for Java (J2ME) .mtj.tmp/# Package Files # *.jar *.war *.nar *.ear *.zip *.tar.gz *.rar# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid*我們再看一個?.gitignore?文件的例子
# 忽略所有的 .a 文件 *.a# 但跟蹤所有的 lib.a,即便你在前面忽略了 .a 文件 !lib.a# 只忽略當前目錄下的 TODO 文件,而不忽略 subdir/TODO /TODO# 忽略任何目錄下名為 build 的文件夾 build/# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt doc/*.txt# 忽略 doc/ 目錄及其所有子目錄下的 .pdf 文件 doc/**/*.pdf在最簡單的情況下,一個倉庫可能只根目錄下有一個?.gitignore?文件,它遞歸地應用到整個倉庫中。 然而,子目錄下也可以有額外的?.gitignore?文件。子目錄中的?.gitignore?文件中的規則只作用于它所在的目錄中。 (Linux 內核的源碼庫擁有 206個?.gitignore?文件。)
文件?.gitignore?的格式規范如下:
-
所有空行或者以?#?開頭的行都會被 Git 忽略。
-
可以使用標準的 glob 模式匹配,它會遞歸地應用在整個工作區中。
-
匹配模式可以以(/)開頭防止遞歸。
-
匹配模式可以以(/)結尾指定目錄。
-
要忽略指定模式以外的文件或目錄,可以在模式前加上嘆號(!)取反。
注意:只要把規則寫到了.gitignore文件里,就算不提交到暫存期,也是在本地會起作用的。
思考一個問題:如果一個文件已經在git倉庫里了,這個時候,再忽略掉,會是一種怎樣的情況?
參考該文章:https://shiyousan.com/post/636470505667009340/
所謂“已經被納入到Git的版本管理里面/跟蹤文件清單”,大體上指的是下面的三種情況:
基于這個問題,所以忽略文件應該在一開始創建項目的時候,就盡量添加上去,這就是規范。
#6.查看已暫存和未暫存的修改
如果?git status?命令的輸出對于你來說過于簡略,而你想知道具體修改了什么地方,可以用?git diff?命令。 稍后我們會詳細介紹?git diff,你通??赡軙盟鼇砘卮疬@兩個問題:當前做的哪些更新尚未暫存? 有哪些更新已暫存并準備好下次提交?
此命令比較的是工作目錄中當前文件和暫存區域快照之間的差異。 也就是修改之后還沒有暫存起來的變化內容。
git diff若要查看已暫存的將要添加到下次提交里的內容,可以用?git diff --staged?命令。 這條命令將比對已暫存文件與最后一次提交的文件差異。
注意:如果是直接使用git diff 命令,則會顯示所有已修改過文件對比情況。但一般情況下,我們都不會這樣去查看,基本上都是只對當個文件進行查看其修改的地方。所以一般我們會先使用git status 命令進行簡單查看哪些文件已修改,然后再使用git diff 文件路徑名 去查看單個文件已修改過的地方。
#7.給文件重命名的簡便方法
git mv 舊文件名 新文件名#8.跳過使用暫存區域
盡管使用暫存區域的方式可以精心準備要提交的細節,但有時候這么做略顯繁瑣。 Git 提供了一個跳過使用暫存區域的方式, 只要在提交的時候,給?git commit?加上?-a?選項,Git 就會自動把所有已經跟蹤過的文件暫存起來一并提交,從而跳過?git add?步驟。
git commit -a -m'備注'#9.移除文件
#9.1.文件不再納入版本管理
要從 Git 中移除某個文件,就必須要從已跟蹤文件清單中移除(確切地說,是從暫存區域移除),然后提交。 可以用?git rm?命令完成此項工作,并連帶從工作目錄中刪除指定的文件,這樣以后就不會出現在未跟蹤文件清單中了。
git rm 文件名下一次提交時,該文件就不再納入版本管理了。 如果要刪除之前修改過或已經放到暫存區的文件,則必須使用強制刪除選項?-f(譯注:即 force 的首字母)。 這是一種安全特性,用于防止誤刪尚未添加到快照的數據,這樣的數據不能被 Git 恢復。
#9.2.把文件從 Git 倉庫中刪除(亦即從暫存區域移除),但仍然希望保留在當前工作目錄中
另外一種情況是,我們想把文件從 Git 倉庫中刪除(亦即從暫存區域移除),但仍然希望保留在當前工作目錄中。 換句話說,你想讓文件保留在磁盤,但是并不想讓 Git 繼續跟蹤。 當你忘記添加?.gitignore?文件,不小心把一個很大的日志文件或一堆?.a?這樣的編譯生成文件添加到暫存區時,這一做法尤其有用。
為達到這一目的,使用?--cached?選項:
git rm --cached 文件名#10.查看提交的歷史
當?oneline?或?format?與另一個?log?選項?--graph?結合使用時尤其有用。 這個選項添加了一些 ASCII 字符串來形象地展示你的分支、合并歷史。
git log -n3 --oneline --graph其中一個比較有用的選項是?-p?或?--patch?,它會顯示每次提交所引入的差異(按?補丁?的格式輸出)。 你也可以限制顯示的日志條目數量,例如使用?-2?選項來只顯示最近的兩次提交(這里特別注意-n2 和 -2是一樣的效果的).
git log -2 -p該選項除了顯示基本信息之外,還附帶了每次提交的變化。 當進行代碼審查,或者快速瀏覽某個搭檔的提交所帶來的變化的時候,這個參數就非常有用了。 你也可以為?git log?附帶一系列的總結性選項。 比如你想看到每次提交的簡略統計信息,可以使用?--stat?選項。
git log -2 --stat#11.撤銷操作
有時候我們提交完了才發現漏掉了幾個文件沒有添加,或者提交信息寫錯了。 此時,可以運行帶有?--amend?選項的提交命令來重新提交。
git commit --amend如果來理解該命令的使用呢?就是說,該命令可以做兩件事情,第一是可以修改commit message的信息。第二是可以重新修改提交漏掉的文件。
做法:就是先把漏提交的文件,先通過git add 文件名 先提交上來,然后再使用 git commit --amend 命令進行修改,當使用該命令的時候,是可以修改commit message的信息的。然后通過vi語法進行保存。
最終你只會有一個提交——第二次提交將代替第一次提交的結果。
注意:當你在修補最后的提交時,并不是通過用改進后的提交?原位替換?掉舊有提交的方式來修復的, 理解這一點非常重要。從效果上來說,就像是舊有的提交從未存在過一樣,它并不會出現在倉庫的歷史中。
修補提交最明顯的價值是可以稍微改進你最后的提交,而不會讓“啊,忘了添加一個文件”或者 “小修補,修正筆誤”這種提交信息弄亂你的倉庫歷史。
#11.2.取消暫存的文件
接下來的兩個小節演示如何操作暫存區和工作目錄中已修改的文件。 這些命令在修改文件狀態的同時,也會提示如何撤消操作。 例如,你已經修改了兩個文件并且想要將它們作為兩次獨立的修改提交, 但是卻意外地輸入?git add *?暫存了它們兩個。如何只取消暫存兩個中的一個呢?
我通過git add . 把所有文件都上傳了,現在我取消了暫存區中xiaoli.txt文件
注意:git reset?確實是個危險的命令,如果加上了?--hard?選項則更是如此。 然而在上述場景中,工作目錄中的文件尚未修改,因此相對安全一些。
#11.3.撤消對文件的修改
如果你并不想保留對?C某個文件的修改怎么辦? 你該如何方便地撤消修改——將它還原成上次提交時的樣子(或者剛克隆完的樣子,或者剛把它放入工作目錄時的樣子)? 幸運的是,git status?也告訴了你應該如何做。 在最后一個例子中,未暫存區域是這樣。
它非常清楚地告訴了你如何撤消之前所做的修改。 讓我們來按照提示執行?
git checkout -- <file>請務必記得?git checkout -- <file>?是一個危險的命令。 你對那個文件在本地的任何修改都會消失——Git 會用最近提交的版本覆蓋掉它。 除非你確實清楚不想要對那個文件的本地修改了,否則請不要使用這個命令。
#12.遠程倉庫使用
#12.1.查看遠程倉庫
如果想查看你已經配置的遠程倉庫服務器,可以運行?git remote?命令。 它會列出你指定的每一個遠程服務器的簡寫。 如果你已經克隆了自己的倉庫,那么至少應該能看到 origin。
git remote你也可以指定選項?-v,會顯示需要讀寫遠程倉庫使用的 Git 保存的簡寫與其對應的 URL。
git remote -v如果你的遠程倉庫不止一個,該命令會將它們全部列出。
#12.2.添加遠程倉庫
?運行?git remote add <shortname> <url>?添加一個新的遠程 Git 倉庫,同時指定一個方便使用的簡寫。
git remote add origin http://120.78.0.12:100/yangmy/gittest.git#12.3.從遠程倉庫中抓取與拉取
git fetch <remote>這個命令會訪問遠程倉庫,從中拉取所有你還沒有的數據。 執行完成后,你將會擁有那個遠程倉庫中所有分支的引用,可以隨時合并或查看。
如果你使用?clone?命令克隆了一個倉庫,命令會自動將其添加為遠程倉庫并默認以 “origin” 為簡寫。 所以,git fetch origin?會抓取克隆(或上一次抓取)后新推送的所有工作。
必須注意?git fetch?命令只會將數據下載到你的本地倉庫——它并不會自動合并或修改你當前的工作。 當準備好時你必須手動將其合并入你的工作。
#12.4.git pull
如果你的當前分支設置了跟蹤遠程分支, 那么可以用?git pull?命令來自動抓取后合并該遠程分支到當前分支。 這或許是個更加簡單舒服的工作流程。默認情況下,git clone?命令會自動設置本地 master 分支跟蹤克隆的遠程倉庫的?master?分支(或其它名字的默認分支)。 運行?git pull?通常會從最初克隆的服務器上抓取數據并自動嘗試合并到當前所在的分支。
#12.5.推送到遠程倉庫
當你想分享你的項目時,必須將其推送到上游。 這個命令很簡單:git push <remote> <branch>。 當你想要將?master?分支推送到?origin?服務器時(再次說明,克隆時通常會自動幫你設置好那兩個名字), 那么運行這個命令就可以將你所做的備份到服務器。
git push origin master只有當你有所克隆服務器的寫入權限,并且之前沒有人推送過時,這條命令才能生效。 當你和其他人在同一時間克隆,他們先推送到上游然后你再推送到上游,你的推送就會毫無疑問地被拒絕。 你必須先抓取他們的工作并將其合并進你的工作后才能推送。
#12.6.查看某個遠程倉庫
如果想要查看某一個遠程倉庫的更多信息,可以使用?git remote show <remote>?命令。 如果想以一個特定的縮寫名運行這個命令。
它同樣會列出遠程倉庫的 URL 與跟蹤分支的信息。 這些信息非常有用,它告訴你正處于?master?分支,并且如果運行?git pull, 就會抓取所有的遠程引用,然后將遠程?master?分支合并到本地?master?分支。 它也會列出拉取到的所有遠程引用。
#12.7.遠程倉庫的重命名與移除
你可以運行?git remote rename?來修改一個遠程倉庫的簡寫名。 例如,想要將 origin重命名為?pd,可以用?git remote rename?這樣做。
值得注意的是這同樣也會修改你所有遠程跟蹤的分支名字。
#12.8.移除一個遠程倉庫
如果因為一些原因想要移除一個遠程倉庫——你已經從服務器上搬走了或不再想使用某一個特定的鏡像了, 又或者某一個貢獻者不再貢獻了——可以使用?git remote remove?或?git remote rm。
git remote remove 分支簡稱一旦你使用這種方式刪除了一個遠程倉庫,那么所有和這個遠程倉庫相關的遠程跟蹤分支以及配置信息也會一起被刪除。
#13.打標簽
像其他版本控制系統(VCS)一樣,Git 可以給倉庫歷史中的某一個提交打上標簽,以示重要。 比較有代表性的是人們會使用這個功能來標記發布結點(?v1.0?、?v2.0?等等)。
#13.1.列出標簽
git tag在 Git 中列出已有的標簽非常簡單,只需要輸入?git tag?(可帶上可選的?-l?選項?--list)
#13.2.創建標簽
Git 支持兩種標簽:輕量標簽(lightweight)與附注標簽(annotated)。
輕量標簽很像一個不會改變的分支——它只是某個特定提交的引用。
附注標簽是存儲在 Git 數據庫中的一個完整對象, 它們是可以被校驗的,其中包含打標簽者的名字、電子郵件地址、日期時間, 此外還有一個標簽信息,并且可以使用 GNU Privacy Guard (GPG)簽名并驗證。 通常會建議創建附注標簽,這樣你可以擁有以上所有信息。但是如果你只是想用一個臨時的標簽, 或者因為某些原因不想要保存這些信息,那么也可以用輕量標簽。
#13.2.1.附注標簽
在 Git 中創建附注標簽十分簡單。 最簡單的方式是當你在運行?tag?命令時指定?-a?選項。
git tag -a v1.0 -m "version 1.0"-m?選項指定了一條將會存儲在標簽中的信息。 如果沒有為附注標簽指定一條信息,Git 會啟動編輯器要求你輸入信息。
通過使用?git show?命令可以看到標簽信息和與之對應的提交信息。
git show v1.0輸出顯示了打標簽者的信息、打標簽的日期時間、附注信息,然后顯示具體的提交信息。
#13.2.2.輕量標簽
另一種給提交打標簽的方式是使用輕量標簽。 輕量標簽本質上是將提交校驗和存儲到一個文件中——沒有保存任何其他信息。 創建輕量標簽,不需要使用?-a、-s?或?-m?選項,只需要提供標簽名字。
git tag 標簽名 git show#13.3.后期打標簽
你也可以對過去的提交打標簽。 假設提交歷史是這樣的.
現在,假設在 v0.1 時你忘記給項目打標簽,也就是在 “版本1” 提交。 你可以在之后補上標簽。 要在那個提交上打標簽,你需要在命令的末尾指定提交的校驗和(或部分校驗和)。
git tag -a v0.1 eac50bd2ba4e52950deef0f633a2398055454ffc#13.4.共享標簽
默認情況下,git push?命令并不會傳送標簽到遠程倉庫服務器上。 在創建完標簽后你必須顯式地推送標簽到共享服務器上。 這個過程就像共享遠程分支一樣——你可以運行?git push origin <tagname>。
git push origin <tagname>如果想要一次性推送很多標簽,也可以使用帶有?--tags?選項的?git push?命令。 這將會把所有不在遠程倉庫服務器上的標簽全部傳送到那里。
git push origin --tags這樣遠程端就上傳上來了
#13.5.刪除標簽
要刪除掉你本地倉庫上的標簽,可以使用命令?git tag -d <tagname>。 例如,可以使用以下命令刪除一個輕量標簽。
注意上述命令并不會從任何遠程倉庫中移除這個標簽,你必須用?git push <remote>
更直觀的刪除遠程標簽的方式是
git push origin --delete <tagname>?
?
?
?
?
總結
- 上一篇: Spring Boot 配置文件密码加密
- 下一篇: 天翼云centos7.5系统挂载磁盘