git 0基礎入門—git入門與實踐(4)—詳細圖解git存儲操作及超詳細的rebase變基操作與原理及遠程倉庫多人開發詳細操作

git入門與實踐(4)

1. git 存儲

1. 1 問題引入

image-20200701114947081

提交,並創建分支

image-20200701115140212

並添加文件內容:

image-20200701115209619

添加暫存區

image-20200701115332868

  這個時候發現上一個版本開發的過程中有問題,需要修復一下。於是趕緊切換回master分支,其實最好再開一個分支處理這個問題。

image-20200701115556487

  在branch2分支上,首先創建一個文本b。

  log打印暫存區還有a.txta.txt是在branch1時候暫存的,如果僅提交b.txt的話,無意間也會提交a.txt。遇到這種問題怎麼辦?

image-20200701120220928

1. 1. 1 解決

  當在一個分支中向暫存區添加內容,切換到另一個分支時,提交commit會帶上另一分支中的暫存內容。這個時候就需要先保存a.txt(另一分支中的暫存內容),再處理當前需要提交的內容。

切換回branch1

image-20200701121329819

  我們把目前的暫存記錄保存起來。

1. 1. 1. 1 git stash

  git stash存儲暫存區及工作目錄修改文件

image-20200701121502959

1. 1. 1. 2 git stash list

  git stash list 打印所有存儲內容

image-20200701121538712

  查看狀態:暫存區就沒了

image-20200701121716604

  再切換回branch2,去提交b.txt文件。這樣問題就解決了。

image-20200701121852703

  我們利用了branch2修復了bug,解決了問題後,現在刪除分支。

  發現報錯了,原因是我們當前的HEAD指向branch2,得切換回master再刪除

image-20200701122036310

  同時因爲branch沒有進行合併,因此必須用-D強制刪除

image-20200701122303838

1. 1. 1. 3 git stash apply

  git stash apply <stashName>

  緊接着,想把之前存的東西恢復。

image-20200701122445968

  我們發現存的時候在暫存區,而取得時候卻不在暫存區了。

1. 1. 1. 3. 1 git stash apply --index

  git stash apply --index 將存儲內容重新應用(默認不保留已暫存內容)

  將原暫存依舊以暫存進行取出

  因爲重複取內容,所以報錯,我們可以在工作區將a.txt刪除再取

image-20200701122807654

image-20200701122857822

1. 1. 1. 3. 2 git stash apply 標號 --index

  如果存儲了多個,恢復時需加上標號

image-20200701123406589

1. 1. 1. 4 git stash drop

  移除存儲

  git stash drop

  刪除之後,再git stash list打印存儲列表頁不存在了。

image-20200701123058612

image-20200701123156157

1. 1. 1. 5 git stash 標號 drop

  如果存儲了多個,移除時需加上標號

image-20200701123524333

1. 1. 1. 6 git stash -u

  git stash -u 在上面的基礎上帶上未追蹤文件
  我們新建一個文件,不放入暫存直接存儲,但是查看狀態,記錄仍在哦!我們可以存儲的時候加上-u告訴它在存儲的時候,未追蹤的文件也一樣存儲起來。

image-20200701123735065git stash -u

  大家可能好奇,第一次什麼也沒存儲,怎麼還添加上去了。原因是起初對a文件是有修改的,雖然取出來了但並沒提交。

image-20200701124006295

  現在看看文件狀態

image-20200701124256219

  取出存儲

git stash apply 'stash@{0}'

image-20200701124655128

1. 2 小結

  當在一個分支上面,有準備提交或者添加暫存區的內容,又不希望它現在被提交,可以先把它存儲起來。再切換分支,去另一個分支做另外的事情,等到那邊進行完畢了。再切換回分支,將存儲的內容拉取出來,最好再提交或添加暫存區。

2. rebase變基操作

  和merge同樣都是進行合併操作的。
  區別在於,將一個分支的內容都移至另一個分支上。

2. 1 回顧merge與rebase對比

  回顧merge,它是以c2、c4、c5爲基準創建一個合併,整合到c6提交。合併的時候,切換到master主分支,將branch1合併過來。

image-20200701135314401

  如果是rebase,則c3也參與進來。把想要合併的分支作爲當前分支,進行合併。

2. 2 模擬rebase操作

  初始化git,並創建5個文件

image-20200701131438664

進行c1、c2提交

image-20200701131539603

開並切換分支branch1,再提交c3

image-20200701131705208

c4提交

image-20200701131935221

切換回master,c5提交

image-20200701132029782

image-20200701132140746

  rebase把想要合併的分支作爲當前分支,進行合併。我們切換到branch1,再合併(master作爲基點,將branch1合併過去)。

  形成了一條直線(branch1master處在同一條線上),HEADbranch1上,

image-20200701132713071

2. 1. 1 動態演示

  在c2分支branch1,做了兩次提交,在c2後master進行了一次c5提交。我們想要合併的是branch1,所以切換HEAD指向branch1。接下來執行變基操作,然後git會進行rebase分析。

2. 1. 1. 1 rebase分析(工作流程)
  1. 首先找到兩個分支的共同祖先
  2. 然後對比當前分支與祖先的歷次提交,進行提取相應修改(提取c3、c4),並保存爲臨時文件(對應c6、c7),將當前分支指向目標基底(master主分支),最後將之前存爲臨時文件的修改(對應c6、c7)依序應用
  3. HEAD指向目標基底(master主分支)末尾(對應c7
  4. 這就形成了一條直線路徑了(c1->c2->c5->c6->c7
  5. rebase只是把分支提交內容放到主分支上,實際上並沒有進行合併,因此最終還是需要執行merge命令的。
  6. 先將HEAD指向master分支上,再執行merge命令,然後就進行快速前移了。

image-20200701134804066

2. 1. 1. 2 c3、c4和c6、c7是同一個節點嗎?

  我們對比兩次c3、c4的哈希是不一樣的,因爲hash是唯一的,所以證明它們都是不同的節點。可能有人疑問之前的c3、c4去哪了?這其實和reset重置是一樣的,重置之後,被遺棄的節點就沒有指向了,並且這類節點如果長時間未使用,會被git進行回收(類似編程語言的垃圾回收機制)。

image-20200701134433934

2. 1. 2 rebase好處

  經過上述操作,我們實際上發現,c3和c4依然保留在記錄中。不會像merge操作,直接合併成了c7,但是c3、c4在路線上卻不存在了。這樣既保留了原始記錄,又不會妨礙版本迭代開發,造成主線的冗餘。

2. 1. 3 rebase和merge應用場景

  如注重每次提交要有詳細過程,可選用rebase,而注重結果精簡過程的話,就選用merge

3. 別名

  有時候覺得常用的命令字母多了點,例如:
git checkout
  我們輸入的時候,會花費很長的時間,那不如給它取個別名吧~

git config --global alias.co checkout

  不想配成全局,而是本地則:

git config --local alias.co checkout . 後面 co 爲別名

image-20200701141126174

  注意:不是任何東西都可以取別名的,還需要熟悉命名規則,所以不建議改別名。

4. 多人合作開發模式

  以防萬一,我們把本地的倉庫不小心刪除,所以我們需要一個可以備份的地方,這個地方可以是我們的網盤,也可以是u盤,或者是類似於經常用到的github。

  但是u盤或網盤這類的存儲方式雖然可以保存備份,卻不能適用於多人的開發,如果我們想要多人的開發,就需要有一箇中央倉庫,可以給團隊開發中的每個人下載並且使用。

4. 1 中央倉庫

  存儲每個成員的提交對象,共享提交對象給每個成員。

  推薦github:https://github.com/(註冊與使用自己問度娘吧!或者參考其餘小迪的git文章吧。)

image-20200701162319051

4. 2 分佈式版本控制系統(git、svn)

  分佈在每個成員的電腦上,都有一個本地倉庫,任何一個電腦的本地倉庫不小心丟失,都可以從成員處找回,或者可以從中央倉庫進行下載共享,保存歷史紀錄的任務分配到了每個開發成員的身上,中央倉庫只需要整合共享。

image-20200701162337508

5. 配置忽略文件

  前提:創建並連接倉庫與本地管理

  參考github提示:

image-20200701153333570

image-20200701153309391

我們往裏添加一個doc文件

image-20200701143340002

  我們會發現,有些時候我就是不希望git管理文件夾中的某個文件,每一次查看狀態總是告訴我未追蹤,很麻煩~
.gitignore文件,列出忽略文本模式

  注意以.開頭的文件我們是無法手動創建的,我們需要用命令行去創建。

image-20200701143432800

5. 1 編寫規則

  與正則表達式類似

# 相當於註釋

* 匹配零個或多個任意字符

[ ] 匹配任意一個在方括號內的字符,[abc] 匹配這三個字母其中之一即可

只匹配一個任意字符

** 表示匹配任意中間目錄

! 忽略指定文件以外的文件或目錄(白名單)

[x-x]在這個範圍的都可以匹配,如[0-9] 代表0~9的範圍

image-20200701143837146

需求:忽略doc文件

image-20200701144652339

看狀態,.doc就沒了。

image-20200701144744591

如果不想要.gitignore文件

image-20200701144846186

image-20200701144859433

6. tag標籤

  我們經常看到下載的軟件分爲“xx版本”,這個“xx版本”其實就是我們說的標籤,該標籤指向一個commit對象,雖然我們也可以用這個commit對象進行版本的表述,但是由於哈希太長,並且沒有規律,所以我們使用標籤的方式,進行版本標註。

6. 1 設置標籤

​   git tag v1.0 (默認在最新的commit提交上)

6. 2 查看標籤

​   git tag

  這裏看到有HEAD、master、branch1、tag四個指針

image-20200701151548796

6. 3 給指定commit添加標籤:

​   git tag v0.1 hash

image-20200701151827616

6. 4 添加帶有說明的標籤

​   光添加版本號,是不靠譜的,很容易忘記這個版本都做了什麼事情。

​   git tag -a v0.1 -m "描述信息" hash

image-20200701152119067

6. 5 查看標籤版本信息

  git show 標籤

  打印tag和commit的描述信息

image-20200701152251475

6. 6 刪除標籤

git tag -d 版本號

image-20200701152404470

7. 遠程倉庫命令

  創建遠程倉庫,倉庫的名稱默認originorigin中有單獨的masterHEAD指針,和本地倉庫的HEADmaster並非一致。

7. 1 git push

  提交遠程倉庫

git push -u origin master

image-20200620171256560

image-20200701153202288

  我們再看github,文件就上傳上去了。(忽略文件沒上傳上來!)

image-20200701153546919

  點擊查看commit提交記錄。

image-20200701153702950

image-20200701153734721

  也可查看分支

image-20200701153824469

image-20200701153845462

  查看本地分支是有兩個的,但是github中卻只上傳了一個。

image-20200701153920429

7. 1. 1 提交分支

git push -u origin 分支

image-20200701154037299

image-20200701154156404

image-20200701154202891

7. 2 git clone

  克隆項目到本地

  複製地址

image-20200701154410837

git clone 地址

image-20200701154519032

image-20200701154611980

image-20200701154628893

7. 3 git pull

  拉取

  當團隊開發的時候,比如你的夥伴提交了本地倉庫,而我們自己的倉庫沒有這些信息,我們自己也提交進本地倉庫,就會造成衝突。

  如何解決呢?得先拉去一下,處理完衝突後,再提交代碼就沒問題了,和之前的衝突合併是一樣的解決辦法。

7. 4 遠程倉庫克隆分支

git checkout -b branch1 origin/branch1

拉取下來的分支默認是master

7. 5 刪除遠程倉庫分支

git push origin :branch

如果我們僅僅刪除本地分支,git是不會同步到遠程倉庫的!

image-20200701155552984

image-20200701153824469

image-20200701153845462

7. 6 推送標籤到遠程倉庫

  同理我們在本地設置的標籤,也是不會同步到本地倉庫的。

image-20200701155845398

image-20200701155945495

7. 6. 1 單獨標籤上傳

git push origin 標籤

image-20200701160046608

image-20200701160142478

7. 6. 2 所有標籤上傳

git push origin --tags 上傳所有標籤

image-20200701160309318

image-20200701155845398

image-20200701160408554

7. 7 刪除遠程倉庫的標籤

git push origin :refs/tags/標籤

image-20200701160506157

image-20200701160549535

8. 遠程倉庫使用SSH密鑰

ssh-keygen -t rsa -C "[email protected]"
生成ssh密鑰

image-20200701161234079

在電腦上找到鑰匙,打開復制給github即可。

image-20200701161805677

② 在github上找到settings,設置SSH

image-20200701160859002

③ 將生成的文件填到對應的位置(生成的信息給到倉庫的管理者)

新建鎖子,目的是給參與項目的人建立的。

image-20200701161002537

複製進去即可

image-20200701161855976

9. 開發建議

  開發的時候避免在主分支上進行提交代碼,在主分支上只記錄大的版本。

  如開發在develop分支上進行。

  打補丁在topic分支上進行。

image-20200701162204799



(後續待補充)

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