1殃姓、Merge命令
merge
命令會保留所有提交的歷史時間淹真。每個人對代碼的提交是各式各樣的为障,盡管這些時間對于程序本身并沒有任何意義齐莲,但是merge
的命令初衷就是為了保留這些時間不被修改亿鲜。
這樣也就形成了以merge
時間為基準的網狀歷史結構允蜈。每個分支上都會繼續(xù)保留各自的代碼記錄, 主分支上只保留merge
的歷史記錄,子分支隨時都有可能被刪除蒿柳。
子分子刪除以后饶套,你能夠看到的記錄也就是,merge
(合并)某branch
(分支)到某branch
(分支)上了垒探。這個歷史記錄描述基本上是沒有意義的凤跑。
(也就是子分支的歷史提交,在該分支刪除后叛复,不能被保留仔引∪硬郑回退或者charry-pick
的時候,選擇性變少了咖耘。)
2翘簇、Rebase命令
rebase
命令會始終把你最新的修改放到最前頭,你會更有信心保證你的代碼運行暢通無阻儿倒,通過你自己的測試以后版保,你就可以放心的把代碼合并到主的branch
里面了。
這里值得一提的是夫否,rebase
通常是發(fā)生在自己的個人branch
上的彻犁。它的基礎就是現(xiàn)有的主branch
,這樣做的好處就是保證每個人的代碼都可以運行在當前最新的主branch
的代碼上凰慈。
3汞幢、總結
rebase
命令好處:
-
rebase
命令是沒有合并操作的,它只是將當前分支所做的修改微谓,重放到了目標分支的最后一次提交上森篷。 -
rebase
命令最大的好處是你的項目歷史會非常整潔 ,最后的項目歷史呈現(xiàn)出完美的線性豺型。你可以從項目終點到起點瀏覽而不需要任何的 fork仲智。
rebase
命令壞處:
-
rebase
過程中,一個commit出現(xiàn)沖突姻氨,下一個commit也極有可能出現(xiàn)沖突钓辆,一次rebase
操作可能要解決多次沖突,同時合并的歷史脈絡(沖突)被物理消滅了肴焊。 - 安全性岩馍,如果你違反了 rebase 黃金法則,重寫項目歷史可能會給你的協(xié)作工作流帶來災難性的影響抖韩。
- 可跟蹤性蛀恩,
rebase
操作不會有合并提交中附帶的信息,你看不到 feature(特征) 分支中茂浮,并入了上游的哪些更改双谆。
merge
命令:
-
merge
是一個合并操作,提交歷史記錄會出現(xiàn)分叉席揽,顯得不是那么簡潔顽馋。 -
merge
命令合并結果不好看,一堆線交錯幌羞,但合并有沖突的話寸谜,只要解一次就行了。
4属桦、個人推薦
情況一
如果你想擁有一套穩(wěn)定的熊痴,健壯的代碼他爸,永遠要使用rebase
。不為別的果善,就為了可以給你提供一套清晰的代碼歷史記錄诊笤。
rebase
操作永遠不會導致多個歷史分支進行交織。它永遠都是一條線巾陕,純潔而又干脆讨跟,輕輕爽爽的,從不拖泥帶水鄙煤。
相反的晾匠,merge
操作會給你一套亂七八糟的代碼歷史。當你看到這樣的代碼歷史的時候梯刚,那個畫風我相信對你一定很熟悉凉馆。想著那個畫風感覺到一切都好無助,有個詞兒比較合適乾巧,叫做欲仙欲死句喜。
情況二
但是從中國特色的敏捷開發(fā)情況(瘋狂改方案预愤,迭代):
如果只是在本地修改一兩個commit沟于,然后馬上提交到主要分支上,跑完所有unit test
(單元測試)植康,integration test
(集成測試)旷太,regression test
(回歸測試)等,直接發(fā)布销睁。也就是continuous integration
(持續(xù)集成)的理想狀態(tài)供璧,那么rebase
操作是極好的。保證了主線分支的線性冻记,且萬一出事了可以準確的revert
(回退)睡毒。
那么如上所述:
- 本地開發(fā),如果經常需要
rollback
回滾冗栗,就用rebase
操作演顾。 - 本地開發(fā),靈活創(chuàng)建分支隅居,也可以使用merge合并分支钠至,方便解決沖突。
5胎源、注意點
如果你違反了 rebase
黃金法則棉钧,重寫項目歷史可能會給你的協(xié)作工作流帶來災難性的影響。
rebase
的黃金法則:永遠不要在公共分支上使用rebase
操作涕蚤。
在你運行 git rebase
命令之前宪卿,一定要問問你自己「有沒有別人正在這個分支上工作的诵?」。如果答案是肯定的愧捕,那就不能進行rebase
操作奢驯。
一般來說,執(zhí)行rebase
命令的分支都是自己的本地分支次绘,千萬不要在與其他人共享的遠程分支上使用rebase
操作瘪阁。
這不難理解,遠程分支上的代碼可能已經被其他人克隆到本地了邮偎,如果通過rebase
操作修改了遠程分支的提交歷史管跺,這樣其他人每次拉取代碼到本地時,就都需要進行復雜的合并禾进。
注意:git merge和git rebase的顯著區(qū)別是豁跑,前者不會修改git的提交記錄,而后者會泻云!
提示:與遠程倉庫進行同步時艇拍,也可以執(zhí)行命令
git pull --rebase origin master
參考: