git筆記

git是目前最先進的分佈式版本控制系統

一.集中式VS分佈式

1.集中式:版本庫是集中放在中央服務器的,而幹活的時候是用自己電腦,先從中央服務器獲取最新版本,然後工作。工作完畢,推送給中央服務器

2.分佈式:分佈式系統中根本沒有“中央服務器“,每個人的電腦上有一個完整的頒佈,工作的時候不必聯網,因爲版本庫就在本機

二.Windows上安裝Git

百度搜索git,下載國內鏡像就可以,直接安裝就可以

安裝完成,鼠標右鍵Git Bash Here,進行設置

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

三.創建版本庫

1.選擇一個合適的地方,創建一份空目錄

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit

pwd:顯示當前位置

2.將這個目錄變成git可以管理的倉庫

$ git init
3.新建一個文件,如何加入git倉庫?

(1)git add 文件名

(2)git commit -m "備註"

當我們成功提交了一份文件,我們可以使用 git status 查看倉庫當前的狀態。同樣我們可以使用git diff 查看文件具體被修改了什麼內容。

四.版本退回修改,撤銷,刪除

1.版本退回 git reset

使用git log 命令可以用於查看提交歷史,以便確定好退回到哪一個版本,顯示的順序是最近到最遠提交的日誌

git log --pretty=oneline 格式控制,前面的一串表示commit id,紅色部門表示版本號

$ git log --pretty=oneline
<span style="color:#ff0000;">3628164</span>fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file

HEAD表示當前版本,HEAD^表示上一個版本,HEAD^^表示上上個版本

git reset --hard HEAD^  退回到上一個版本

git reset --hard 3628164   退回到某一個版本

注意:要重返未來,用git reflog查看命令歷史,以便確定要回到未來的哪個版本

2.版本退回 gitcheckout --file

如果你不小心改錯了文件,如果還沒有進行add,commit,可以很容易修改,因爲文件修改過後還沒有放到暫存區,現在撤銷就回到和版本庫中一模一樣的狀態

如果已經添加到暫存區,可以使用git checkout --file

注意:git checkout -- file命令中的--很重要,沒有--,就變成了“切換到另一個分支”的命令

場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file

場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。

場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。

3.刪除文件

正常情況下在文件管理器中將沒有用的文件刪除了,可以使用rm 文件,此時git 知道你把文件刪除了,可以使用git status查看刪除了那些文件

如果確定要從版本庫中刪除該文件:git rm 文件,再commit

如果不小心刪除錯了,可以從版本庫中恢復:git checkout --文件

五.遠程倉庫

1.創建SSH Key

$ ssh-keygen -t rsa -C "[email protected]"
如果一切順利的話,可以在用戶主目錄裏找到.ssh目錄,裏面有id_rsaid_rsa.pub兩個文件,這兩個就是SSH Key的祕鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人

2.登錄GitHub

找到Settings,Add SSH Key,添加任意title在key裏面粘貼:id_rsa.pub文件的內容

    3.添加遠程倉庫

    在git上創建一個倉庫,名字就是自己本地倉庫的名字就可以,如何將本地倉庫與遠程庫關聯?

添加後,遠程庫的名字就是origin,這是Git默認的叫法,也可以改成別的,但是origin這個名字一看就知道是遠程庫。

$ git remote add origin [email protected]:michaelliao/learngit.git

使用git push -u orgin master,把本地庫的內容推送到遠程,用git push命令,實際上是把當前分支master推送到遠程。

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

注意:SSH警告

當你第一次使用

$ git merge --no-ff -m "merge with no-ff" dev

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.

這個警告只會出現一次,後面的操作就不會有任何警告了

4.從遠程庫克隆 git clone

$ git clone [email protected]:michaelliao/gitskills.git

六.分支管理

1.創建合併分支:

(1)創建分支:git checkout -b dev ,其中-b表示創建並切換,相當於先git branch dev,再git checkout dev

(2)查看當前分支:git branch

(3)合併分支:git merge dev,合併的模式是:快進模式

(4)刪除分支:git branch -d dev

2.解決衝突

當兩個分支上都對某個文件進行了修改,合併的時候會有衝突,先手動解決衝突,在提交,合併。git log --graph命令可以看到分支合併圖

3.分支管理策略

分支合併的時候,git會用fast forward模式,這種模式下,刪除分支後,會丟掉分支信息,可以強制禁用fast forward 模式,這樣git在merge會生成一個新的commit,這樣可以從分支歷史上看出分支信息

$ git merge --no-ff -m "merge with no-ff" dev
4.Bug分支

當手頭工作沒有完成時,先把工作現場git stash一下,然後去修復bug,修復後,再git stash pop,回到工作現場。

修復bug時,我們會通過創建新的bug分支進行修復,然後合併,最後刪除;

總結:

(1)--no-ff:不使用fast-forward方式合併,保留分支的commit歷史

(2)--squash:使用squash方式合併,將多次分支commit歷史壓縮爲一次


5.Feature分支

添加一個新功能時,你肯定不希望因爲一些實驗性質的代碼,把主分支搞亂了,所以,每添加一個新功能,最好新建一個feature分支,在上面開發,完成後,合併,最後,刪除該feature分支。如果要丟棄一個沒有被合併過的分支,可以通過git branch -D <name>強行刪除。

最後:

  • 查看遠程庫信息,使用git remote -v

  • 本地新建的分支如果不推送到遠程,對其他人就是不可見的;

  • 從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠程的新提交;

  • 在本地創建和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;

  • 建立本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name

  • 從遠程抓取分支,使用git pull,如果有衝突,要先處理衝突。

    • 命令git tag <name>用於新建一個標籤,默認爲HEAD,也可以指定一個commit id;

    • git tag -a <tagname> -m "blablabla..."可以指定標籤信息;

    • git tag -s <tagname> -m "blablabla..."可以用PGP簽名標籤;

    • 命令git tag可以查看所有標籤。

      • 命令git push origin <tagname>可以推送一個本地標籤;

      • 命令git push origin --tags可以推送全部未推送過的本地標籤;

      • 命令git tag -d <tagname>可以刪除一個本地標籤;

      • 命令git push origin :refs/tags/<tagname>可以刪除一個遠程標籤。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章