Git的合并掌握到特性分支Git的合并掌握到特性分支(Git merge master into f

2019-05-12 11:41发布

比方说,我们在混帐以下情况:

  1. A创建库:

     mkdir GitTest2 cd GitTest2 git init 
  2. 在掌握一些修改发生并得到承诺。

     echo "On Master" > file git commit -a -m "Initial commit" 
  3. 特征1支关老爷,有些工作已经完成:

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

     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. 特征1上继续发展:

     git checkout feature1 

现在我的问题:说我需要修复我的特性分支,也许是因为这个错误也发生在那里。 我怎样才能做到这一点没有复制到提交我的特性分支? 我想避免让我的特性分支两个新提交它们没有什么关系的功能实现。 所有这些提交也将被包含在拉入请求,并有虽然这已经完成进行审查(如修补程序已经在主):如果我使用引入请求这尤其显得对我很重要。

我不能做一个git merge master --ff-only :“致命的:无法快进,中止”,但我不知道这帮助了我。

Answer 1:

您应该能够重订上主你的分支:

git checkout feature1
git rebase master

管理中出现的所有冲突。 当你与错误修正(已在主)的提交,Git会说,没有变化和,也许他们已经应用。 然后,继续底垫用(在主已经跳过提交)

git rebase --skip

如果执行git log上您的功能分支,你会看到bug修正提交只出现一次,并在主部分。

对于更详细的讨论,看看在Git的书文档git rebase ( https://git-scm.com/docs/git-rebase )覆盖这个确切的使用情况。

================编辑额外的背景下====================

这个答案是对的提问@theomega问道,以他的特殊情况考虑具体规定。 注意:此部分:

我想,以防止[...]上没有关系的功能实现我的特性分支提交。

衍合他的私有分支上主正是将产生的结果。 相比之下,合并掌握到他的分支恰恰会做什么,他特别不希望发生的事情 :将提交不相关的功能实现,他通过自己的分公司工作。

为了解决阅读问题称号的用户,跳过这个问题的实际内容和上下文,然后只读顶端回答盲目地假定它总是会应用到他们的(不同的)使用的情况下,请允许我来阐述:

  • 只有变基私有分支(即只在当地的回购存在,并没有与其他人共享)。 重订共享枝叶会“破发”的副本的其他人可能有。
  • 如果你想改变一个分支整合(无论是主或其他分支)为一个分支,是公共的(例如,你推分行开拉的要求,但现在有与主机冲突,你需要更新你的分行解决这些冲突),你需要在合并它们(例如,使用git merge master在@斯文的答案)。
  • 你也可以合并分支到本地私人分行,如果这是你的喜好,但要注意,它会导致“洋”犯您的分支。

最后,如果你不满的是,这个答案是不适合您的情况,即使它是@theomega最合适的,添加下面的注释也不会特别有帮助:选择哪个答案,我不控制,只有@theomega一样。



Answer 2:

如何合并主分支到功能分支? 简单:

git checkout feature1
git merge master

有迫使快进合并在这里,因为它不能做没有意义的。 你犯俱进的特性分支和主分支。 快进,现在是不可能的。

看一看gitflow 。 这是git的一个分支模型可以遵循,而你在不知不觉中已经做了。 这也是一个扩展的git它增加了一些命令来自动做的事情,新的工作流程步骤,你本来需要手工做的。

那么你是如何在您的工作流程做对吗? 你有两个分支的工作,你的优点1分支基本上是在gitflow模型中的“开发”分支。

您可以从主创造了一个修补程序分支合并回来。 现在你被卡住。

该gitflow模型要求您还合并hotfix的devel的分支,它是在你的情况“特征1”。

所以,真正的答案是:

git checkout feature1
git merge --no-ff hotfix1

这增加作了修补程序内部的新特性分支的所有更改,但只有那些变化。 他们可能在分支其他开发变更发生冲突,但他们不会与主分支,你应该合并特性分支掌握最终发生冲突。

要非常小心垫底。 只有当你没有留下您的本地资源库的变化,例如,你没有将任何分支到其他存储库底垫。 垫底是一个伟大的工具,您可以将它推到世界各地之前,安排你的本地提交到一个有用的命令,但后来重订会搞砸事情的混帐初学者喜欢你。



Answer 3:

基础上这篇文章 ,你应该:

  • 创造出基于主的新版本新的分支
  • 合并旧的特性分支成新
  • 解决新特性分支冲突

因为你不需要回合并这种方式,你的历史记录保持清晰。 而你并不需要如此超级谨慎,因为你并不需要git的重订



Answer 4:

紫米的答案描述通常这个过程。 以下是具体情况:

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

完成! 现在使用新的分支,继续发展自己的特色。



Answer 5:

你也许可以做一个“摘樱桃”拉确切提交(S),你需要在你的功能分支。

做一个git checkout hotfix1就要上hotfix1分支。 然后做一个git log来获得SHA1哈希(随机字母和数字大序列唯一标识提交)的问题提交。 复制(或第一10个左右的字符)。

然后, git checkout feature1回去到您的特性分支。

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

这将扳指提交,并且只有承诺,到你的特性分支。 这一变化将在分支 - 你只是“樱桃采摘”它接着,恢复工作,编辑,提交,推,等你的心脏的内容。

当最终,在执行从一个分支另一个合并到功能分支(反之亦然),git会意识到,你已经合并了在那个特定的承诺,知道它没有再作它,只是“跳过”了。



Answer 6:

这里是你可以用你的主分支合并到当前分支的脚本。

该脚本执行以下操作:

  • 切换到主分支
  • 拉主分支
  • 开关恢复到当前分支
  • 合并主分支到当前分支

这段代码保存为一个批处理文件(.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


文章来源: Git merge master into feature branch