繁体   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