簡體   English   中英

Git 將修補程序分支合並到功能分支

[英]Git merge hotfix branch into feature branch

假設我們在 Git 中有以下情況:

  1. 創建的存儲庫:

     mkdir GitTest2 cd GitTest2 git init
  2. master 中的一些修改發生並被提交:

     echo "On Master" > file git commit -a -m "Initial commit"
  3. Feature1 從 master 分支出來,完成了一些工作:

     git branch feature1 git checkout feature1 echo "Feature1" > featureFile git commit -a -m "Commit for feature1"
  4. 同時,在master-code中發現了一個bug,並建立了一個hotfix-branch:

     git checkout master git branch hotfix1 git checkout hotfix1
  5. 該錯誤在 hotfix 分支中修復並合並回 master(可能在 pull request/code review 之后):

     echo "Bugfix" > bugfixFile git commit -a -m "Bugfix Commit" git checkout master git merge --no-ff hotfix1
  6. 功能 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 合並到他的分支中恰恰會做他特別不想發生的事情:添加一個與他通過他的分支正在處理的功能實現無關的提交。

為了解決閱讀問題標題的用戶,跳過問題的實際內容和上下文,然后只盲目閱讀最高答案,假設它始終適用於他們的(不同)用例,請允許我詳細說明:

  • 僅對私有分支進行變基(即,只存在於您的本地存儲庫中且未與其他人共享的分支)。 重定位共享分支會“破壞”其他人可能擁有的副本。
  • 如果你想將一個分支(無論是 master 還是另一個分支)的更改集成到一個公共的分支中(例如,你已經推送了這個分支來打開一個拉取請求,但現在與 master 有沖突,你需要更新您的分支來解決這些沖突)您需要將它們合並(例如在@Sven 的回答中使用git merge master )。
  • 如果這是您的偏好,您也可以將分支合並到您的本地私有分支中,但請注意,這會導致您的分支中出現“外部”提交。

最后,如果您對這個答案並不最適合您的情況這一事實感到不滿,即使它是針對@theomega 的,在下面添加評論也不會特別有幫助:我不控制選擇哪個答案,只有@theomega 可以。

根據本文,您應該:

  • 創建基於新版本 master 的新分支

    git branch -b newmaster

  • 將舊的功能分支合並到新的分支中

    git checkout newmaster

  • 解決新功能分支上的沖突

前兩個命令可以組合成git checkout -b newmaster

這樣您的歷史記錄就會保持清晰,因為您不需要反向合並。 而且您不需要非常謹慎,因為您不需要執行 Git 變基。

git merge

您可以按照以下步驟操作

1.合並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


2. 合並feature分支到origin/master分支

origin/master是遠程 master 分支,而master是本地 master 分支

$ git checkout master
$ git pull origin/master

$ git merge feature
$ git push origin/master

紫米的回答大致描述了這個過程。 以下是具體內容:

  1. 創建並切換到新分支。 確保新分支基於master因此它將包含最近的修補程序。

     git checkout master git branch feature1_new git checkout feature1_new # Or, combined into one command: git checkout -b feature1_new master
  2. 切換到新分支后,合並現有功能分支中的更改。 這將添加您的提交而不復制修補程序提交。

     git merge feature1
  3. 在新分支上,解決您的功能和主分支之間的任何沖突。

完畢! 現在使用新分支繼續開發您的功能。

這是一個可用於將主分支合並到當前分支的腳本。

該腳本執行以下操作:

  • 切換到主分支
  • 拉取主分支
  • 切換回當前分支
  • 將主分支合並到您當前的分支中

將此代碼保存為批處理文件 (.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和兩個分支masterdev-user

dev-user是在master的某個狀態下完成的分支。

現在假設dev-usermaster前進。

在某些時候,我希望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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM