欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報激活碼778899分享:git 分支-變基

柚子快報激活碼778899分享:git 分支-變基

http://yzkb.51969.com/

在git中,將一個分支的更改集成到另一個分支有兩種主要方式:合并(merge)和變基(rebase)。在本節(jié)中,將學(xué)習(xí)什么是變基,如何執(zhí)行變基操作,為什么它是一個非常強大的工具,以及在哪些情況下不希望使用它。

基本變基

如果回到基本合并的一個早期示例,會發(fā)現(xiàn)工作分叉了,并在兩個不同的分支上進行了提交。

正如我們已經(jīng)介紹過的那樣,最簡單的集成分支的方法是使用合并(merge)命令。它在兩個最新的分支快照(C3和C4)與兩者的最近公共祖先(C2)之間執(zhí)行三方合并,創(chuàng)建一個新的快照(和提交)。

然而,還有另一種方法:可以獲取在C4引入的更改補丁,并將其重新應(yīng)用在C3之上。在git中,這被稱為變基(rebase)。使用rebase命令,可以獲取在一個分支上提交的所有更改,并在不同的分支上重放它們。

對于這個示例,將檢出experiment分支,然后將其變基到master分支上,如下所示:

$ git checkout experiment

$ git rebase master

First, rewinding head to replay your work on top of it...

Applying: added staged command

這個操作通過前往兩個分支的共同祖先(當(dāng)前所在的分支和要變基到的分支),獲取當(dāng)前分支中每個提交引入的差異,將這些差異保存到臨時文件中,將當(dāng)前分支重置為與要變基到的分支相同的提交,最后依次應(yīng)用每個更改。

在這一點上,可以返回到master分支并執(zhí)行快進合并。

$ git checkout master

$ git merge experiment

現(xiàn)在,C4'指向的快照與合并示例中C5所指向的快照完全相同。集成的最終產(chǎn)品沒有任何區(qū)別,但變基使歷史記錄更清晰。如果檢查變基分支的日志,它看起來像是一個線性的歷史記錄:似乎所有的工作都是按順序完成的,即使最初是并行完成的。

通常,會這樣做來確保提交在遠(yuǎn)程分支上能夠干凈地應(yīng)用 - 也許是試圖貢獻但不維護的項目中。在這種情況下,會在一個分支上進行工作,然后在準(zhǔn)備好向主項目提交補丁時,將的工作變基到origin/master分支上。這樣,維護者就不需要進行任何集成工作 - 只需要一個快進合并或一個干凈的應(yīng)用。

請注意,無論最終得到的最終提交是變基的最后一個提交還是合并后的最終合并提交,指向的快照都是相同的 - 只有歷史記錄是不同的。變基將一系列工作中的更改按照它們被引入的順序重播到另一條線上,而合并則將端點合并在一起。

更有趣的變基

還可以將變基回放到除了變基目標(biāo)分支之外的其他地方。例如,考慮一個像這樣的歷史:從另一個主題分支分出的一個主題分支。例如,從一個主題分支(server)分出一個分支,為項目添加了一些服務(wù)器端功能,并提交了一個提交。然后,從該分支分出一個分支(client)來進行客戶端更改,并進行了幾次提交。最后,回到了服務(wù)器分支并進行了幾次提交。

假設(shè)決定要將客戶端的更改合并到主線以進行發(fā)布,但想等到服務(wù)器端的更改經(jīng)過進一步測試。可以使用git rebase的--onto選項,將客戶端上不在服務(wù)器上的更改(C8和C9)重播到主分支上:

$ git rebase --onto master server client

這基本上是在說:“獲取客戶端分支,找出自從它與服務(wù)器分支分叉以來的補丁,并在客戶端分支上重播這些補丁,就好像它直接基于主分支。” 這有點復(fù)雜,但結(jié)果非???。

現(xiàn)在可以將主分支快進(參見主分支快進以包含客戶端分支的更改):

$ git checkout master

$ git merge client

假設(shè)決定同時合并服務(wù)器分支??梢栽跓o需首先檢出它的情況下,通過運行g(shù)it rebase <基礎(chǔ)分支> <主題分支> 將服務(wù)器分支變基到主分支上 - 這會檢出主題分支(在本例中是服務(wù)器分支)并將其重播到基礎(chǔ)分支(主分支)上:

$ git rebase master server

這會將服務(wù)器工作重播主分支工作之上

然后,可以快進基礎(chǔ)分支(主分支):

$ git checkout master

$ git merge server

可以刪除客戶端和服務(wù)器分支,因為所有工作都已集成,不再需要它們,使得整個過程的歷史記錄看起來像是最終提交歷史:

$ git branch -d client

$ git branch -d server

變基的危險

但是變基的喜悅并不是沒有缺點的,可以用一句話概括:

不要變基已經(jīng)存在于存儲庫之外的提交,可能有人基于這些提交進行工作。

如果遵循這個準(zhǔn)則,那么一切都會很好。如果不遵循,人們會討厭women ,會受到朋友和家人的蔑視。

當(dāng)重新定位工作時,會放棄現(xiàn)有的提交并創(chuàng)建新的提交,這些提交類似但有所不同。如果推送提交到某個地方,其他人將其拉取下來并基于其進行工作,然后用git rebase重寫這些提交并再次推送它們上去,那么合作者將不得不重新合并他們的工作,當(dāng)試圖將他們的工作拉回我們的工作時,事情會變得混亂。

讓我們看一個例子,說明如何對已經(jīng)公開的工作進行變基可能會導(dǎo)致問題。假設(shè)從一個中央服務(wù)器克隆,然后對其進行一些工作。提交歷史如下所示:

現(xiàn)在,其他人做了更多的工作,其中包括一個合并,并將該工作推送到中央服務(wù)器。 獲取了它并將新的遠(yuǎn)程分支合并到您的工作中,使歷史看起來像這樣:

接下來,推送合并工作的人決定返回并重新定位他們的工作; 他們執(zhí)行g(shù)it push --force以覆蓋服務(wù)器上的歷史記錄。 然后,從該服務(wù)器獲取,將新的提交拉取下來。

現(xiàn)在你們兩個都陷入了困境。 如果你執(zhí)行g(shù)it pull,將創(chuàng)建一個合并提交,其中包含兩行歷史記錄,你的存儲庫將如下所示:

如果在我們歷史記錄呈現(xiàn)此樣式時運行g(shù)it log,將看到兩個提交具有相同的作者、日期和消息,這將令人困惑。此外,如果將此歷史記錄推送回服務(wù)器,將重新引入所有這些已重新定位的提交到中央服務(wù)器,這可能會進一步使人困惑??梢韵喈?dāng)肯定地假設(shè)另一個開發(fā)人員不希望C4和C6出現(xiàn)在歷史記錄中;這就是他們首先進行重新定位的原因。

重新定位時進行重新定位

如果發(fā)現(xiàn)自己處于這種情況,Git 還有一些進一步的魔法可能會幫助您解決問題。如果團隊中的某人強制推送了覆蓋我們基于其進行工作的更改,我們挑戰(zhàn)就是找出哪些是我們的,哪些是他們重新編寫的。

事實證明,除了提交的 SHA-1 校驗和之外,git 還計算了一個僅基于引入的補丁的校驗和。這被稱為“補丁 ID”。

如果拉取了被重寫的工作,并將其重新定位到我們的合作伙伴的新提交之上,git 通常可以成功地確定哪些是我們獨有的,并將它們應(yīng)用到新分支的頂部。

例如,在先前的場景中,如果我們在當(dāng)我們在有人推送重新定位的提交時,放棄了我們基于其進行工作的提交時,我們運行 git rebase teamone/master,git 將會:

確定哪些工作是我們分支獨有的(C2、C3、C4、C6、C7)

確定哪些不是合并提交(C2、C3、C4)

確定哪些沒有被重寫到目標(biāo)分支中(僅 C2 和 C3,因為 C4 與 C4' 是相同的補?。?/p>

將這些提交應(yīng)用到 teamone/master 的頂部

因此,我們不會像在“再次合并相同的工作以生成新的合并提交”中看到的結(jié)果那樣結(jié)束,而是會得到類似“在被強制推送的重新定位工作之上重新定位”的結(jié)果。

這只有在合作伙伴制作的 C4 和 C4' 幾乎完全相同的補丁時才有效。否則,重新定位將無法確定它是重復(fù)的,并將添加另一個類似于 C4 的補?。ㄟ@可能會導(dǎo)致應(yīng)用失敗,因為更改已經(jīng)存在)。

還可以通過運行 git pull --rebase 而不是普通的 git pull 來簡化此過程?;蛘?,在這種情況下,也可以手動執(zhí)行 git fetch,然后執(zhí)行 git rebase teamone/master。

如果使用 git pull 并希望將 --rebase 設(shè)置為默認(rèn)值,可以使用類似 git config --global pull.rebase true 的命令來設(shè)置 pull.rebase 配置值。

如果只重新定位從未離開過計算機的提交,那么一切都會很好。如果重新定位已經(jīng)推送過的提交,但沒有人基于這些提交創(chuàng)建新的提交,那么一切也會很好。如果重新定位已經(jīng)公開推送的提交,而且人們可能已經(jīng)基于這些提交進行了工作,那么可能會遇到一些令人沮喪的麻煩,并且會受到隊友的責(zé)備。

如果我們或合作伙伴在某個時候發(fā)現(xiàn)有必要這樣做,請確保每個人都知道運行 git pull --rebase 來嘗試使發(fā)生這種情況后的痛苦變得簡單一些。

重新定位 vs. 合并

現(xiàn)在已經(jīng)看到了重新定位和合并的實際操作,可能想知道哪個更好。在我們回答這個問題之前,讓我們稍微退后一步,談?wù)剼v史意味著什么。

對此的一種觀點是,存儲庫的提交歷史記錄是實際發(fā)生的事情的記錄。它是一份歷史文檔,本身就有價值,不應(yīng)該被篡改。從這個角度來看,更改提交歷史幾乎是褻瀆的;那么如果有一系列混亂的合并提交怎么辦?這就是實際發(fā)生的事情,存儲庫應(yīng)該為后人保留下來。

相反的觀點是,提交歷史記錄是項目是如何制作的故事。不會發(fā)布一本書的初稿,那么為什么要展示混亂工作呢?當(dāng)在項目上工作時,可能需要記錄所有錯誤和死胡同,但是當(dāng)準(zhǔn)備向世界展示我們工作時,我們可能希望講述如何從 A 到 B 的更連貫的故事。在這個陣營中,人們使用像重新定位和 filter-branch 這樣的工具,在將其合并到主干分支之前重新編寫他們的提交。他們使用重新定位和 filter-branch 這樣的工具,以最適合未來讀者的方式講述故事。

現(xiàn)在,關(guān)于合并和重新定位哪個更好的問題:希望能看到這并不簡單。git 是一個強大的工具,可以讓我們對歷史進行許多操作,但每個團隊和每個項目都是不同的?,F(xiàn)在我們知道這兩個工作原理了,就由我們自己來決定哪個對特定情況更好。

可以兩全其美:在推送本地更改之前重新定位以清理您的工作,但不要重新定位已經(jīng)推送到其他地方的任何內(nèi)容。

柚子快報激活碼778899分享:git 分支-變基

http://yzkb.51969.com/

精彩內(nèi)容

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19328366.html

發(fā)布評論

您暫未設(shè)置收款碼

請在主題配置——文章設(shè)置里上傳

掃描二維碼手機訪問

文章目錄