文章目錄
git入門與實踐(4)
1. git 存儲
1. 1 問題引入
提交,並創建分支
並添加文件內容:
添加暫存區
這個時候發現上一個版本開發的過程中有問題,需要修復一下。於是趕緊切換回master
分支,其實最好再開一個分支處理這個問題。
在branch2
分支上,首先創建一個文本b。
log
打印暫存區還有a.txt
,a.txt
是在branch1
時候暫存的,如果僅提交b.txt
的話,無意間也會提交a.txt
。遇到這種問題怎麼辦?
1. 1. 1 解決
當在一個分支中向暫存區添加內容,切換到另一個分支時,提交commit
會帶上另一分支中的暫存內容。這個時候就需要先保存a.txt
(另一分支中的暫存內容),再處理當前需要提交的內容。
切換回branch1
我們把目前的暫存記錄保存起來。
1. 1. 1. 1 git stash
git stash
存儲暫存區及工作目錄修改文件
1. 1. 1. 2 git stash list
git stash list
打印所有存儲內容
查看狀態:暫存區就沒了
再切換回branch2
,去提交b.txt
文件。這樣問題就解決了。
我們利用了branch2
修復了bug,解決了問題後,現在刪除分支。
發現報錯了,原因是我們當前的HEAD
指向branch2
,得切換回master
再刪除
同時因爲branch
沒有進行合併,因此必須用-D
強制刪除
1. 1. 1. 3 git stash apply
git stash apply <stashName>
緊接着,想把之前存的東西恢復。
我們發現存的時候在暫存區,而取得時候卻不在暫存區了。
1. 1. 1. 3. 1 git stash apply --index
git stash apply --index
將存儲內容重新應用(默認不保留已暫存內容)
將原暫存依舊以暫存進行取出
因爲重複取內容,所以報錯,我們可以在工作區將a.txt
刪除再取
1. 1. 1. 3. 2 git stash apply 標號 --index
如果存儲了多個,恢復時需加上標號
1. 1. 1. 4 git stash drop
移除存儲
git stash drop
刪除之後,再git stash list
打印存儲列表頁不存在了。
1. 1. 1. 5 git stash 標號 drop
如果存儲了多個,移除時需加上標號
1. 1. 1. 6 git stash -u
git stash -u
在上面的基礎上帶上未追蹤文件
我們新建一個文件,不放入暫存直接存儲,但是查看狀態,記錄仍在哦!我們可以存儲的時候加上-u
告訴它在存儲的時候,未追蹤的文件也一樣存儲起來。
git stash -u
大家可能好奇,第一次什麼也沒存儲,怎麼還添加上去了。原因是起初對a文件是有修改的,雖然取出來了但並沒提交。
現在看看文件狀態
取出存儲
git stash apply 'stash@{0}'
1. 2 小結
當在一個分支上面,有準備提交或者添加暫存區的內容,又不希望它現在被提交,可以先把它存儲起來。再切換分支,去另一個分支做另外的事情,等到那邊進行完畢了。再切換回分支,將存儲的內容拉取出來,最好再提交或添加暫存區。
2. rebase變基操作
和merge
同樣都是進行合併操作的。
區別在於,將一個分支的內容都移至另一個分支上。
2. 1 回顧merge與rebase對比
回顧merge
,它是以c2、c4、c5爲基準創建一個合併,整合到c6提交。合併的時候,切換到master
主分支,將branch1
合併過來。
如果是rebase
,則c3
也參與進來。把想要合併的分支作爲當前分支,進行合併。
2. 2 模擬rebase操作
初始化git,並創建5個文件
進行c1、c2提交
開並切換分支branch1
,再提交c3
c4提交
切換回master
,c5提交
rebase
把想要合併的分支作爲當前分支,進行合併。我們切換到branch1
,再合併(master
作爲基點,將branch1
合併過去)。
形成了一條直線(branch1
和master
處在同一條線上),HEAD
在branch1
上,
2. 1. 1 動態演示
在c2分支branch1
,做了兩次提交,在c2後master
進行了一次c5提交。我們想要合併的是branch1
,所以切換HEAD
指向branch1
。接下來執行變基操作,然後git會進行rebase
分析。
2. 1. 1. 1 rebase分析(工作流程)
- 首先找到兩個分支的共同祖先
- 然後對比當前分支與祖先的歷次提交,進行提取相應修改(提取
c3、c4
),並保存爲臨時文件(對應c6、c7
),將當前分支指向目標基底(master
主分支),最後將之前存爲臨時文件的修改(對應c6、c7
)依序應用 - 將
HEAD
指向目標基底(master
主分支)末尾(對應c7
) - 這就形成了一條直線路徑了(
c1->c2->c5->c6->c7
) rebase
只是把分支提交內容放到主分支上,實際上並沒有進行合併,因此最終還是需要執行merge
命令的。- 先將
HEAD
指向master
分支上,再執行merge
命令,然後就進行快速前移了。
2. 1. 1. 2 c3、c4和c6、c7是同一個節點嗎?
我們對比兩次c3、c4的哈希是不一樣的,因爲hash是唯一的,所以證明它們都是不同的節點。可能有人疑問之前的c3、c4去哪了?這其實和reset
重置是一樣的,重置之後,被遺棄的節點就沒有指向了,並且這類節點如果長時間未使用,會被git進行回收(類似編程語言的垃圾回收機制)。
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
爲別名
注意:不是任何東西都可以取別名的,還需要熟悉命名規則,所以不建議改別名。
4. 多人合作開發模式
以防萬一,我們把本地的倉庫不小心刪除,所以我們需要一個可以備份的地方,這個地方可以是我們的網盤,也可以是u盤,或者是類似於經常用到的github。
但是u盤或網盤這類的存儲方式雖然可以保存備份,卻不能適用於多人的開發,如果我們想要多人的開發,就需要有一箇中央倉庫,可以給團隊開發中的每個人下載並且使用。
4. 1 中央倉庫
存儲每個成員的提交對象,共享提交對象給每個成員。
推薦github:https://github.com/(註冊與使用自己問度娘吧!或者參考其餘小迪的git文章吧。)
4. 2 分佈式版本控制系統(git、svn)
分佈在每個成員的電腦上,都有一個本地倉庫,任何一個電腦的本地倉庫不小心丟失,都可以從成員處找回,或者可以從中央倉庫進行下載共享,保存歷史紀錄的任務分配到了每個開發成員的身上,中央倉庫只需要整合共享。
5. 配置忽略文件
前提:創建並連接倉庫與本地管理
參考github提示:
我們往裏添加一個doc文件
我們會發現,有些時候我就是不希望git管理文件夾中的某個文件,每一次查看狀態總是告訴我未追蹤,很麻煩~
.gitignore
文件,列出忽略文本模式
注意以.
開頭的文件我們是無法手動創建的,我們需要用命令行去創建。
5. 1 編寫規則
與正則表達式類似
#
相當於註釋
*
匹配零個或多個任意字符
[ ]
匹配任意一個在方括號內的字符,[abc]
匹配這三個字母其中之一即可
?
只匹配一個任意字符
**
表示匹配任意中間目錄
!
忽略指定文件以外的文件或目錄(白名單)
[x-x]
在這個範圍的都可以匹配,如[0-9]
代表0~9的範圍
需求:忽略doc
文件
看狀態,.doc
就沒了。
如果不想要.gitignore
文件
6. tag標籤
我們經常看到下載的軟件分爲“xx版本”,這個“xx版本”其實就是我們說的標籤,該標籤指向一個commit
對象,雖然我們也可以用這個commit
對象進行版本的表述,但是由於哈希太長,並且沒有規律,所以我們使用標籤的方式,進行版本標註。
6. 1 設置標籤
git tag v1.0
(默認在最新的commit
提交上)
6. 2 查看標籤
git tag
這裏看到有HEAD、master、branch1、tag
四個指針
6. 3 給指定commit添加標籤:
git tag v0.1 hash
6. 4 添加帶有說明的標籤
光添加版本號,是不靠譜的,很容易忘記這個版本都做了什麼事情。
git tag -a v0.1 -m "描述信息" hash
6. 5 查看標籤版本信息
git show 標籤
打印tag
和commit
的描述信息
6. 6 刪除標籤
git tag -d 版本號
7. 遠程倉庫命令
創建遠程倉庫,倉庫的名稱默認origin
,origin
中有單獨的master
和HEAD
指針,和本地倉庫的HEAD
或master
並非一致。
7. 1 git push
提交遠程倉庫
git push -u origin master
我們再看github,文件就上傳上去了。(忽略文件沒上傳上來!)
點擊查看commit提交記錄。
也可查看分支
查看本地分支是有兩個的,但是github中卻只上傳了一個。
7. 1. 1 提交分支
git push -u origin 分支
7. 2 git clone
克隆項目到本地
複製地址
git clone 地址
7. 3 git pull
拉取
當團隊開發的時候,比如你的夥伴提交了本地倉庫,而我們自己的倉庫沒有這些信息,我們自己也提交進本地倉庫,就會造成衝突。
如何解決呢?得先拉去一下,處理完衝突後,再提交代碼就沒問題了,和之前的衝突合併是一樣的解決辦法。
7. 4 遠程倉庫克隆分支
git checkout -b branch1 origin/branch1
拉取下來的分支默認是master
7. 5 刪除遠程倉庫分支
git push origin :branch
如果我們僅僅刪除本地分支,git是不會同步到遠程倉庫的!
7. 6 推送標籤到遠程倉庫
同理我們在本地設置的標籤,也是不會同步到本地倉庫的。
7. 6. 1 單獨標籤上傳
git push origin 標籤
7. 6. 2 所有標籤上傳
git push origin --tags
上傳所有標籤
7. 7 刪除遠程倉庫的標籤
git push origin :refs/tags/標籤
8. 遠程倉庫使用SSH密鑰
① ssh-keygen -t rsa -C "[email protected]"
生成ssh密鑰
在電腦上找到鑰匙,打開復制給github即可。
② 在github上找到settings
,設置SSH
③ 將生成的文件填到對應的位置(生成的信息給到倉庫的管理者)
新建鎖子,目的是給參與項目的人建立的。
複製進去即可
9. 開發建議
開發的時候避免在主分支上進行提交代碼,在主分支上只記錄大的版本。
如開發在develop
分支上進行。
打補丁在topic
分支上進行。
(後續待補充)