Git入門-超詳細教程
從廖老師網站上總結的Git筆記,對常見操作進行了總結。
一 版本庫、檔案操作
1. 建立版本庫
GitBash中 cd 到需要作為版本庫的目錄,執行git init
,建立成功後會生成.git
資料夾
2. 新增檔案到版本庫
首先,檔案必須放在在版本庫對應的目錄下, 新增檔案到版本庫步驟:
git add
檔案.檔案型別,將檔案放進暫存區(暫存區,工作區概念詳見第4小節)git commit -m “本次提交的說明”
,新增到版本庫 備註:git status
隨時掌握工作狀態,提示資訊分析:Changes to be committed
: 已進入暫存區,但還未提交到版本庫,需要commitChanges not staged for commit
Untracked files
:表示該檔案還從來沒有被新增進版本庫
3. 版本回退
git log
顯示從最近到最遠的提交日誌,git log --pretty=oneline
使每個日誌單獨成行。- git中,用
HEAD
表示當前版本 - 回退到上一個版本:
git reset --hard HEAD^
,一個“^”表示回退1個版本,“~100”回退100個版本。 - 返回新版本:
git reset --hard 新版本的Id
git reflog
檢視命令歷史,以便確定要回到未來的哪個版本
4. 工作區和暫存區
工作區:在電腦裡能看到的目錄; 版本庫:在工作區有一個隱藏目錄.git,是Git的版本庫。 Git的版本庫中存了很多東西,其中最重要的就是稱為stage(或者稱為index)的暫存區,還有Git自動建立的master,以及指向master的指標HEAD。
git diff HEAD -- readme.txt
命令可以檢視工作區和版本庫裡面最新版本的區別- Git是跟蹤修改的,而不是跟蹤檔案,每次修改,如果不用git add到暫存區,那就不會加入到commit中。
撤消修改
- 當你改亂了工作區某個檔案的內容,想直接丟棄工作區的修改時,用命令
git checkout -- file
。 - 當你不但改亂了工作區某個檔案的內容,還新增到了暫存區時,想丟棄修改,分兩步,第一步用命令
git reset HEAD file
就回到了場景1,第二步按場景1操作。 - 已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠端庫。
刪除檔案
- 提交到版本庫的檔案,可以先
rm file
刪除檔案 - 確實要從版本庫中刪除該檔案,那就用命令
git rm file
刪掉,並且git commit
- 另一種情況是刪錯了,因為版本庫裡還有呢,所以可以很輕鬆地把誤刪的檔案恢復到最新版本
git checkout -- file
備註:git checkout -- file
就是將版本庫的檔案替代工作區的檔案
二 遠端倉庫關聯、克隆
1: 在GitHub上新增公鑰
- 建立GitHub賬號
- 建立SSH Key,GitBash執行
ssh-keygen -t rsa -C "[email protected]"
,在使用者主目錄(在Bash先後中執行cd ~/.ssh
、pwd
即可找到主目錄路徑)下檢查是否有.ssh
目錄,裡面有id_rsa
(私鑰)和id_rsa.pub
(公鑰)兩個檔案,這兩個就是SSH Key的祕鑰對。 - 開啟GitHub,在個人主頁找到setting,找到
SSH and GPG keys
,然後,點“New SSH Key”,填上任意Title,在Key文字框裡貼上id_rsa.pub檔案的內容。
2: 將本地倉庫與遠端倉庫關聯
- 本地倉庫為git,在GitHub上同樣新建一個倉庫為
git
,此時遠端git倉庫為空. - 建立遠端倉庫後,在GitBash中,在本地的
git
m目錄裡,執行命令git remote add origin [email protected]:使用者名稱/倉庫名.git
實現關聯 - 執行
git push -u origin master
本地庫的內容推送到遠端,用git push命令,實際上是把當前分支master推送到遠端(執行完後在GitHub上就可看到內容)。以後每次本地提交後,使用命令git push origin master
推送最新修改
3: 從遠端倉庫克隆
- 首先確保遠端倉庫有需要克隆的倉庫,然後cd到本地倉庫目錄的上一級目錄,執行:
git clone [email protected]:使用者名稱/倉庫名.git
,就會發現克隆到本地了。 - Git支援多種協議,包括https,但通過ssh支援的原生git協議速度最快
三 分支管理
1: 建立與合併分支
- 建立分支dev:
git branch dev
;切換至div分支:git checkout dev
,一句話:git checkout -b dev
- 用
git branch
命令檢視當前分支,當前分支前面會標一個*
號 - 合併分支 ,先
git checkout master
切換到主分支,然後執行git merge dev
進行合併。然後可以再執行git branch -d dev
刪除分支 - 檢視分支: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為遊戲軟體
- master 上面釋出的是A的1.0版本
- dev 上開發的是A的2.0版本
- 這時,使用者反映 1.0版本存在漏洞,有人利用這個漏洞開外掛
- 需要從dev切換到master去填這個漏洞,正常必須先提交dev目前的工作,才能切換。
- 而dev的工作還未完成,不想提交,所以先把dev的工作stash一下
git stash
。然後切換到master - 如果是在master修復bug,就在master建立分支issue101並切換.
git checkout -b issue101
- 在issue101上修復漏洞,並
git commit
。 - 修復後,在master上合併issue101 ,
git merge --no-ff -m "merged bug fix 101" issue-101
- 切回dev,
git stash list
命令看看stash內容,然後git stash pop
,恢復的同時把stash內容也刪了繼續工作。
5:強制分支刪除
發一個新feature,最好新建一個分支;如果要丟棄一個沒有被合併過的分支,可以通過git branch -D branchname
強行刪除。
6:多人協作
多人協作的工作模式通常是這樣
-
檢視遠端庫資訊,使用
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
,如果有衝突,要先處理衝突。
四 標籤管理
1: 前言
Git的標籤就是是版本庫的快照,它其實就是指向某個commit的指標(跟分支很像,但是分支可以移動,標籤不能移動),所以,建立和刪除標籤都是瞬間完成的。 注意:標籤總是和某個commit掛鉤。如果這個commit既出現在master分支,又出現在dev分支,那麼在這兩個分支上都可以看到這個標籤。
2:建立標籤
- 切換到需要打標籤的分支 ,然後
git tag tagname
。 備註: 可以用git tag
檢視所有標籤, 可以用git show tagname
檢視標籤資訊 - 標籤預設是打在最新的commit上,如果需要打在之前的commit上,可以使用
git log --pretty=oneline --abbrev-commit
檢視commit id,然後用git tag tagname commitId
打上就可以了。 - 建立帶有說明的標籤,用-a指定標籤名,-m指定說明文字,
git tag -a tagname -m "tag說明" commitId
3:操作標籤
-
命令
git push origin tagname
可以推送一個本地標籤到遠端; -
命令
git push origin --tags
可以推送全部未推送過的本地標籤; -
命令
git tag -d tagname
可以刪除一個本地標籤; -
如果標籤已經推送到遠端,但又需要刪除的話,可以先用命令
git push origin :refs/tags/tagname
刪除一個遠端標籤,然後再用git tag -d tagname
刪除本地標籤。