比方说,我们在混帐以下情况:
A创建库:
mkdir GitTest2 cd GitTest2 git init
在掌握一些修改发生并得到承诺。
echo "On Master" > file git commit -a -m "Initial commit"
特征1支关老爷,有些工作已经完成:
git branch feature1 git checkout feature1 echo "Feature1" > featureFile git commit -a -m "Commit for feature1"
同时,bug在主代码中发现和修补程序分支成立
git checkout master git branch hotfix1 git checkout hotfix1
该错误是固定在修补程序分支合并回主(也许后一个拉请求/代码审查):
echo "Bugfix" > bugfixFile git commit -a -m "Bugfix Commit" git checkout master git merge --no-ff hotfix1
特征1上继续发展:
git checkout feature1
现在我的问题:说我需要修复我的特性分支,也许是因为这个错误也发生在那里。 我怎样才能做到这一点没有复制到提交我的特性分支? 我想避免让我的特性分支两个新提交它们没有什么关系的功能实现。 所有这些提交也将被包含在拉入请求,并有虽然这已经完成进行审查(如修补程序已经在主):如果我使用引入请求这尤其显得对我很重要。
我不能做一个git merge master --ff-only
:“致命的:无法快进,中止”,但我不知道这帮助了我。
您应该能够重订上主你的分支:
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一样。
如何合并主分支到功能分支? 简单:
git checkout feature1
git merge master
有迫使快进合并在这里,因为它不能做没有意义的。 你犯俱进的特性分支和主分支。 快进,现在是不可能的。
看一看gitflow 。 这是git的一个分支模型可以遵循,而你在不知不觉中已经做了。 这也是一个扩展的git它增加了一些命令来自动做的事情,新的工作流程步骤,你本来需要手工做的。
那么你是如何在您的工作流程做对吗? 你有两个分支的工作,你的优点1分支基本上是在gitflow模型中的“开发”分支。
您可以从主创造了一个修补程序分支合并回来。 现在你被卡住。
该gitflow模型要求您还合并hotfix的devel的分支,它是在你的情况“特征1”。
所以,真正的答案是:
git checkout feature1
git merge --no-ff hotfix1
这增加作了修补程序内部的新特性分支的所有更改,但只有那些变化。 他们可能在分支其他开发变更发生冲突,但他们不会与主分支,你应该合并特性分支掌握最终发生冲突。
要非常小心垫底。 只有当你没有留下您的本地资源库的变化,例如,你没有将任何分支到其他存储库底垫。 垫底是一个伟大的工具,您可以将它推到世界各地之前,安排你的本地提交到一个有用的命令,但后来重订会搞砸事情的混帐初学者喜欢你。
基础上这篇文章 ,你应该:
- 创造出基于主的新版本新的分支
- 合并旧的特性分支成新
- 解决新特性分支冲突
因为你不需要回合并这种方式,你的历史记录保持清晰。 而你并不需要如此超级谨慎,因为你并不需要git的重订
紫米的答案描述通常这个过程。 以下是具体情况:
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)在新的分支,解决您的功能和主分支之间的任何冲突。
完成! 现在使用新的分支,继续发展自己的特色。
你也许可以做一个“摘樱桃”拉确切提交(S),你需要在你的功能分支。
做一个git checkout hotfix1
就要上hotfix1分支。 然后做一个git log
来获得SHA1哈希(随机字母和数字大序列唯一标识提交)的问题提交。 复制(或第一10个左右的字符)。
然后, git checkout feature1
回去到您的特性分支。
然后, git cherry-pick <the SHA1 hash that you just copied>
这将扳指提交,并且只有承诺,到你的特性分支。 这一变化将在分支 - 你只是“樱桃采摘”它接着,恢复工作,编辑,提交,推,等你的心脏的内容。
当最终,在执行从一个分支另一个合并到功能分支(反之亦然),git会意识到,你已经合并了在那个特定的承诺,知道它没有再作它,只是“跳过”了。
这里是你可以用你的主分支合并到当前分支的脚本。
该脚本执行以下操作:
- 切换到主分支
- 拉主分支
- 开关恢复到当前分支
- 合并主分支到当前分支
这段代码保存为一个批处理文件(.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