[英]Git merging hotfix branch into feature branch, then removing hotfix branch?
[英]Git merge hotfix branch into feature branch
假設我們在 Git 中有以下情況:
創建的存儲庫:
mkdir GitTest2 cd GitTest2 git init
master 中的一些修改發生並被提交:
echo "On Master" > file git commit -a -m "Initial commit"
Feature1 從 master 分支出來,完成了一些工作:
git branch feature1 git checkout feature1 echo "Feature1" > featureFile git commit -a -m "Commit for feature1"
同時,在master-code中發現了一個bug,並建立了一個hotfix-branch:
git checkout master git branch hotfix1 git checkout hotfix1
該錯誤在 hotfix 分支中修復並合並回 master(可能在 pull request/code review 之后):
echo "Bugfix" > bugfixFile git commit -a -m "Bugfix Commit" git checkout master git merge --no-ff hotfix1
功能 1 的開發仍在繼續:
git checkout feature1
假設我需要我的功能分支中的修補程序,可能是因為錯誤也發生在那里。 如何在不將提交復制到我的功能分支中的情況下實現這一點?
我想防止在我的功能分支上獲得兩個與功能實現無關的新提交。 如果我使用拉取請求,這對我來說尤其重要:所有這些提交也將包含在拉取請求中,並且必須進行審查,盡管這已經完成(因為修補程序已經在 master 中)。
我不能做git merge master --ff-only
:“致命:不可能快進,中止。”,但我不確定這是否對我有幫助。
我們如何將 master 分支合並到 feature 分支中? 簡單:
git checkout feature1
git merge master
在這里強制進行快進合並是沒有意義的,因為它無法完成。 您同時提交到功能分支和主分支。 現在快進是不可能的。
看看GitFlow 。 它是一個可以遵循的 git 分支模型,而你已經在不知不覺中做到了。 它也是 Git 的擴展,它為新的工作流程步驟添加了一些命令,這些命令可以自動執行您需要手動執行的操作。
那么您在工作流程中做對了什么? 您有兩個分支可以使用,您的 feature1 分支基本上是 GitFlow 模型中的“開發”分支。
您從 master 創建了一個修補程序分支並將其合並回來。 現在你被卡住了。
GitFlow 模型要求您將修補程序也合並到開發分支,在您的情況下是“feature1”。
所以真正的答案是:
git checkout feature1
git merge --no-ff hotfix1
這會將修補程序內部所做的所有更改添加到功能分支,但僅添加這些更改。 它們可能與分支中的其他開發更改發生沖突,但如果您最終將功能分支合並回 master,它們不會與 master 分支沖突。
重新定位時要非常小心。 僅當您所做的更改保留在您的存儲庫本地時才重新定位,例如您沒有將任何分支推送到其他某個存儲庫。 變基是一個很好的工具,可以讓您在將本地提交推向世界之前將其安排為有用的順序,但是之后變基會給像您這樣的 git 初學者搞砸事情。
您應該能夠在 master 上重新設置分支:
git checkout feature1
git rebase master
管理所有出現的沖突。 當您使用錯誤修正(已經在 master 中)進行提交時,Git 會說沒有更改並且可能已經應用了它們。 然后繼續 rebase(同時跳過 master 中已經提交的提交)
git rebase --skip
如果您在功能分支上執行git log
,您將看到錯誤修復提交僅出現一次,並且在主部分中。
有關更詳細的討論,請查看有關git rebase
( https://git-scm.com/docs/git-rebase ) 的 Git 書籍文檔,其中涵蓋了這個確切的用例。
================ 編輯附加上下文 ====================
這個答案是專門為@theomega 提出的問題提供的,考慮到他的特殊情況。 注意這部分:
我想防止在我的功能分支上提交 [...] 與功能實現無關的提交。
將他的私人分支重新建立在 master 上正是會產生這種結果的原因。 相比之下,將 master 合並到他的分支中恰恰會做他特別不想發生的事情:添加一個與他通過他的分支正在處理的功能實現無關的提交。
為了解決閱讀問題標題的用戶,跳過問題的實際內容和上下文,然后只盲目閱讀最高答案,假設它始終適用於他們的(不同)用例,請允許我詳細說明:
git merge master
)。最后,如果您對這個答案並不最適合您的情況這一事實感到不滿,即使它是針對@theomega 的,在下面添加評論也不會特別有幫助:我不控制選擇哪個答案,只有@theomega 可以。
根據本文,您應該:
創建基於新版本 master 的新分支
git branch -b newmaster
將舊的功能分支合並到新的分支中
git checkout newmaster
解決新功能分支上的沖突
前兩個命令可以組合成git checkout -b newmaster
。
這樣您的歷史記錄就會保持清晰,因為您不需要反向合並。 而且您不需要非常謹慎,因為您不需要執行 Git 變基。
git merge
您可以按照以下步驟操作
origin/master
分支到feature
分支# step1: change branch to master, and pull to update all commits
$ git checkout master
$ git pull
# step2: change branch to target, and pull to update commits
$ git checkout feature
$ git pull
# step3: merge master to feature(⚠️ current is feature branch)
$ git merge master
feature
分支到origin/master
分支
origin/master
是遠程 master 分支,而master
是本地 master 分支
$ git checkout master
$ git pull origin/master
$ git merge feature
$ git push origin/master
紫米的回答大致描述了這個過程。 以下是具體內容:
創建並切換到新分支。 確保新分支基於master
因此它將包含最近的修補程序。
git checkout master git branch feature1_new git checkout feature1_new # Or, combined into one command: git checkout -b feature1_new master
切換到新分支后,合並現有功能分支中的更改。 這將添加您的提交而不復制修補程序提交。
git merge feature1
在新分支上,解決您的功能和主分支之間的任何沖突。
完畢! 現在使用新分支繼續開發您的功能。
這是一個可用於將主分支合並到當前分支的腳本。
該腳本執行以下操作:
將此代碼保存為批處理文件 (.bat) 並將腳本放置在存儲庫中的任何位置。 然后點擊它運行它,你就設置好了。
:: This batch file pulls current master and merges into current branch
@echo off
:: Option to use the batch file outside the repo and pass the repo path as an arg
set repoPath=%1
cd %repoPath%
FOR /F "tokens=*" %%g IN ('git rev-parse --abbrev-ref HEAD') do (SET currentBranch=%%g)
echo current branch is %currentBranch%
echo switching to master
git checkout master
echo.
echo pulling origin master
git pull origin master
echo.
echo switching back to %currentBranch%
git checkout %currentBranch%
echo.
echo attemting merge master into %currentBranch%
git merge master
echo.
echo script finished successfully
PAUSE
我添加了我的答案,與其他答案類似,但也許這將是閱讀和實施最快的答案。
注意:在這種情況下不需要 Rebase。
假設我有一個repo1
和兩個分支master
和dev-user
。
dev-user
是在master
的某個狀態下完成的分支。
現在假設dev-user
和master
前進。
在某些時候,我希望dev-user
獲得在master
所做的所有提交。
我該怎么做?
我首先進入我的存儲庫根文件夾
cd name_of_the_repository
然后
git checkout master
git pull
git checkout dev-user
git pull
git merge master
git push
我希望這可以幫助處於相同情況的其他人。
您也許可以進行“挑選”以將您需要的確切提交拉入您的功能分支。
執行git checkout hotfix1
以進入 hotfix1 分支。 然后執行git log
以獲取相關提交的 SHA-1 哈希值(唯一標識提交的隨機字母和數字的大序列)。 復制那個(或前 10 個左右的字符)。
然后, git checkout feature1
返回到您的功能分支。
然后, git cherry-pick <the SHA-1 hash that you just copied>
這將把那個提交,並且只有那個提交,拉到你的功能分支中。 該更改將在分支中 - 您只是“挑選”它。然后,繼續工作、編輯、提交、推送等,以滿足您的需求。
最終,當您從一個分支執行另一次合並到您的功能分支(或反之亦然)時,Git 將識別出您已經在該特定提交中合並,知道它不必再次進行合並,並且只需“跳過”它。
補充現有的答案,因為這些命令是重復的,我們可以連續執行。 鑒於我們在功能分支中:
git checkout master && git pull && git checkout - && git merge -
或者將它們添加到別名中:
alias merge_with_master="git checkout master && git pull && git checkout - && git merge -"
我在功能分支上並進行了重構。 我想現在將主更改合並到我的功能分支。 我遠遠落后。 注意我不想將主更改拉到我的本地,因為我的功能分支有模塊從一個地方移動到另一個地方。 我發現在沒有拉的情況下只在下面執行是行不通的。 它說“已經是最新的”。
//below does not get the latest from remote master to my local feature branch without git pull
git checkout master
git fetch
git checkout my-feature-branch
git merge master
下面的工作,注意使用 git merge origin/master:
git checkout master
git fetch
git checkout my-feature-branch
git merge origin/master
要開始對大文件進行版本控制,您只需執行以下簡單步驟: 為您的操作系統下載並安裝 Git LFS 命令行擴展。 為您的用戶帳戶設置 Git LFS: git lfs install 3. 配置 Git LFS 以跟蹤您的大文件: git lfs track "*.xyz"
In Eclipse -
1)結帳主分支
Git Repositories ->Click on your repository -> click on Local ->double click master branch
->Click on yes for check out
2)拉主分支
Right click on project ->click on Team -> Click on Pull
3)檢查您的功能分支(按照1點中提到的相同步驟)
4) 將 master 合並到 feature 中
Git Repositories ->Click on your repository -> click on Local ->Right Click on your selected feature branch ->Click on merge ->Click on Local ->Click on Master ->Click on Merge.
5)現在您將在功能分支中獲得主分支的所有更改。 如果有沖突,請刪除。
For conflict if any exists ,follow this -
Changes mentioned as Head(<<<<<< HEAD) is your change, Changes mentioned in branch(>>>>>>> branch) is other person change, you can update file accordingly.
注意 - 您需要添加到沖突文件的索引
6)提交並推送您在功能分支中的更改。
Right click on project ->click on Team -> Click on commit -> Commit and Push.
要么
Git Repositories ->Click on your repository -> click on Local ->Right Click on your selected feature branch ->Click on Push Branch ->Preview ->Push
git checkout feature_branch_name
git pull origin master_branch_name
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.