Git官網:https://git-scm.com/
一、Git下載
官網首頁下載,當前最新版本:2.24.1

本人下載的是Git for Windows版本:Git-2.24.1.2-64-bit.exe
二、安裝
基本上按照默認選項安裝即可,

安裝成功后在開始選單生成Git目錄和3個子選單,
Git Bash:一個封裝過的cmd命令列,并在其中加入了一些新的命令與功能,(linux風格)
Git CMD(Deprecated):cmd命令列界面,提示已棄用,(windows風格)
Git GUI:可視化圖形界面,
三、Git作業流程
1、作業流程圖

Workspace:作業區,電腦里能看到的目錄
Index/Stage:暫存區,存放在.git/index中,所以暫存區有時也叫作索引(index),
Repository:版本庫(本地倉庫),作業區的隱藏目錄.git
Remote:遠程倉庫,托管代碼的服務器
2、作業區之間關系和命令

3、Git常用命令速查表

四、設定自己的用戶名和郵箱
打開Git Bash,界面如下:
先后輸入下面2條命令并回車:
git config --global user.name "用戶名"
git config --global user.email "郵箱"

五、創建版本庫(repository)
1、執行cd d:命令進入d盤
2、執行mkdir gitRepo命令在d盤創建目錄gitRepo
3、執行pwd命令可以查看當前目錄
4、執行git init命令把gitRepo目錄變成Git管理的版本庫

六、Git的基本操作
1、提交版本庫、查看狀態等
(1)在d:/gitRepo手動建立檔案test.txt,內容為“第1行”;
(2)打開Git Bash執行cd d:/gitRepo進入此目錄;
(3)先后執行git add和git commit命令,把檔案提交到暫存區,再把暫存區提交到版本庫;
(4)執行git status查看狀態,git提示作業區是干凈的,沒有什么需要提交;
(5)編輯檔案test.txt,加入一行內容“第2行”;
(6)執行git status查看狀態,git提示檔案被修改過了,但還沒提交,使用git add <file>...提交,使用git restore <file>...取消修改;
(7)執行git diff test.txt,比較作業區和暫存區;(如果使用git diff HEAD test.txt則是比較作業區和版本庫)
2、版本回退(接上面例子)
(1)先后執行git add和git commit命令
(2)使用git log查看提交歷史,也可使用git log --pretty=oneline簡化輸出
18b6a...和a8a4d...是版本號,Git用HEAD表示當前版本,即18b6a...,上一次版本是HEAD^,上上一個版本就是HEAD^^,也可以用數字表示,如HEAD~2
(3)使用git reset --hard HEAD^還原到上一個版本,執行行命令后打開test.txt可看到內容被還原了
(4)假設第(3)是誤操作,想回到它之前的歷史,則可使用git reset --hard 18b6a(版本號不需寫全)
(5)版本號也可使用命令git reflog查詢
3、撤銷修改(接上面例子)
(1)編輯檔案test.txt,加入一行內容“第3行”;
(2)此時還沒添加到暫存區,可使用git checkout -- test.txt撤回作業區的修改
(3)編輯檔案test.txt,加入一行內容“第3行”,并使用git add添加到暫存區;
(4)此時檔案已添加到暫存區,可使用git reset HEAD test.txt撤銷暫存區的修改,然后再使用git checkout -- test.txt撤回作業區的修改;
4、洗掉檔案的還復(接上面例子)
洗掉也是一種修改,洗掉的方式有2種:
如果使用rm相當于在資源管理器里面直接洗掉,只洗掉作業區的檔案,可以直接使用checkout還原;
如果使用git rm則是洗掉作業區和暫存區的檔案,需要先使用reset,再使用checkout還原(只用這個會報錯);
備注:如果想徹底洗掉檔案,則git rm后需要git commit,

七、GitHub配置SSH Key
在用github管理專案的時候,可使用https url和SSH url兩種方式克隆到本地,
https url和SSH url區別:
(1)使用https url克隆,只需要復制https url,然后到git Bash里面直接用clone命令克隆到本地就好了;可以隨意克隆github上的專案;在push時需要驗證用戶名和密碼,
(2)使用SSH url克隆需要是要克隆的專案的擁有者或管理員,且需要先添加 SSH key ,SSH 在push的時候,不需要輸入用戶名,如果配置SSH key的時候設定了密碼,則需要輸入密碼,否則直接是不需要輸入密碼的,
GitHub配置SSH Key的流程:
1、設定自己的用戶名和郵箱(見上面)
2、創建一個 SSH key
打開Git Bash,執行命令:ssh-keygen -t rsa -C "自己的郵箱地址",
程序中會提示輸入檔案名,直接按回車用默認檔案名,之后提示輸入密碼,按回車表示不需要輸入密碼,
在用戶主目錄下會生成id_rsa和id_rsa.pub兩個檔案,id_rsa是私鑰(不能泄露),id_rsa.pub是公鑰,
3、登陸GitHub ->右上角頭像處選擇“Settings”-> SSH and GPG keys -> New SSH key ->
Title隨便寫,在Key文本框里粘貼id_rsa.pub檔案的內容 -> 點擊“Add SSH key”保存,

保存后如下:
4、測驗SSH key
輸入ssh -T [email protected],回傳一段警告資訊,輸入yes即可,
因為創建SSH key是沒有設定密碼,所以這里不用輸入密碼,
八、GitHub倉庫的操作
1、GitHub創建Git倉庫
在本地創建了一個Git倉庫,同步到GitHub倉庫上,這樣別人可以通過GitHub倉庫來協作,
(1)登陸GitHub創建倉庫
登陸GitHub ->右上角頭像處選擇“Your repositories”-> New -> 在“Repository name”下面輸入名稱,如gitRepo -> 點擊“Create repository”提交,

(2)把本地倉庫關聯到GitHub倉庫
git remote add origin [email protected]:jlccn/gitRepo.git
備注:jlccn是本人的GitHub賬戶名;gitRepo是上面第(1)建立的Repository name;origin是遠程庫名字,這是Git默認的叫法,
(3)把本地倉庫的內容推送到GitHub倉庫
執行命令:git push -u origin master
備注:第一次推送master分支時,由于遠程庫是空的,所以加上-u引數,表示把本地master分支內容推送到遠程master分支,還會把本地的master分支和遠程的master分支關聯起來,以后的推送或者拉取時就可以省略-u引數,
本人是win7系統,推送時報錯ssh:connet to host github.com port 22:Connection timed out
應該是22埠被防火墻禁用了,啟用方法如下:
控制面板(右上角選擇查看方式為大圖示)—>防火墻—>高級設定—>高級設定—>出站規則—>最右邊 新建規則“新建出站規則向導”—>選擇第二個“埠”—>下一步,默認TCP,默認特定遠程埠,后面輸入22 —>下一步,允許連接—> 下一步—>下一步,名稱隨便輸入如“22埠”—>完成,
重新執行git push命令,成功了,
(4)查看GitHub頁面,可看到檔案test.txt已經同步上去,

2、從遠程庫克隆到本地
從頭開始,在GitHub創建遠程庫,再克隆到本地,
(1)登陸GitHub創建倉庫
登陸GitHub ->右上角頭像處選擇“Your repositories”-> New -> 在“Repository name”下面輸入名稱,如gitRepo2,勾選Initialize this repository with a README -> 點擊“Create repository”提交,
(2)執行cd d:切換到d盤根目錄
(3)執行git clone [email protected]:jlccn/gitRepo2.git
備注:jlccn是本人的GitHub賬戶名;gitRepo2是上面第(1)建立的Repository name,
運行后,在d盤自動創建目錄gitRepo2,內容如下:

九、分支管理
1、分支基本操作
查看分支:git branch創建分支:git branch <name>切換分支:git checkout <name>或者git switch <name>創建+切換分支:git checkout -b <name>或者git switch -c <name>合并某分支到當前分支:git merge <name>洗掉分支:git branch -d <name>
(1)創建并切換到dev分支
備注:相當于兩條命令git brance dev和git checkout dev,也可以使用最新的命令git switch -c dev
(2)查看分支
(3)手動修改test.txt增加一行“第3行分支”,然后提交
(4)切換回master分支
備注:也可以使用git switch master
打開test.txt,會發現剛才添加的內容不見了,因為剛才提交是在dev分支上,不會影響到master分支,
(5)把dev分支合并到master分支上
備注:上面的Fast-forward表示這次合并是“快進模式”,這種模式下,洗掉分支后,會丟掉分支資訊,
如果要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支資訊,
禁用Fast forward可以加上引數--no-ff,完整命令git merge --no-ff -m "merge with no-ff" dev
打開test.txt,分支添加的內容已經有了,
(6)合并后洗掉dev分支
2、解決沖突
當Git無法自動合并分支時,就必須先解決沖突,把Git合并失敗的檔案手動編輯下,再提交,合并完成,
例子:
(1)創建并切換到feature1分支
(2)修改test.txt,增加一行“第4行分支feature1”,內容如下:
第1行第2行第3行分支第4行分支feature1
(3)在feature1分支上提交
(4)切換到master分支
Git會自動提示我們當前master分支比遠程的master分支要超前1個提交,
在master分支上把test.txt檔案增加一行“第4行master分支”:
第1行第2行第3行分支第4行master分支
提交master分支
(5)這種情況下Git執行快速合并,會報錯
打開test.txt,內容如下:
第1行第2行第3行分支<<<<<<< HEAD第4行master分支=======第4行分支feature1>>>>>>> feature1
git status可以查看沖突的檔案
(6)手動編輯test.txt內容并保存,然后再提交
第1行第2行第3行分支第4行分支feature1第5行master分支
用帶引數的git log可以看到分支的合并情況
(7)洗掉feature1分支

3、Bug分支
當接到一個需要修復bug的優先任務時,手頭作業沒有完成時,沒法提交,
這時可以先把作業現場git stash一下,然后去修復bug,修復后,再git stash pop,回到作業現場,
在master分支上修復的bug,想要合并到當前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“復制”到當前分支,避免重復勞動,
例子:
(1)創建并切換到dev分支
(2)編輯test.txt,增加下面最后一行內容:
第1行第2行第3行分支第4行分支feature1第5行master分支第6行dev分支處理中...
(3)此時接到一個修復bug任務,可以使用git stash保存作業區的修改
此時打開test.txt,會發現第(2)添加的最后一行內容不見了,
(4)假設在master分支上修復bug,切換到master分支上,并創建臨時分支
(5)模擬修復bug,手動編輯test.txt,內容如下,然后提交
第1行第2行第3行分支第4行分支feature1第5行master分支:修復bug
備注:留意本次提交的版本號d12d0fb,在后面有用到,
(6)切換master分支,并完成合并,最后洗掉issue-101分支
(7)切換回dev分支
用git status顯示作業區是干凈的,用git stash list查看保存的作業現場
恢復有兩個辦法:
一是用git stash apply恢復,但是恢復后,stash內容并不洗掉,需要用git stash drop來洗掉;
另一種方式是用git stash pop,恢復的同時把stash內容也刪了:
用git stash list查看,就看不到任何stash內容了:
打開test.txt檔案,內容如下(注意第5行內容不一樣):
第1行第2行第3行分支第4行分支feature1第5行master分支第6行dev分支處理中...
(8)模擬完成dev任務,手動編輯test.txt,內容如下,然后提交
第1行第2行第3行分支第4行分支feature1第5行master分支第6行dev分支處理完成
(9)修復dev分支的同個bug
dev分支是早期從master分支分出來的,所以,這個bug其實在當前dev分支上也存在,
使用git cherry-pick d12d0fb命令,復制一個特定的提交到當前分支,
備注:因為修改的是同個檔案,所以這里提示有沖突,
打開test.txt,內容如下:
第1行第2行第3行分支第4行分支feature1<<<<<<< HEAD第5行master分支第6行dev分支處理完成=======第5行master分支:修復bug>>>>>>> d12d0fb... fixbug 101
修改為:
第1行第2行第3行分支第4行分支feature1第5行master分支:修復bug第6行dev分支處理完成
然后再提交即可,
4、Feature分支
在dev分支開發時,每添加一個新功能,最好新建一個feature分支,在上面開發,完成后,合并,最后,洗掉該feature分支,
但有時feature分支提交后,還沒合并,feature分支的功能沒用了,這時要洗掉分支,就要使用-D引數強制洗掉,
(1)當前是dev分支,切換并創建feature2分支
(2)開發完后提交
(3)切換加dev,準備合并,然后洗掉feature2分支
(4)此時因某種原因新功能取消,洗掉feature2分支,用-d洗掉
提示還沒有被合并,如果洗掉,將丟失掉修改,如果要強行洗掉,需要使用大寫的-D引數,
(5)強行洗掉
備注:不洗掉沒用的分支,也沒什么影響,只是看起來比較亂,
5、多人協作的流程
(1)首先,可以試圖用git push origin <branch-name>推送自己的修改;
(2)如果推送失敗,則因為遠程分支比你的本地更新,需要先用git pull試圖合并;
(3)如果合并有沖突,則解決沖突,并在本地提交;
(4)沒有沖突或者解決掉沖突后,再用git push origin <branch-name>推送就能成功!
如果git pull提示no tracking information,則說明本地分支和遠程分支的鏈接關系沒有創建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>,
例子:
(1)查看遠程庫資訊:git remote
(2)查看遠程庫詳細資訊:git remote -v
(3)推送分支:git push origin master
小結:
本地新建的分支如果不推送到遠程,對其他人就是不可見的;
并不是所有本地分支都需要往遠程推送:
master分支是主分支,因此要時刻與遠程同步;
dev分支是開發分支,團隊所有成員都需要在上面作業,所以也需要與遠程同步;
bug分支只用于在本地修復bug,沒必要推到遠程;
feature分支是否推到遠程,取決于是否和團隊成員合作在上面開發,
十、標簽管理
1、打標簽
切換到要打標簽的分支上,輸入命令git tag <name>打標簽
備注:默認標簽是打在最新提交的commit上的,
2、歷史提交的commit id打標簽
3、查看所有標簽
4、查看標簽資訊
5、創建帶有說明的標簽,用-a指定標簽名,-m指定說明文字
6、用命令git show <tagname>可以看到說明文字:
7、洗掉標簽
8、推送某個標簽到遠程
因為創建的標簽都只存盤在本地,不會自動推送到遠程,
9、如果標簽已經推送到遠程,要洗掉遠程標簽,要先從本地洗掉,再從遠程洗掉

參考:https://www.liaoxuefeng.com/wiki/896043488029600
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/2456.html
標籤:其他
