前言
git是一個開源的分布式版本控制系統,可以有效、高速地處理從很小到非常大的項目版本管理。
git是一名程序員必須掌握技能。所以很有必要來學習一些常用git的指令。下面結合《pro git》來梳理常用的git指令。
文件狀態
在git倉庫下,每一個文件只有兩種狀態:已跟蹤、未跟蹤。 1、已跟蹤文件是指已經被納入版本控制的文件。 在上一次快照中有它們的記錄,在工作一段時間后,它們的狀態可能是未修改、已修改或已放入暫存區。
2、未跟蹤文件是指除了已跟蹤文件之外的其他文件。 它們既不存在與上次快照的記錄中,也沒有被放入暫存取。
狀態轉換
初次clone某個倉庫時,目錄下的所有文件都是已跟蹤文件,并處于未修改狀態。
編輯某些文件后,由于自上次提交后對它們做了修改,git將它們標記為已修改文件。將這些修改過的文件放入暫存區,然后提交所有暫存了的修改,如此反復。文件的狀態變化周期-> 如圖所示
檢查當前文件狀態--git status
運用git status命令查看哪些文件處于什么狀態。
- 情景一: 在clone倉庫后立即使用該命令
說明所有已跟蹤文件在上次提交后都未被更改過。此外還表明,當前目錄下沒有出現任何未跟蹤狀態的新文件。
- 情景二: 創建一個新文件--a.md
[圖片上傳中...(image-68c20-1601109587410-18)]
新建的a.md文件出現在Untracked files下面。未跟蹤文件是git在之前的快照中沒有的文件。git不會自動將其納入跟蹤范圍,需要手動增加。
跟蹤新文件--git add
運用git add跟蹤一個文件。
只要在Changes to be committed下,就說明是已暫存狀態。如果此時commit,那么該文件就會被存在歷史快照中。
查看已暫存和未暫存的修改--git diff
git status的輸出過于模糊,不清楚具體的修改。這時,可以運用git diff命令。
- 情景一:編輯a.md文件后先不暫存。然后運用git diff
可以清楚的看到當前文件和暫存區域快照之間的差異。也就是修改之后還沒有暫存起來的變化內容。
- 情景二:創建b.md文件后暫存。然后運用git diff --staged
git diff --staged命令將比對已暫存文件與最后一次提交的文件差異
- 注意:git diff本身只顯示尚未暫存的改動,而不是自上次提交以來所做的所有改動。所以有時候你一下子暫存了所有更新過的文件后,運行git diff后卻什么也沒有,就是這個原因。
提交更新 git commit
運用git commit將會啟動文本編輯器以便輸入本次提交的說明
也可以在 commit 命令后添加 -m 選項,將提交信息與命令放在同一行。
給git commit加上-a選項,git就會自動把所有已經跟蹤過的文件暫存起來一并提交,從而跳過 git add步驟。
查看提交歷史
在開發中,想查看commit歷史。最簡單的就是用git log。
不傳入任何參數的默認情況下,git log會按時間先后順序列出所有的提交,最近的更新排在最上面。 如圖所示,這個命令會列出每個提交的SHA-1校驗和、作者的名字和電子郵件地址、提交時間以及提交說明。
git log有許多選項可以幫助搜尋所要找的提交,下面介紹幾個最常用的選項。
- 其中一個比較有用的選項是-p,它會顯示每次提交所引入的差異。與此同時,你也可以使用-1選項來僅顯示最近的一次提交
- 另一個非常有用的選項是--pretty(詳細參數,請查閱文檔)。這個選項可以使用不同于默認格式的方式展示提交歷史。
撤消操作
在任何一個階段,都有可能想要撤消某些操作。學習幾個撤消修改的基本命令將對你大有裨益。但是有些撤消操作是不可逆的。這是在使用git的過程中,會因為操作失誤而導致之前的工作丟失的少有的幾個地方之一。
- 情景一:有時候提交完了才發現漏掉了幾個文件沒有添加,或者提交信息寫錯了。 此時,可以運行帶有--amend選項的提交命令嘗試重新提交
$ git commit --amend
這個命令會將暫存區中的文件提交。如果自上次提交以來還未做任何修改,那么快照會保持不變,而所修改的只是提交信息。
- 情景二:有時候已經修改了a.md和b.md兩個文件并且想要將它們作為兩次獨立的修改提交,但是卻意外地輸入了git add *全部暫存了。如何只取消暫存a.md呢?
git reset HEAD a.md
- 情景三:對a.md做了修改,但不想保留修改,想撤銷這個修改。將它還原成上次提交時的樣子。
git checkout -- a.md
遠程倉庫的使用
為了能在任意git項目上協作,需要知道如何管理自己的遠程倉庫。
查看遠程倉庫--git remote
已經克隆了自己的倉庫,那么至少應該能看到origin,這是git克隆的倉庫服務器的默認名字。
也可以指定選項 -v,會顯示需要讀寫遠程倉庫使用的git保存的簡寫與其對應的URL
添加遠程倉庫--git remote add shortname url
git remote add origin https://github.com/../../..
之后就可以在命令行中使用字符串origin來代替整個url
從遠程倉庫中抓取與拉取
1、git fetch [remote-name]
這個命令會訪問遠程倉庫,從中拉取所有目前本地倉庫還沒有的數據。執行完成后,將會擁有那個遠程倉庫中所有分支的引用,可以隨時合并或查看。
這命令并不會自動合并或修改當前本地的工作。當準備好時必須手動將其合并入本地的工作。
2、git pull [remote-name]
與git fetch類似也會拉取遠程倉庫的數據。
區別在于git pull抓取數據后,會自動嘗試合并到當前所在的分支。
推送到遠程倉庫--git push
當想要將master分支推送到origin服務器時,那么運行這個命令就可以將你所做的備份到服務器
git push origin master
打標簽
可以給歷史中的某一個提交打上標簽,以示重要。比較有代表性的是人們會使用這個功能來標記發布功能版本(v1.0 等等)。
列出標簽--git tag
這個命令以字母順序列出標簽
如果只對v2.0標簽系列感興趣的,可以輸入
git tag -l 'v2.0*'
創建標簽
git使用兩種主要類型的標簽: 1、輕量標簽
- 一個輕量標簽很像一個不會改變的分支——它只是一個特定提交的引用
2、附注標簽
附注標簽是存儲在git數據庫中的一個完整對象。它們是可以被校驗的;
其中包含打標簽者的名字、電子郵件地址、日期時間;
通常建議創建附注標簽,這樣你可以擁有以上所有信息;
創建附注標簽: 運行tag命令時指定-a選項來創建附注標簽,-m選項指定了一條將會存儲在標簽中的信息
git tag -a v1.0 -m "first version 1.0"
運行git show命令可以看到標簽信息與對應的提交信息
git show v1.0
創建輕量標簽:
輕量標簽本質上是將提交校驗和存儲到一個文件中——沒有保存任何其他信息。創建輕量標簽,不需要使用-a、-s或-m選項,只需要提供標簽名字。
git tag v1.0
如果在標簽上運行git show,不會有額外的標簽信息
后期打標簽
情景一:現在開發v1.3版本,經過幾輪commit之后才發現沒有打v1.2標簽。 想要在增加ignore那次commit中打上v1.2標簽
只需要在命令的末尾指定提交的校驗和(或部分校驗和)
git tag -a v1.2 0bec1b1d2 '標簽信息'
再次查看
共享標簽
默認情況下,git push命令并不會傳送標簽到遠程倉庫服務器上。在創建完標簽后必須手動地推送標簽到共享服務器上。
- 可以運行 git push origin [tagname]。
git push origin v1.2
- 可以使用帶有--tags選項的git push命令。這將會把所有不在遠程倉庫服務器上的標簽全部傳送到那里。
git push origin --tags
刪除標簽
- 刪除本地標簽可以使用命令 git tag -d [tagname]
git tag -d v1.2
分支管理
分支列表--git branch
運行git branch如果不加任何參數,會得到當前所有分支的一個列表
$ git branch
iss53
* master
testing
- master分支前的*字符代表當前HEAD指針所指向的分支。
如果需要查看每一個分支的最后一次提交,可以運行git branch -v命令
$ git branch -v
iss53 93b412c fix javascript issue
* master 7a98805 Merge branch 'iss53' testing 782fd34 add scott to the author list in the readmes
分支的新建與合并
分支新建--git branch [branchName] 運行git branch 'dev',創建dev分支
分支切換--git checkout [branchName] 運行git checkout dev,切換到dev分支
分支合并--git merge [branchName] 在master中運行git merge dev,將dev分支與master進行合并。
儲藏與清理
有時,在項目的一個分支上已經工作一段時間,所有東西都進入了混亂的狀態,而這時想要切換到另一個分支做一點別的事情。問題是,不想僅僅因為過會兒回到這一點而為做了一半的工作創建一次提交。這時可以運用git stash命令。
- 改動a.md,然后運行git status看當前狀態
- 現在想要切換分支,但是還不想要提交之前的工作;所以儲藏修改。運行git stash或 git stash save:
要查看儲藏的東西,可以使用git stash list:
要恢復儲藏的工作,可以使用git stash apply
文件的改動被重新應用了,但是之前暫存的文件卻沒有重新暫存。必須使用 --index 選項來運行git stash apply命令,來嘗試重新應用暫存的修改
git stash apply --index
刪除存儲的工作,可以運用git stash drop加上將要移除的儲藏的名字來移除它。也可以通過git stash pop移除棧頂元素
綜合
下面通過一個綜合的例子,可以說是大多數程序員都會遇到的案例來說明運用git的工作流程。
1、進行某個項目的開發。 2、為實現v1.2版本的新需求開發而創建一個新的分支。 3、在這個新分支上開展工作。
正在此時,突然接到一個電話說已發行的版本上有個很嚴重的問題需要緊急修補。 按照下面方法進行操作: 1、切換到線上分支(production branch)。 2、為這個緊急任務新建一個分支,并在其中修復它。 3、在測試通過之后,切換回線上分支,然后合并這個修補分支,最后將改動推送到線上分支。 4、切換回v1.2版本的分支上,繼續工作。
1、新建issue1.2分支
git checkout -b issue1.2
// 等同于下面兩條指令 git branch issue1.2 git checkout issue1.2
2、在issue1.2上有一些提交
vim footer.js git commit -a -m 'added a footer.js in issue1.2'
3、接到緊急任務
接到那個緊急任務電話。有了git的幫助,所要做的僅僅是切換回 master 分支。
但是,在checkout之前,要存儲當前分支上工作目錄和暫存區里那些還沒有被提交的修改。
git stash
然后切換到master
git checkout master
這個時候,工作目錄和issue1.2開發之前一模一樣,可以專心修復緊急問題了。
建立一個針對該緊急問題的分支(hotfix branch),在該分支上工作直到問題解決
git checkout -b hotfix vim index.html git commit -a -m 'fixed some broken'
4、將hotfix合并到master上
確保修改是正確的,然后將其合并回master分支來部署到線上
git checkout master git merge hotfix
最新的修改已經在 master 分支所指向的提交快照中,你可以著手發布該修復了。 然后刪除hotfix分支
git branch -d hotfix
5、切換到issue1.2分支繼續工作
git checkout issue1.2
取出存儲的文件改動
git stash apply --index
現在已經實現了1.2版本的功能,打算更新到master上
git checkout master git merge issue1.2
然后刪除issue1.2分支
git branch -d 'issue1.2'
總結
掌握上面的常用git指令,應該能滿足日常的開發。在此基礎上再去學習一些高級指令或一些騷操作,能讓你的開發更加流暢。
結尾
更多文章請移步樓主github,如果喜歡請點一下star,對作者也是一種鼓勵。
作者: zhangwinwin
鏈接: 梳理git的常用指令
來源: github