git基础命令学习
Git簡介
? Git是目前世界上最先進的分布式版本控制系統,編寫語言為C語言,2008年發布,作者:linus。
集中式與分布式區別
? 集中式版本控制系統對于版本庫的存儲是集中存放在中央服務器的,最大的毛病就是必須聯網才能工作,受限于網絡傳輸速率。
? 分布式版本控制系統根本沒有“中央服務器”,每個人電腦都有一個完整的版本庫。而相對于“中央服務器”,分布式版本控制系統通常也有一臺充當“中央服務器”的電腦,但這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣干活,只是交換修改不方便而已。
Git安裝注意事項
? git安裝后,需要進行最后一步設置:
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"因為Git是分布式版本控制系統,所以,每個機器都必須自報家門:你的名字和Email地址。
注意git config命令的--global參數,用了這個參數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的用戶名和Email地址。
版本庫
在git中,文件的狀態只有三種(已修改、已暫存、已提交)
- 已修改
- 在工作目錄修改Git文件
- 已暫存
- 對已修改的文件執行Git暫存操作(git add),將文件存入暫存區
- 已提交
- 將已暫存的文件執行Git提交操作(git commit),將文件存入版本庫
版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄里面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
- 如果你使用Windows系統,為了避免遇到各種莫名其妙的問題,請確保目錄名(包括父目錄)不包含中文。
版本庫創建過程:
#選擇一個合適的目錄 $ cd MyPWD $ mkdir MyRepository $ cd MyRepository #通過git init命令把這個目錄變成Git可以管理的倉庫 $ git init Initialized empty Git repository in MyPWD/.git/創建完成,版本庫目錄下會多出一個.git的目錄,這個目錄是Git來跟蹤管理版本庫的。
添加文件至版本庫 - 加入暫存區:
#注意添加文件的目錄需包含在版本庫同級或子級目錄 $ git add Mytxt.txt #無打印信息代表添加成功提交到版本庫 - 將文件存入版本庫:(提交新文件前需要先git add)
$ git commit -m "wrote a readme file" # -m 后面輸入的是本次提交的說明,可以輸入任意內容add可以多次添加文件,commit可以一次提交很多文件。
git status #顯示當前版本庫文件狀態 git diff #查看修改內容歷史版本切換操作
#顯示所有的版本信息提交日志[簡易顯示],克隆的工程允許查看過去操作 git log [--pretty=oneline] #恢復歷史版本,git log提交日志回溯刪除版本,git reflog記錄當前操作版本 git reset --hard HEAD^ #HEAD^代表上一個版本 HEAD^代表上上個版本 HEAD~100代表以前第100個版本 git reset --hard commit_id #commit_id為版本號,可通過git reflog查詢#顯示所有的操作記錄,包括提交,回退的操作,僅本地記錄,克隆的工程無法查看過去操作。 git reflog #找到歷史版本的commit id-版本序號前幾位工作區與暫存區
工程目錄 -> 工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。
git add把文件添加進去,實際上就是把文件修改添加到暫存區;
git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。
撤銷修改
#把readme.txt文件在工作區的修改全部撤銷,讓這個文件回到最近一次git commit或git add時的狀態 git checkout -- readme.txt刪除文件
在Git中,刪除也是一個修改操作
直接刪除一個文件:
git rm file #可直接刪除工作區文件,如果之前使用rm file了,則使用該命令意味著從版本庫確認刪除 git commit -m "remove file"添加遠程倉庫
在本地創建一個Git倉庫,并同步在GitHub創建一個Git倉庫。
關聯一個遠程庫
#關聯一個遠程庫 git remote add origin git@server-name:path/repo-name.git #或 git remote add origin https://github.com/path/repo-name.git #第一次推送master分支所有內容 git push -u origin master #隨后每次推送 git push origin master#刪除關聯 git remote rm origin #關聯兩個遠程庫 git remote add github git@github.com:MyGithub/learngit.git git remote add gitee git@gitee.com:MyGitee/learngit.git git remote -v gitee git@gitee.com:MyGitee/learngit.git (fetch) gitee git@gitee.com:MyGitee/learngit.git (push) github git@github.com:MyGithub/learngit.git (fetch) github git@github.com:MyGithub/learngit.git (push) #如果要推送到GitHub,使用命令: git push github master #如果要推送到Gitee,使用命令: git push gitee master #Git支持多種協議,包括https,但ssh協議速度最快。 https://github.com/path/repo-name.git #https url 直接有效網址打開,但是用戶每次通過git提交的時候都要輸入用戶名和密碼 git@github.com:path/repo-name.git #SSH URL 一次配置,永久使用。注意:使用此網址需要設置SSH Key。具體步驟見擴展#GitHub配置SSH Key的目的是為了幫助我們在通過git提交代碼是,不需要繁瑣的驗證過程,簡化操作流程。錯誤:
fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. #手動添加一個ssh公鑰即可解決這個問題,具體添加ssh公鑰的方法參見下方博客: # https://blog.csdn.net/u013778905/article/details/83501204SSH警告:
當你第一次使用Git的clone或者push命令連接GitHub時,會得到一個警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established. RSA key fingerprint is xx.xx.xx.xx.xx. Are you sure you want to continue connecting (yes/no)?這是因為Git使用SSH連接,而SSH連接在第一次驗證GitHub服務器的Key時,需要你確認GitHub的Key的指紋信息是否真的來自GitHub的服務器,輸入yes回車即可。
Git會輸出一個警告,告訴你已經把GitHub的Key添加到本機的一個信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.這個警告只會出現一次,后面的操作就不會有任何警告了。
如果你實在擔心有人冒充GitHub服務器,輸入yes前可以對照GitHub的RSA Key的指紋信息是否與SSH連接給出的一致。
分支
分支創建與切換:
#首先,我們創建dev分支,然后切換到dev分支: $ git checkout -b dev Switched to a new branch 'dev' #git checkout命令加上-b參數表示創建并切換,相當于以下兩條命令: $ git branch dev #創建分支 $ git checkout dev #切換分支 Switched to branch 'dev'查看分支:
#git branch命令會列出所有分支,當前分支前面會標一個*號 $ git branch * devmaster合并分支:
$ git merge dev #通常,合并分支時,如果可能,Git會用Fast forward模式,但這種模式下,刪除分支后,會丟掉分支信息。 #如果要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息。 #準備合并dev分支,請注意--no-ff參數,表示禁用Fast forward #因為本次合并要創建一個新的commit,所以加上-m參數,把commit描述寫進去。 $ git merge --no-ff -m "merge with no-ff" dev刪除分支:
$ git branch -d dev查看分支圖:
$ git log --graph #細節打印 $ git log --graph --pretty=oneline --abbrev-commit #精簡打印合并分支沖突:
當分支創建時,對新分支和主分支同時進行文件修改并提交到版本庫后進行分支合并將會產生以下錯誤:
Auto-merging readme.md CONFLICT (content): Merge conflict in readme.md Automatic merge failed; fix conflicts and then commit the result.這時只要進入對應文檔進行修正,再重新提交版本庫即可。
臨時存儲分支狀態,修正bug:
情景:碼代碼過程中,需要修改其他分支上的bug,但此時還不想提交。
$ git stash #保存現場 #隨后可以切換到有bug的分支上,創建新的分支以修改bug,最后提交同步。 $ git stash list #查看保存的工作現場#恢復現場的方法:一是: $ git stash apply #恢復后,stash內容并不刪除 $ git stash drop #刪除stash內容$ git stash apply stash@{0} #修改指定的stash #另一種方式是: $ git stash pop #恢復的同時把stash內容也刪了同步其他分支修改的內容 (bug) 到當前分支:
$ git cherry-pick <commit id> #git reflog 找到過去提交操作的id推送分支:
git remote -v #查看遠程庫信息,遠程倉庫的默認名稱是origin 如果沒有推送權限,默認就看不到push的地址。 git push origin master #master分支名 origin為添加遠程庫鏈接時設置的名稱,最終指向遠程庫。拉取分支:
#默認情況下,我們如果從遠程庫clone時,一般只能克隆到本地的master分支 #如果想在源程庫的其它分支上開發,比如dev,就必須創建遠程orgin的dev分支到本地 $ git checkout -b dev origin/dev#注意:如果他人推送了新的內容到了遠程庫,而我們需要提交新的推送,則要先拉取新的遠程庫,同步到本地庫中,并修改內容合并 #另外,輸入拉取命令git pull前需要指定本地dev分支與遠程origin/dev分支的鏈接 $ git branch --set-upstream-to=origin/dev dev $ git pull標簽管理
創建標簽:
#注意每一次git add & git commit操作都是一個版本,存在對應操作id[commit id] $ git tag <name> #在當前版本[commit id]打上新的標簽 $ git tag <name> <commit id>查看標簽:
#標簽總是和某個commit掛鉤。如果這個commit既出現在master分支,又出現在dev分支,那么在這兩個分支上都可以看到這個標簽。 $ git tag #查看所有標簽 $ git show <tagname> #查看標簽名 $ git tag -a <tagname> -m "version 0.1 released" <commit id> #創建帶有說明的標簽,用-a指定標簽名,-m指定說明文字刪除標簽:
#刪除本地標簽 $ git tag -d <tagname> $ git push origin <tagname> #推送某個標簽到遠程 $ git push origin --tags #推送全部尚未推送到遠程的本地標簽#刪除遠程標簽 #1.先從本地刪除標簽 $ git tag -d <tagname> #2.同步刪除 $ git push origin :refs/tags/<tagname> #路徑refs/tags下存儲了所有的tags信息 #冒號前面本來寫的是你本地的分支名(或者對象,標簽),冒號后面是遠程分支名,現在冒號前面什么也沒有,看起來就像是在遠程標簽前面加了個冒號一樣,因為你推送了空給這個標簽所以git認為你想刪除這個標簽遞歸拉取
$ git clone --recursive拉取深度
一般倉庫文件不大時,我們都可以用這個方法git clone倉庫,但問題是有時候,在倉庫歷史的某次commit時,有人不小心提交了1G的文件,雖然后面的commit中他把這個文件刪除了,但是在.git文件夾中仍然存儲著這個文件,所以如果我們克隆倉庫這個倉庫,會把所有的歷史協作記錄都clone下來,這樣整個文件會非常大,其實對于我們直接使用倉庫,而不是參與倉庫工作的人來說,只要把最近的一次commit給clone下來就好了。這就好比一個產品有很多個版本,我們只要clone最近的一個版本來使用就行了。實現這個功能就需要用到git clone --depth=1命令
$ git clone --depth 1 https://web.git而如果我們想只克隆某個指定分支的最近一次commit,可以使用下面命令
$ git clone --depth 1 --branch dev https://web.git上面提到的 git clone --depth=1 操作只會clone一個分支english,如果我們想把其他遠程分支(如master)也克隆到本地,我們需要用下面的命令
$ git remote set-branches origin 'remote_branch_name' $ git fetch --depth 1 origin remote_branch_name $ git checkout remote_branch_name轉換為完整克隆
git fetch --help ... --unshallowConvert a shallow repository to a complete one, removing all the limitations imposed by shallow repositories.#轉換為完整克隆 git fetch --unshallow總結
- 上一篇: ESP32-S3与ESP32-S2相比,
- 下一篇: 启明云端应用分享|基于乐鑫 ESP-WI