問:
從 master 創(chuàng)建了一個新分支,我們稱之為 test。
有幾個開發(fā)人員要么提交到 master,要么創(chuàng)建其他分支,然后合并到 master。
假設(shè) test 的工作需要幾天時間,并且您希望通過 master 內(nèi)的提交不斷更新 test。
我會從 test 做 git pull origin master。
問題1:這是正確的方法嗎?順便說一句,其他開發(fā)人員可以輕松地處理與我工作過的文件相同的文件。
我在 test 上的工作已完成,我準(zhǔn)備將其合并回 master。以下是我能想到的兩種方式:
A:
git checkout test
git pull origin master
git push origin test
git checkout master
git pull origin test
乙:
git checkout test
git pull origin master
git checkout master
git merge test
我沒有使用 --rebase,因為據(jù)我了解,rebase 會從 master 獲取更改并將我的堆棧放在上面,因此它可能會覆蓋其他人所做的更改。
問題2:這兩種方法哪一種是正確的?那里有什么區(qū)別?
所有這一切的目標(biāo)是讓我的 test 分支與 master 中發(fā)生的事情保持同步,然后我可以將它們合并回 master,希望盡可能保持時間線的線性。
答1:
huntsbot.com – 程序員副業(yè)首選,一站式外包任務(wù)、遠(yuǎn)程工作、創(chuàng)意產(chǎn)品分享訂閱平臺。
我會怎么做
git checkout master
git pull origin master
git merge test
git push origin master
如果我有一個來自遠(yuǎn)程分支的本地分支,我不喜歡將除此分支之外的其他分支與遠(yuǎn)程分支合并。此外,我不會推送我的更改,直到我對我想要推送的內(nèi)容感到滿意并且我根本不會推送任何東西,這僅適用于我和我的本地存儲庫。在您的描述中,test 似乎只適合您?所以沒有理由發(fā)布它。
git 總是試圖尊重你和其他人的變化,–rebase 也是如此。我認(rèn)為我無法恰當(dāng)?shù)亟忉屗?,因此請查?the Git book - Rebasing 或 git-ready: Intro into rebasing 以獲得一些說明。這是一個很酷的功能
git merge test 給了我fatal: 'test' does not point to a commit。我必須在 git log 中查找測試分支上的提交點,切換回 master 分支然后執(zhí)行 git merge 0f37d3154abbf52a4cbbbb5109f08af6a7567234。
@Duncanmoo 好吧,當(dāng)然分支 test 必須存在。當(dāng)然,您可以改用提交哈希,但使用分支名稱通常更容易。在內(nèi)部它只是檢索分支的 HEAD 的哈希值。
@shanyangqu 從遠(yuǎn)程獲取最新更改。如果您單獨工作并且只使用一個系統(tǒng),則沒有問題。但是,當(dāng)從不同的系統(tǒng)(可能來自不同的開發(fā)人員)推送更改時,一旦您嘗試將合并推送回來(第 4 步),您就會看到?jīng)_突?,F(xiàn)在唯一的解決方案是將您的本地 master 合并到遠(yuǎn)程 master 中,這最終會導(dǎo)致一個非常丑陋的“將 master 合并到 origin/master”合并提交。所以在合并之前拉取總是一個好主意
“在你的描述中,那個測試似乎只適合你?所以沒有理由發(fā)布它?!崩?,如果該服務(wù)器提供了針對本地驅(qū)動器故障的備份,或者您沒有其他方法進(jìn)行備份,則您可能希望將本地分支推送到服務(wù)器。
“......而且我不會推動我的更改,直到我對我想要推動的內(nèi)容感到滿意......”為什么不推動你的代碼備份,以防你的本地機器死亡和幾天的努力消失了?
答2:
huntsbot.com聚合了超過10+全球外包任務(wù)平臺的外包需求,尋找外包任務(wù)與機會變的簡單與高效。
這是一個非常實用的問題,但是上面所有的答案都不實用。
喜歡
git checkout master
git pull origin master
git merge test
git push origin master
這種方法有兩個問題:
這是不安全的,因為我們不知道 test 分支和 master 分支之間是否有沖突。它會將所有測試提交“擠壓”到 master 上的一個合并提交中;也就是說在master分支上,我們看不到test分支的所有變更日志。
因此,當(dāng)我們懷疑會有一些沖突時,我們可以進(jìn)行以下 git 操作:
git checkout test
git pull
git checkout master
git pull
git merge --no-ff --no-commit test
在 commit 之前測試 merge,避免 --no-ff 的快進(jìn)提交,
如果遇到?jīng)_突,我們可以運行 git status 來檢查沖突的詳細(xì)信息并嘗試解決
git status
一旦我們解決了沖突,或者如果沒有沖突,我們commit和push他們
git commit -m 'merge test branch'
git push
但是這種方式會丟失測試分支中記錄的更改歷史,并且會使 master 分支難以讓其他開發(fā)人員了解項目的歷史。
所以最好的方法是我們必須使用 rebase 而不是 merge(假設(shè)此時我們已經(jīng)解決了分支沖突)。
以下是一個簡單的示例,高級操作請參考http://git-scm.com/book/en/v2/Git-Branching-Rebasing
git checkout master
git pull
git checkout test
git pull
git rebase -i master
git checkout master
git merge test
是的,當(dāng)你完成了 upers 之后,所有 Test 分支的提交都將被移到 Master 分支的頭部。變基的主要好處是您可以獲得線性且更清晰的項目歷史記錄。
您唯一需要避免的是:永遠(yuǎn)不要在公共分支上使用 rebase,例如 master 分支。
切勿進(jìn)行如下操作:
git checkout master
git rebase -i test
https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing 的詳細(xì)信息
附錄:
如果不確定 rebase 操作,請參考:https://git-scm.com/book/en/v2/Git-Branching-Rebasing
我同意重新設(shè)置測試分支以供以后合并到 master 是要走的路。即使其他答案是正確的,這也會將分支測試的更改歷史記錄在 master 的頭部,因為作者提到“你得到了一個更干凈的項目”,這是版本控制系統(tǒng)的目的。
“這不是一種安全方式,因為我們不知道 test 分支和 master 分支之間是否存在任何沖突”這句話是不正確的:總是可以中止合并。即使沒有沖突,只要沒有推送,您始終可以撤消最后一次本地提交。如果沒有正確理解 git,有些事情可能看起來有點可怕或不清楚,但“不安全”在任何方面都是不正確的。請注意不要用不正確的信息混淆他人。
同意@PaulvanLeeuwen,當(dāng)您將測試分支 git 合并到 master 時,您將收到有關(guān)沖突的通知,這就是您將介入并合并更改的地方。完成后,您將提交合并并推回。如果您后悔或似乎無法正確合并它,您可以隨時丟棄您的工作并再次從 master 中提取。所以這絕對不是不安全的..
為什么要變基 -i ?
變基本質(zhì)上比合并更不安全。提議將變基作為更安全的合并選擇是錯誤的。變基是一種有效的策略,但會帶來更多用戶應(yīng)注意的警告。
答3:
huntsbot.com全球7大洲遠(yuǎn)程工作機會,探索不一樣的工作方式
變基和合并都不應(yīng)該覆蓋任何人的更改(除非您在解決沖突時選擇這樣做)。
開發(fā)時通常的方法是
git checkout master
git pull
git checkout test
git log master.. # if you're curious
git merge origin/test # to update your local test from the fetch in the pull earlier
當(dāng)你準(zhǔn)備好合并回master時,
git checkout master
git log ..test # if you're curious
git merge test
git push
如果您擔(dān)心在合并中破壞某些內(nèi)容,git merge --abort 可以為您服務(wù)。
使用推然后拉作為合并的手段是愚蠢的。我也不確定您為什么將測試推向原點。
這個過程會增加提交的數(shù)量,每次你在分支之間切換時,你都必須提交你的分支。
什么?您是說每次切換分支時都會增加提交次數(shù)?還是說每次切換分支都要“提交你的分支”?第一個是不真實的,我不確定第二個是什么意思。
在結(jié)帳之前,您必須提交分支。這就是我要說的
你不知道:那是(其中一件事)git stash 是為了。
或者您可以修改您的最后一次提交(在本地分支中)并在推送之前使其成為完美的提交。
答4:
huntsbot.com聚合了超過10+全球外包任務(wù)平臺的外包需求,尋找外包任務(wù)與機會變的簡單與高效。
我會首先使要合并的分支盡可能干凈。運行你的測試,確保狀態(tài)是你想要的。清除 git squash 的新提交。
除了KingCrunches answer,我建議使用
git checkout master
git pull origin master
git merge --squash test
git commit
git push origin master
您可能在另一個分支中進(jìn)行了許多提交,而這應(yīng)該只是主分支中的一個提交。為了使提交歷史盡可能干凈,您可能希望將測試分支中的所有提交壓縮到主分支中的一個提交中(另請參見:Git: To squash or not to squash?)。然后,您還可以將提交消息重寫為非常富有表現(xiàn)力的內(nèi)容。無需深入研究代碼即可輕松閱讀和理解的東西。
編輯:您可能對
在 git 中,merge --squash 和 rebase 有什么區(qū)別?
合并與變基
如何重新設(shè)置拉取請求
所以在 GitHub 上,我最終為功能分支 mybranch 執(zhí)行了以下操作:
從原產(chǎn)地獲取最新信息
$ git checkout master
$ git pull origin master
找到合并基礎(chǔ)哈希:
$ git merge-base mybranch master
c193ea5e11f5699ae1f58b5b7029d1097395196f
$ git checkout mybranch
$ git rebase -i c193ea5e11f5699ae1f58b5b7029d1097395196f
現(xiàn)在確保只有第一個是 pick,其余的是 s:
pick 00f1e76 Add first draft of the Pflichtenheft
s d1c84b6 Update to two class problem
s 7486cd8 Explain steps better
接下來選擇一個非常好的提交消息并推送到 GitHub。然后發(fā)出拉取請求。
拉取請求合并后,可以在本地刪除:
$ git branch -d mybranch
在 GitHub 上
$ git push origin :mybranch
“這應(yīng)該只是主分支中的一次提交”,不一定;你可能想保留歷史
當(dāng)然。但是然后根本不壓縮提交
我認(rèn)為 --first-parent 似乎是最好的解決方案。 davidchudzicki.com/posts/first-parent
答5:
一個優(yōu)秀的自由職業(yè)者,應(yīng)該有對需求敏感和精準(zhǔn)需求捕獲的能力,而huntsbot.com提供了這個機會
舊線程,但我還沒有找到 my way 這樣做。對于使用 rebase 并希望在 master 之上合并來自(功能)分支的所有提交的人來說,這可能很有價值。如果途中發(fā)生沖突,您可以在每次提交時解決它們。您在此過程中保持完全控制,并且可以隨時中止。
獲取最新的 Master 和 Branch:
git checkout master
git pull --rebase origin master
git checkout
git pull --rebase origin
在 Master 上合并分支:
git checkout
git rebase master
可選:如果您在 Rebase 期間遇到?jīng)_突:
首先,解決文件中的沖突。然后:
git add .
git rebase --continue
您可以隨時通過以下方式中止變基:
git rebase --abort
推送您的重新定位分支:
git push origin
如果您之前推送過此分支,則需要使用強制推送覆蓋它:
git push origin -f
在這樣做之前,請始終檢查您當(dāng)前的本地分支是否符合您的期望,因為強制推送會覆蓋遠(yuǎn)程存儲庫中的舊分支。
現(xiàn)在你有兩個選擇:
A) 創(chuàng)建一個 PR(例如在 GitHub 上)并通過 UI 將其合并到那里
B)返回命令行,將分支合并到master
git checkout master
git merge --no-ff
git push origin master
完畢。
我也喜歡這種方式。您忘記提及的一件事是,您經(jīng)常必須在 rebase 后強制推送您的 。
已編輯。謝謝!
答6:
huntsbot.com提供全網(wǎng)獨家一站式外包任務(wù)、遠(yuǎn)程工作、創(chuàng)意產(chǎn)品分享與訂閱服務(wù)!文章來源地址http://www.zghlxwxcb.cn/news/detail-785551.html
這是我在團隊工作中使用的工作流程。場景如你所描述。首先,當(dāng)我完成 test 的工作時,我使用 master 進(jìn)行 rebase 以提取在我一直在 test 分支工作期間添加到 master 的任何內(nèi)容。
git pull -r upstream master
這會將更改拉到 master,因為您分叉了 test 分支并應(yīng)用它們,然后應(yīng)用您所做的更改以“在”master 的當(dāng)前狀態(tài)之上進(jìn)行測試。如果其他人對您在測試中編輯的相同文件進(jìn)行了更改,則此處可能存在沖突。如果有,您將不得不手動修復(fù)它們并提交。完成此操作后,您可以毫無問題地切換到 master 分支并合并 test。
答7:
huntsbot.com洞察每一個產(chǎn)品背后的需求與收益,從而捕獲靈感
git checkout master
git pull origin master
# Merge branch test into master
git merge test
合并后,如果文件被更改,那么在合并時會出現(xiàn)“解決沖突”的錯誤
因此,您需要首先解決所有沖突,然后您必須再次提交所有更改,然后推送
git push origin master
誰在測試分支中進(jìn)行了更改更好,因為他知道自己做了什么更改。
答8:
打造屬于自己的副業(yè),開啟自由職業(yè)之旅,從huntsbot.com開始!
我會使用變基方法。主要是因為它在語義上完美地反映了您的情況,即。您要做的是刷新當(dāng)前分支的狀態(tài)并“假裝”它是基于最新的。
因此,即使不簽出 master,我也會:
git fetch origin
git rebase -i origin/master
# ...solve possible conflicts here
當(dāng)然,僅從原點獲取不會刷新 master 的本地狀態(tài)(因為它不執(zhí)行合并),但對于我們的目的來說完全可以 - 我們希望避免切換,以節(jié)省時間.
一個優(yōu)秀的自由職業(yè)者,應(yīng)該有對需求敏感和精準(zhǔn)需求捕獲的能力,而huntsbot.com提供了這個機會
答9:
huntsbot.com聚合了超過10+全球外包任務(wù)平臺的外包需求,尋找外包任務(wù)與機會變的簡單與高效。
@KingCrunch 的答案在很多情況下都應(yīng)該有效??赡艹霈F(xiàn)的一個問題是您可能在另一臺需要從測試中提取最新版本的機器上。所以,我建議先拉測試。修訂版如下所示:
git checkout test
git pull
git checkout master
git pull origin master
git merge test
git push origin master
答10:
huntsbot.com精選全球7大洲遠(yuǎn)程工作機會,涵蓋各領(lǐng)域,幫助想要遠(yuǎn)程工作的數(shù)字游民們能更精準(zhǔn)、更高效的找到對方。
我會根據(jù)開發(fā)和功能分支回答,
如果您在功能分支上并且需要使用開發(fā)更新它,請使用以下命令:
git checkout develop
git pull
git checkout feature/xyz
git merge develop
現(xiàn)在您的 feature/xyz 已更新為 develop 分支,您可以將更改推送到遠(yuǎn)程 feature/xyz。
答11:
保持自己快人一步,享受全網(wǎng)獨家提供的一站式外包任務(wù)、遠(yuǎn)程工作、創(chuàng)意產(chǎn)品訂閱服務(wù)–huntsbot.com
正如標(biāo)題所說的“最佳方式”,我認(rèn)為考慮耐心合并策略是個好主意。
來自:https://git-scm.com/docs/merge-strategies
使用這個選項,‘merge-recursive’ 會花費一些額外的時間來避免有時由于不重要的匹配行(例如,來自不同函數(shù)的大括號)而發(fā)生的錯誤合并。當(dāng)要合并的分支大相徑庭時使用此選項。另請參閱 git-diff[1] --patience。
用法:
git fetch
git merge -s recursive -X patience origin/master
Git 別名
我總是為此使用別名,例如運行一次:
git config --global alias.pmerge 'merge -s recursive -X patience'
現(xiàn)在你可以這樣做:
git fetch
git pmerge origin/master
原文鏈接:https://www.huntsbot.com/qa/xM8M/how-do-i-safely-merge-a-git-branch-into-master?lang=zh_CN&from=csdn文章來源:http://www.zghlxwxcb.cn/news/detail-785551.html
huntsbot.com提供全網(wǎng)獨家一站式外包任務(wù)、遠(yuǎn)程工作、創(chuàng)意產(chǎn)品分享與訂閱服務(wù)!
到了這里,關(guān)于如何安全地將 Git 分支合并到 master 中?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!