日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Git学习笔记------整理自廖雪峰官网教程

發布時間:2024/4/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Git学习笔记------整理自廖雪峰官网教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • CVS及SVN都是集中式的版本控制系統,而Git是分布式版本控制系統。集中式和分布式版本控制系統的區別

  集中式版本控制系統,版本庫是集中存放在中央服務器的,而干活的時候,用的都是自己的電腦,所以要先從中央服務器取得最新的版本,然后開始干活,干完活了,再把自己的活推送給中央服務器。所以集中式版本控制系統最大的毛病就是必須聯網才能工作,如果在局域網內還好,帶寬夠大,速度夠快。如果在互聯網上,則速度難以保證。

  而分布式版本控制系統根本沒有“中央服務器”,每個人的電腦上都是一個完整的版本庫,這樣,你工作的時候,就不需要聯網了,因為版本庫就在你自己的電腦上。既然每個人電腦上都有一個完整的版本庫,那多個人如何協作呢?比方說你在自己電腦上改了文件A,你的同事也在他的電腦上改了文件A,這時,你們倆之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。在實際使用分布式版本控制系統的時候,其實很少在兩人之間的電腦上推送版本庫的修改,因為可能你們倆不在一個局域網內,兩臺電腦互相訪問不了,也可能今天你的同事病了,他的電腦壓根沒有開機。因此,分布式版本控制系統通常也有一臺充當“中央服務器”的電腦,但這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣干活,只是交換修改不方便而已。

  和集中式版本控制系統相比,分布式版本控制系統的安全性要高很多,因為每個人電腦里都有完整的版本庫,某一個人的電腦壞掉了不要緊,隨便從其他人那里復制一個就可以了。而集中式版本控制系統的中央服務器要是出了問題,所有人都沒法干活了。

?

  • 安裝后使用

  因為Git是分布式版本控制系統,所以,每個機器都必須自報家門:你的名字和Email地址。所以安裝完后使用前注意要進行設置,輸入:

$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"

  注意git config命令的--global參數,用了這個參數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的用戶名和Email地址。

  對于git的命令的使用,在終端輸入git,得到git以下的命令列表:

  

  對于一些常規的命令的使用還是比較簡單的,而且上圖的說明很詳細。這里不做太多介紹(大家可以繼續往后看,后面會有總結)。

  • git工作原理(工作區和暫存區)

  工作區就是你在電腦里能看到的目錄,即本地目錄。工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD(分支和HEAD的概念之后再講)。

  現在理一下思路,涉及工作區和版本庫,可見目錄即是我們的工作區,隱藏目錄.git即是版本庫。版本庫分為了暫存區(stage)和分支(master)。個人認為版本庫涉及成暫存區和分支這種分了兩個層級,容錯性較好,比如你對其中的文件做了修改,可能想放棄修改,這是一回事,然后確定保存這個,是否提交又是另一回事。這比直接確定保存修改并提交這樣一個層級容錯性較好。

  了解git工作原理后,我們再來看看一些命令的具體功能。這樣我們對常用的命令走一遍加深理解,并熟悉命令的使用及流程。

  首先,對于創建一個空目錄,用init命令初始化,這使得該目錄變成Git可以管理的倉庫。然后新建一個文件(注意所有的版本控制系統,其實只能跟蹤文本文件的改動,不幸的是,Microsoft的Word格式是二進制格式,因此,版本控制系統是沒法跟蹤Word文件的改動的),把這個文件放入新建的空目錄下,子目錄也行(這是一個Git倉庫,放到其他地方Git再厲害也找不到這個文件)。然后輸入add命令,add命令的作用即是把文件修改添加到暫存區,然后確定提交則調用commit命令,即把暫存區內容提交到分支,一般commit命令必須帶提交說明,跟在-m后。

  checkout命令的意思就是,把文件在工作區的修改全部撤銷,這里有兩種情況:文件自修改后還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;文件已經添加到暫存區后,又作了修改,現在,撤銷修改就回到添加到暫存區后的狀態??傊?#xff0c;checkout就是讓這個文件回到最近一次git commit或git add時的狀態。

  reset的命令既可以回退版本,也可以把暫存區的修改回退到工作區。要進行版本回退,Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。當我們用HEAD時,表示最新的版本。從而用命令git reset HEAD file意思相當于把暫存區的修改撤銷掉(unstage),重新放回工作區。而版本回退更常見的做法是先調用git log命令,這個命令會列出提交歷史列表,每次提交說明前都有該版本對應的commit id。找到想要回退的id,使用reset命令即可(id可不用全寫,寫到可區分即可),而對于想回到未來,可先調用git reflog查看命令歷史,以便確定要回到未來的哪個版本。

  總結一下,如果進行了錯誤的修改,但這修改沒有add或commit,則直接調用checkout命令即可。如果進行了錯誤的修改,并且add或commit了,則需要用reset命令進行恢復。

  刪除文件rm,在Git中,刪除也是一個修改操作。確實要刪除文件,則刪除文件后,調用git rm命令,然后提交即可。命令git rm用于刪除一個文件。如果一個文件已經被提交到版本庫,那么你永遠不用擔心誤刪,但是要小心,你只能恢復文件到最新版本,你會丟失最近一次提交后你修改的內容。

  • 分支管理

  在版本回退里已經知道,每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,只有一條時間線,在Git里,這個分支叫主分支,即master分支。HEAD嚴格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當前分支。

  開始的時候,master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能確定當前分支,以及當前分支的提交點:

?

?

  當我們創建新的分支,例如dev時,Git新建了一個指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上:

  從上面可以看出Git創建一個分支很快,因為除了增加一個dev指針,改改HEAD的指向,工作區的文件都沒有任何變化。從而之后的修改提交都是針對dev分支了,master分支就不動了,而dev分支則不斷往后延長,在dev分支完成工作后,可以把dev分支合并到master分支,即直接把master指向dev當前提交,所以合并操作也很快。然后就可以把dev分支刪除,git鼓勵創建分支進行工作。相關命令:

  查看分支:git branch ?創建分支:git branch <name> ?切換分支:git checkout <name>

  創建+切換分支:git checkout -b <name> ?合并某分支到當前分支:git merge <name> ?刪除分支:git branch -d <name>

  合并沖突:以上提到兩個分支合并時,只有一個分支進行了提交,可以使用“快速合并”模式,如果合并的時候兩個分支都進行了新的提交,這種情況下,Git無法執行“快速合并”,只能試圖把各自的修改合并起來,但這種合并就可能會有沖突,這時必須解決沖突后再提交??梢杂胓it status查看哪個文件沖突到相關文件修改一致后再提交。用git log --graph命令可以看到分支合并圖。

  使用fast forward模式(快速合并)合并時,刪除分支后會丟失分支信息。如果要強制禁用Fast forward模式(加--no-ff參數),Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息。具體什么意思呢,就是用--no-ff模式合并它的合并圖如下,就是會創建一個新的提交,相當于把分支提交到最后合并版本,這樣可以看出中間有分支。所以這種模式調用命令如下:git merge --no-ff -m "merge with no-ff" dev后面要加提交參數即-m。 ?

  分支策略:首先,master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面干活;干活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發布時,再把dev分支合并到master上,在master分支發布1.0版本;你和你的小伙伴們每個人都在dev分支上干活,每個人都有自己的分支,時不時地往dev分支上合并就可以了。

  Bug分支:這是什么意思呢?就是我們正在工作的時候突然要修改bug(這個最好創建分支解決),這時我們可以用git stash將當前工作區內容保存起來,然后再創建分支,修改完畢后,再調用git stash apply恢復工作區,并且調用git stash drop來刪除stash內容?;蛘咧苯诱{用git stash pop,恢復的同時把stash內容也刪了。

  如果要丟棄一個沒有被合并過的分支,可以通過git branch -D <name>強行刪除

  • 遠程操作

  因為GitHub需要識別出你推送的提交確實是你推送的,而不是別人冒充的,而Git支持SSH協議,所以,GitHub只要知道了你的公鑰,就可以確認只有你自己才能推送。雖然github也支持http協議傳輸,但每次要輸入用戶名和密碼比較麻煩。所以在進行遠程操作前最好設置一下。具體操作:

  首先在shell中輸入

$ ssh-keygen -t rsa -C "youremail@example.com"

  一路回車后,在當前目錄下的.ssh中有id_rsa和id_rsa.pub兩個文件,這兩個就是SSH Key的秘鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。然后在GitHub個人設置的ssh keys中點add new key,將id_rsa.pub中的內容全部復制即可,標題可隨便寫。

  從遠程庫克隆:首先調用如下命令即可將遠程庫克隆到本地:

$ git clone git@github.com:michaelliao/gitskills.git

  實際上,Git支持多種協議,默認的git://使用ssh,但也可以使用https等其他協議。使用https除了速度慢以外,還有個最大的麻煩是每次推送都必須輸入口令,但是在某些只開放http端口的公司內部就無法使用ssh協議而只能用https。

  所以這里一定要用git不要用http的形式,因為只有用git的ssh協議才能每次提交不用輸密碼之類的,如果用http之后每次提交每次要輸密碼,很不方便。

  當你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,并且,遠程倉庫的默認名稱是origin。要查看遠程庫的信息,用git remote,注意這句命令只能在下載下來的目錄里運行,不然不會有反應。用git remote -v顯示更詳細的信息,所使用的協議等。

$ git remote -v origin git@github.com:michaelliao/learngit.git (fetch) origin git@github.com:michaelliao/learngit.git (push)

  上面顯示了可以抓取和推送的origin的地址。如果沒有推送權限,就看不到push的地址。

  推送分支,就是把該分支上的所有本地提交推送到遠程庫。推送時,要指定本地分支,這樣,

$ git push origin master

  Git就會把該分支推送到遠程庫對應的遠程分支上,當然也可以指定其他分支,如dev。

  當從遠程庫clone時,默認情況下,只能看到本地的master分支。如果要在dev分支上開發,就必須創建遠程origin的dev分支到本地,使用如下命令:

$ git checkout -b dev origin/dev

  在dev分支上進行修改后,可以用git push origin branch-name推送自己的修改;如果推送失敗,則因為遠程分支比你的本地更新,需要先用git pull試圖合并;如果合并有沖突,則解決沖突,并在本地提交;沒有沖突或者解決掉沖突后,再用git push origin branch-name推送就能成功!如果git pull提示“no tracking information”,則說明本地分支和遠程分支的鏈接關系沒有創建,用命令git branch --set-upstream branch-name origin/branch-name。以上是多人協作的模式。

  添加遠程庫:即已經在本地創建了一個Git倉庫后,又想在GitHub創建一個Git倉庫,并且讓這兩個倉庫進行遠程同步,這樣,GitHub上的倉庫既可以作為備份,又可以讓其他人通過該倉庫來協作。具體為

首先,登陸GitHub,然后,在右上角找到“Create a new repo”按鈕,創建一個新的倉庫比如leangit。之后可以在本地的倉庫下運行命令:

$ git remote add origin git@github.com:michaelliao/learngit.git

  這里要注意,把上面的michaelliao替換成你自己的GitHub賬戶名,否則,你在本地關聯的就是別人的遠程庫,關聯沒有問題,但是你以后推送是推不上去的,因為你的SSH Key公鑰不在別人的賬戶列表中。添加后,遠程庫的名字就是origin,這是Git默認的叫法,也可以改成別的,但是origin這個名字一看就知道是遠程庫。

  下一步,就可以把本地庫的所有內容推送到遠程庫上,由于遠程庫是空的,我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以后的推送或者拉取時就可以簡化命令(不用-u參數)。

$ git push -u origin master
  • 標簽管理

  Git的標簽是版本庫的快照,它其實就是指向某個commit的指針(跟分支很像對不對?但是分支可以移動,標簽不能移動),所以,創建和刪除標簽都是瞬間完成的。說白了標簽就是某一commit版本的版本號別名,方便查找管理。

  創建標簽:在Git中打標簽非常簡單,首先,切換到需要打標簽的分支上,然后敲命令git tag <name>就可以打一個新標簽。默認標簽是打在最新提交的commit上的。有時候,如果忘了打標簽,比如,現在已經是周五了,但應該在周一打的標簽沒有打,怎么辦?方法是找到歷史提交的commit id,然后打上就可以了git tag <name> <commit id>??梢杂妹頶it tag查看所有標簽。還可以創建帶有說明的標簽,用-a指定標簽名,-m指定說明文字。用命令git show <tagname>可以看到說明文字。

$ git tag -a v0.1 -m "version 0.1 released" 3628164

  刪除標簽:命令git tag -d <tagname>可以刪除一個本地標簽。命令git push origin :refs/tags/<tagname>可以刪除一個遠程標簽。

  推送標簽:命令git push origin <tagname>可以推送一個本地標簽,命令git push origin --tags可以推送全部未推送過的本地標簽。

?

  參考資料:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

  

?

?

?

?

  

?

轉載于:https://www.cnblogs.com/Dzhen/p/6931276.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Git学习笔记------整理自廖雪峰官网教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。