假设我们在 Git 中有以下情况:
创建的存储库:
mkdir GitTest2
cd GitTest2 git init
master 中的一些修改发生并被提交:
echo "On Master" > file
git commit -a -m “Initial commit”
Feature1 分支了 master 并完成了一些工作:
git branch feature1
git checkout feature1 echo “Feature1” > featureFile git commit -a -m “Commit for feature1”
同时,在master-code中发现了一个bug,并建立了一个hotfix-branch:
git checkout master
git branch hotfix1 git checkout hotfix1
该错误已在 hotfix 分支中修复并合并回主分支(可能在拉取请求/代码审查之后):
echo "Bugfix" > bugfixFile
git commit -a -m “Bugfix Commit” git checkout master git merge –no-ff hotfix1
feature1 的开发仍在继续:
git checkout feature1
假设我需要在我的功能分支中进行修补程序,可能是因为该错误也发生在那里。如何在不将提交复制到我的功能分支中的情况下实现这一点?
我想防止在我的功能分支上获得两个与功能实现无关的新提交。如果我使用拉取请求,这对我来说尤其重要:所有这些提交也将包含在拉取请求中并且必须进行审查,尽管这已经完成(因为修补程序已经在主服务器中)。
我不能做git merge master --ff-only:“致命:不可能快进,中止。”,但我不确定这是否对我有帮助。
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
这会将在修补程序中所做的所有更改添加到功能分支,但 只有 那些更改。它们可能与分支中的其他开发更改发生冲突,但如果您最终将功能分支合并回主分支,它们不会与主分支冲突。
变基时要非常小心。仅当您所做的更改保留在您的存储库本地时才重新设置基准,例如您没有将任何分支推送到其他存储库。变基是一个很好的工具,可以让您在将本地提交发布到世界之前将其安排成有用的顺序,但是之后的变基对于像您这样的 git 初学者来说会搞砸事情。