1. 程式人生 > >Git入門-超詳細教程

Git入門-超詳細教程

從廖老師網站上總結的Git筆記,對常見操作進行了總結。

一 版本庫、檔案操作

1. 建立版本庫

  GitBash中 cd 到需要作為版本庫的目錄,執行git init,建立成功後會生成.git資料夾

2. 新增檔案到版本庫

  首先,檔案必須放在在版本庫對應的目錄下,   新增檔案到版本庫步驟:

  1. git add 檔案.檔案型別,將檔案放進暫存區(暫存區,工作區概念詳見第4小節)
  2. git commit -m “本次提交的說明”,新增到版本庫 備註: git status 隨時掌握工作狀態,提示資訊分析:   Changes to be committed: 已進入暫存區,但還未提交到版本庫,需要commit   Changes not staged for commit
    :更改了,但是還未進入暫存區   Untracked files:表示該檔案還從來沒有被新增進版本庫

3. 版本回退

  1. git log 顯示從最近到最遠的提交日誌,git log --pretty=oneline 使每個日誌單獨成行。
  2. git中,用HEAD表示當前版本
  3. 回退到上一個版本:git reset --hard HEAD^,一個“^”表示回退1個版本,“~100”回退100個版本。
  4. 返回新版本:git reset --hard 新版本的Id
  5. git reflog檢視命令歷史,以便確定要回到未來的哪個版本

4. 工作區和暫存區

  工作區:在電腦裡能看到的目錄; 版本庫:在工作區有一個隱藏目錄.git,是Git的版本庫。 Git的版本庫中存了很多東西,其中最重要的就是稱為stage(或者稱為index)的暫存區,還有Git自動建立的master,以及指向master的指標HEAD。 在這裡插入圖片描述

  1. git diff HEAD -- readme.txt命令可以檢視工作區和版本庫裡面最新版本的區別
  2. Git是跟蹤修改的,而不是跟蹤檔案,每次修改,如果不用git add到暫存區,那就不會加入到commit中。

撤消修改

  1. 當你改亂了工作區某個檔案的內容,想直接丟棄工作區的修改時,用命令git checkout -- file
  2. 當你不但改亂了工作區某個檔案的內容,還新增到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file就回到了場景1,第二步按場景1操作。
  3. 已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠端庫。

刪除檔案

  1. 提交到版本庫的檔案,可以先 rm file刪除檔案
  2. 確實要從版本庫中刪除該檔案,那就用命令git rm file刪掉,並且git commit
  3. 另一種情況是刪錯了,因為版本庫裡還有呢,所以可以很輕鬆地把誤刪的檔案恢復到最新版本git checkout -- file 備註git checkout -- file就是將版本庫的檔案替代工作區的檔案

二 遠端倉庫關聯、克隆

1: 在GitHub上新增公鑰

  1. 建立GitHub賬號
  2. 建立SSH Key,GitBash執行 ssh-keygen -t rsa -C "[email protected]",在使用者主目錄(在Bash先後中執行 cd ~/.sshpwd即可找到主目錄路徑)下檢查是否有.ssh目錄,裡面有id_rsa(私鑰)和id_rsa.pub(公鑰)兩個檔案,這兩個就是SSH Key的祕鑰對。
  3. 開啟GitHub,在個人主頁找到setting,找到SSH and GPG keys,然後,點“New SSH Key”,填上任意Title,在Key文字框裡貼上id_rsa.pub檔案的內容。 在這裡插入圖片描述

2: 將本地倉庫與遠端倉庫關聯

  1. 本地倉庫為git,在GitHub上同樣新建一個倉庫為git,此時遠端git倉庫為空.
  2. 建立遠端倉庫後,在GitBash中,在本地的gitm目錄裡,執行命令git remote add origin [email protected]:使用者名稱/倉庫名.git實現關聯
  3. 執行git push -u origin master本地庫的內容推送到遠端,用git push命令,實際上是把當前分支master推送到遠端(執行完後在GitHub上就可看到內容)。以後每次本地提交後,使用命令git push origin master推送最新修改

3: 從遠端倉庫克隆

  1. 首先確保遠端倉庫有需要克隆的倉庫,然後cd到本地倉庫目錄的上一級目錄,執行:git clone [email protected]:使用者名稱/倉庫名.git,就會發現克隆到本地了。
  2. Git支援多種協議,包括https,但通過ssh支援的原生git協議速度最快

三 分支管理

1: 建立與合併分支

  1. 建立分支dev: git branch dev;切換至div分支:git checkout dev,一句話:git checkout -b dev
  2. git branch命令檢視當前分支,當前分支前面會標一個*
  3. 合併分支 ,先git checkout master切換到主分支,然後執行git merge dev進行合併。然後可以再執行git branch -d dev刪除分支
  4. 檢視分支:git branch 建立分支:git branch name 切換分支:git checkout name 建立+切換分支:git checkout -b name 合併某分支到當前分支:git merge name 刪除分支:git branch -d name

2: 解決分支衝突

  當Git無法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。解決衝突就是把Git合併失敗的檔案手動編輯為我們希望的內容,再提交。用git log --graph命令可以看到分支合併圖。   備註: 進入log後直接按 Q就可以退出。

3: 分支管理策略

  合併分支時,預設採取的為Fast farword模式,這種合併看不到合併歷史,但是這種模式下,刪除分支會丟掉分支資訊。 1.禁用Fast farword模式時,合併分支會產生一個commit, git merge --no-ff -m "merge with no-ff" dev 其中,--no-ff引數,表示禁用Fast forward。 採用git log --graph --pretty=oneline --abbrev-commit檢視分支歷史。

備註:不用–no-ff,實際上只是將master的指標update成dev分支而已,用的還是dev的commit ID,而使用之後,則是重新commit了一哈,有了新的commit ID 在這裡插入圖片描述

4: Bug分支

我個人覺得場景是這樣的。設A為遊戲軟體

  1. master 上面釋出的是A的1.0版本
  2. dev 上開發的是A的2.0版本
  3. 這時,使用者反映 1.0版本存在漏洞,有人利用這個漏洞開外掛
  4. 需要從dev切換到master去填這個漏洞,正常必須先提交dev目前的工作,才能切換。
  5. 而dev的工作還未完成,不想提交,所以先把dev的工作stash一下git stash。然後切換到master
  6. 如果是在master修復bug,就在master建立分支issue101並切換. git checkout -b issue101
  7. 在issue101上修復漏洞,並git commit
  8. 修復後,在master上合併issue101 ,git merge --no-ff -m "merged bug fix 101" issue-101
  9. 切回dev,git stash list命令看看stash內容,然後git stash pop,恢復的同時把stash內容也刪了繼續工作。

5:強制分支刪除

  發一個新feature,最好新建一個分支;如果要丟棄一個沒有被合併過的分支,可以通過git branch -D branchname強行刪除。

6:多人協作

多人協作的工作模式通常是這樣

  1. 檢視遠端庫資訊,使用git remote -v

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

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

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

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

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

四 標籤管理

1: 前言

    Git的標籤就是是版本庫的快照,它其實就是指向某個commit的指標(跟分支很像,但是分支可以移動,標籤不能移動),所以,建立和刪除標籤都是瞬間完成的。      注意:標籤總是和某個commit掛鉤。如果這個commit既出現在master分支,又出現在dev分支,那麼在這兩個分支上都可以看到這個標籤。

2:建立標籤

  1. 切換到需要打標籤的分支 ,然後 git tag tagname備註: 可以用git tag檢視所有標籤,             可以用git show tagname檢視標籤資訊
  2. 標籤預設是打在最新的commit上,如果需要打在之前的commit上,可以使用git log --pretty=oneline --abbrev-commit檢視commit id,然後用git tag tagname commitId打上就可以了。
  3. 建立帶有說明的標籤,用-a指定標籤名,-m指定說明文字,git tag -a tagname -m "tag說明" commitId

3:操作標籤

  1. 命令git push origin tagname可以推送一個本地標籤到遠端;

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

  3. 命令git tag -d tagname可以刪除一個本地標籤;

  4. 如果標籤已經推送到遠端,但又需要刪除的話,可以先用命令git push origin :refs/tags/tagname刪除一個遠端標籤,然後再用git tag -d tagname刪除本地標籤。