Git将master合并到功能分支中

时间:2013-06-06 07:18:58

标签: git git-branch git-flow feature-branch

让我们说我们在git中有以下情况:

  1. 创建的存储库:

    mkdir GitTest2
    cd GitTest2
    git init
    
  2. 主人的一些修改发生并得到承诺。

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

    git branch feature1
    git checkout feature1
    echo "Feature1" > featureFile
    git commit -a -m "Commit for feature1"
    
  4. 同时,在主代码中发现错误并建立了修补程序分支

    git checkout master
    git branch hotfix1
    git checkout hotfix1
    
  5. 该错误已在修补程序分支中修复并合并回主服务器(可能在执行拉取请求/代码审核之后):

    echo "Bugfix" > bugfixFile
    git commit -a -m "Bugfix Commit"
    git checkout master
    git merge --no-ff hotfix1
    
  6. feature1上的开发仍在继续:

    git checkout feature1
    
  7. 现在我的问题:说我需要在我的功能分支中使用此修补程序,可能是因为那里也出现了错误。如何在不将提交复制到我的功能分支的情况下实现此目的?我想阻止在我的功能分支上获得两个与功能实现无关的新提交。如果我使用Pull请求,这对我来说尤为重要:所有这些提交也将包含在Pull Request中,并且必须进行审核,尽管已经完成(因为修补程序已经在主服务器中)。

    我无法做git merge master --ff-only:“致命:不可能快进,堕胎。”但我不确定这是否对我有帮助。

13 个答案:

答案 0 :(得分:921)

如何将主分支合并到功能分支中?易:

git checkout feature1
git merge master

强制进行快速合并毫无意义,因为无法完成。您已将两者都提交到功能分支和主分支。快进现在是不可能的。

看看gitflow。它是git的分支模型,可以遵循,你无意识地已经做到了。它也是git的扩展,它为新的工作流程步骤添加了一些命令,这些命令会自动执行,否则您需要手动执行这些操作。

那么你在工作流程中做了什么?你有两个分支可以使用,你的feature1分支基本上是gitflow模型中的“develop”分支。

您从master创建了一个修补程序分支并将其合并回来。现在你被卡住了。

gitflow模型要求您将修补程序也合并到devel分支,在您的情况下为“feature1”。

所以真正的答案是:

git checkout feature1
git merge --no-ff hotfix1

这会将修补程序内部所做的所有更改添加到功能分支,但仅包括这些更改。它们可能与分支中的其他开发更改冲突,但如果最终将功能分支合并回master,它们将不会与主分支冲突。

对变基法要非常小心。只有在您所做的更改保留在您的存储库本地时才进行rebase,例如你没有将任何分支推送到其他存储库。 Rebasing是一个很棒的工具,可以让你在将本地提交推送到世界之前将其安排到一个有用的顺序中,但之后的重新设置会让像你这样的git初学者陷入困境。

答案 1 :(得分:479)

你应该能够在master上重新分支你的分支:

git checkout feature1
git rebase master

管理所有出现的冲突。当你使用错误修正(已经在master中)进行提交时,git会说没有任何更改,也许它们已经应用了。然后使用

继续rebase(同时跳过已在master中的提交)
git rebase --skip

如果在功能分支上执行git log,您将看到错误修正提交仅出现一次,并且在主要部分中。

有关更详细的讨论,请查看git rebasehttps://git-scm.com/docs/git-rebase)上涵盖此确切用例的Git图书文档。

================编辑其他上下文====================

这个答案专门针对@theomega提出的问题提出,并考虑到他的特殊情况。请注意这一部分:

  

我想阻止我的功能分支上的提交与功能实现无关。

将他的私人分支重新绑定在主人身上正是会产生这种结果的。相比之下,将master合并到他的分支中会精确地执行 特别不希望发生的事情 :添加与他正在处理的功能实现无关的提交他的分支。

要解决阅读问题标题的用户,请跳过问题的实际内容和上下文,然后盲目地阅读最佳答案,假设它将始终适用于他们(不同的)用例,请允许我详细说明:

  • 仅限私人分支机构(即仅存在于您的本地仓库中并且尚未与其他分支机构共享)。重新分享共享分支将“破坏”其他人可能拥有的副本。
  • 如果您想将分支(无论是主分支还是其他分支)的更改集成到公共分支中(例如,您已推送分支以打开请求,但现在与主服务器发生冲突,您需要要更新你的分支以解决这些冲突)你需要将它们合并(例如与@ {Sven的答案中的git merge master合并)。
  • 如果这是您的偏好,您也可以将分支合并到您的本地私有分支中,但请注意,它将导致您的分支中的“外部”提交。

最后,如果你对这个答案不是最适合你的情况这个事实感到不满意,即使它是针对@theomega的,那么在下面添加评论也不会特别有帮助:我无法控制哪个答案被选中,只有@theomega。

答案 2 :(得分:59)

基于this article你应该:

  • 创建基于新版本的主
  • 的新分支
  • 将旧功能分支合并为新功能
  • 解决新功能分支上的冲突

这样,您的历史记录保持清晰,因为您不需要反向合并。 而且你不需要如此超级谨慎,因为你不需要git rebase

答案 3 :(得分:22)

Zimi's answer一般描述了这个过程。以下是具体内容:

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)在新分支上,解决功能与主分支之间的任何冲突。

完成!现在使用新分支继续开发您的功能。

答案 4 :(得分:9)

您可以做一个“挑选”来将您需要的完全提交提取到您的功能分支。

执行git checkout hotfix1以获取hotfix1分支。然后执行git log以获取相关提交的SHA1哈希(随机字母的大序列和唯一标识提交的数字)。复制那个(或前10个左右的字符)。

然后,git checkout feature1返回到您的功能分支。

然后,git cherry-pick <the SHA1 hash that you just copied>

这会将提交和提交到您的功能分支中。这个改变将在分支中 - 你只是“挑选”它。然后,恢复工作,编辑,提交,推送等等。到你心中的内容。

当最终你从一个分支执行另一个合并到你的功能分支(反之亦然)时,git会认识到你已经合并了那个特定的提交,知道它没有不得不重新制作它,只是“跳过”它。

答案 5 :(得分:7)

这是一个脚本,可用于将master分支合并到当前分支中。

脚本执行以下操作:

  • 切换到master分支
  • 拉主分支
  • 切换回当前分支
  • 将master分支合并到您当前的分支中

将此代码另存为批处理文件(.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

答案 6 :(得分:6)

我添加了我的答案,类似于其他答案,但也许它将是阅读和实施最快的答案。

注意:在这种情况下,不需要重新设置基准。

假设我有一个repo1和两个分支masterdev-user

dev-user是在特定状态master中完成的分支。

现在假设dev-usermaster都前进。

在某个时候,我希望dev-user获得master中所做的所有提交。

我该怎么做?

git checkout master 
git pull 
git checkout dev-user
git pull
git merge master 
git push 

我希望这可以帮助处于相同情况的其他人。

答案 7 :(得分:3)

git merge

  

您可以按照以下步骤操作

# 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

答案 8 :(得分:0)

我在功能分支上进行了重构。我现在想将主要更改合并到我的功能分支中。我远远落后。 请注意,我不想将主要更改保存到本地,因为我的功能分支中的模块已从一个位置移动到另一个位置。我发现仅执行以下操作不起作用。它说“已经是最新的。”

 //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

答案 9 :(得分:0)

补充其他答案,因为这些命令是重复出现的,因此我们可以连续执行(假设我们位于功能分支中):

git checkout master && git pull && git checkout - && git merge -

或将其添加为别名:

alias merge_with_master="git checkout master && git pull && git checkout - && git merge -"

答案 10 :(得分:0)

要开始对大文件进行版本控制,您只需执行以下简单步骤: 为您的操作系统下载并安装 Git LFS 命令行扩展。 为您的用户帐户设置 Git LFS: git lfs 安装 3. 配置 Git LFS 来跟踪你的大文件: git lfs 跟踪“*.xyz”

答案 11 :(得分:-1)

In Eclipse -

1)结帐master分支

Git Repositories ->Click on your repository -> click on Local ->double click master branch
->Click on yes for check out

2)拉起master分支

Right click on project ->click on Team -> Click on Pull

3)签出要素分支(遵循1点中提到的相同步骤)

4)将母版合并到功能中

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)现在,您将在功能分支中获得Master分支的所有更改。删除冲突。

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.

OR

Git Repositories ->Click on your repository -> click on Local ->Right Click on your selected feature branch ->Click on Push Branch ->Preview ->Push

答案 12 :(得分:-2)

git checkout feature_branch_name
git pull origin master_branch_name