the*_*ega 892 git feature-branch git-flow git-branch
让我们说我们在git中有以下情况:
创建的存储库:
mkdir GitTest2
cd GitTest2
git init
Run Code Online (Sandbox Code Playgroud)主服务器中的一些修改发生并得到提交.
echo "On Master" > file
git commit -a -m "Initial commit"
Run Code Online (Sandbox Code Playgroud)Feature1分支主,一些工作完成:
git branch feature1
git checkout feature1
echo "Feature1" > featureFile
git commit -a -m "Commit for feature1"
Run Code Online (Sandbox Code Playgroud)同时,在主代码中发现错误并建立了修补程序分支
git checkout master
git branch hotfix1
git checkout hotfix1
Run Code Online (Sandbox Code Playgroud)该错误在修补程序分支中修复并合并回主服务器(可能在拉取请求/代码审查之后):
echo "Bugfix" > bugfixFile
git commit -a -m "Bugfix Commit"
git checkout master
git merge --no-ff hotfix1
Run Code Online (Sandbox Code Playgroud)feature1的开发继续:
git checkout feature1
Run Code Online (Sandbox Code Playgroud)现在我的问题:说我需要我的功能分支中的修补程序,可能是因为那里也出现了错误.如何在不将提交复制到我的功能分支的情况下实现此目的?我想阻止在我的功能分支上获得两个与功能实现无关的新提交.如果我使用Pull请求,这对我来说尤其重要:所有这些提交也将包含在Pull Request中,并且必须进行审核,尽管已经完成(因为修补程序已经在主服务器中).
我做不到git merge master --ff-only
:"致命:不可能快进,堕胎."但我不确定这是否对我有所帮助.
Sve*_*ven 1062
如何将主分支合并到功能分支?简单:
git checkout feature1
git merge master
Run Code Online (Sandbox Code Playgroud)
在这里强制进行快速合并是没有意义的,因为它无法完成.您已将两者都提交到功能分支和主分支.快进现在是不可能的.
看看gitflow.它是git的分支模型,可以遵循,你无意识地已经做到了.它也是git的扩展,它为新的工作流程步骤添加了一些命令,这些命令会自动执行,否则您需要手动执行这些操作.
那么你在工作流程中做了什么?你有两个分支可以使用,你的feature1分支基本上是gitflow模型中的"develop"分支.
您从master创建了一个修补程序分支并将其合并.现在你被卡住了.
gitflow模型要求您将修补程序也合并到devel分支,在您的情况下为"feature1".
所以真正的答案是:
git checkout feature1
git merge --no-ff hotfix1
Run Code Online (Sandbox Code Playgroud)
这会将修补程序内部所做的所有更改添加到功能分支,但仅包括这些更改.它们可能与分支中的其他开发更改冲突,但如果最终将功能分支合并回master,它们将不会与主分支冲突.
变基础时要非常小心.只有在您所做的更改保留在存储库本地时才进行rebase,例如,您没有将任何分支推送到其他存储库.重新定位是一个很好的工具,可以让你将本地提交安排到一个有用的顺序,然后再将其推向世界,但之后的重新定位会让像你这样的git初学者陷入困境.
Dav*_*ulc 548
你应该能够在master上重新分支你的分支:
git checkout feature1
git rebase master
Run Code Online (Sandbox Code Playgroud)
管理出现的所有冲突.当你使用错误修正(已经在master中)进行提交时,git会说没有任何更改,也许它们已经应用了.然后继续使用rebase(同时跳过已在master中的提交)
git rebase --skip
Run Code Online (Sandbox Code Playgroud)
如果git log
在功能分支上执行a ,您将看到错误修正提交仅出现一次,并且在主要部分中.
有关更详细的讨论,请查看git rebase
(https://git-scm.com/docs/git-rebase)上的Git书籍文档,其中涵盖了这个确切的用例.
================编辑其他上下文====================
这个答案专门针对@theomega提出的问题提出,考虑到他的特殊情况.注意这部分:
我想阻止我的功能分支上的提交与功能实现无关.
将他的私人分支重新绑定在主人身上正是产生这种结果的原因.相比之下,将master合并到他的分支中将准确地完成他特别不希望发生的事情:添加一个与他正在通过他的分支工作的功能实现无关的提交.
为了解决阅读问题标题的用户,跳过问题的实际内容和上下文,然后盲目地阅读最佳答案,假设它将始终适用于他们(不同的)用例,请允许我详细说明:
git merge master
在@Sven的答案中).最后,如果您对这个答案不是最适合您的情况这一事实感到不满意,即使它是@theomega,在下面添加评论也不会特别有用:我无法控制选择哪个答案,只有@theomega.
xgq*_*rms 71
git merge
您可以按照以下步骤操作
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
Run Code Online (Sandbox Code Playgroud)
feature
分支到origin/master
分支
origin/master
是远程主分支,master
而是本地主分支
$ git checkout master
$ git pull origin/master
$ git merge feature
$ git push origin/master
Run Code Online (Sandbox Code Playgroud)
jkd*_*dev 25
Zimi的回答通常描述了这个过程.以下是具体内容:
1)创建并切换到新分支.确保新分支基于,master
因此它将包含最新的修补程序.
git checkout master
git branch feature1_new
git checkout feature1_new
# Or, combined into one command:
git checkout -b feature1_new master
Run Code Online (Sandbox Code Playgroud)
2)切换到新分支后,合并现有功能分支中的更改.这将添加您的提交而不复制修补程序提交.
git merge feature1
Run Code Online (Sandbox Code Playgroud)
3)在新分支上,解决功能与主分支之间的任何冲突.
完成!现在使用新分支继续开发您的功能.
kal*_*ger 12
我添加了我的答案,与其他答案类似,但也许这将是阅读和实施最快的答案。
注意:在这种情况下不需要 Rebase。
假设我有一个repo1
和两个分支master
和dev-user
。
dev-user
是在 的某个状态下完成的分支master
。
现在假定这两个dev-user
和master
进步。
在某些时候,我想dev-user
获得所有在master
.
我该怎么做?
我首先进入我的存储库根文件夹
cd name_of_the_repository
然后
git checkout master
git pull
git checkout dev-user
git pull
git merge master
git push
Run Code Online (Sandbox Code Playgroud)
我希望这可以帮助处于相同情况的其他人。
小智 11
这是一个脚本,可用于将主分支合并到当前分支中.
该脚本执行以下操作:
将此代码保存为批处理文件(.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
Run Code Online (Sandbox Code Playgroud)
Bob*_*ore 10
您可以做一个"挑选"来将您需要的确切提交提取到您的功能分支.
做一个git checkout hotfix1
进入hotfix1分支.然后执行a git log
以获取相关提交的SHA1哈希(随机字母的大序列和唯一标识提交的数字).复制那个(或前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 -
Run Code Online (Sandbox Code Playgroud)
或者将它们添加到别名中:
alias merge_with_master="git checkout master && git pull && git checkout - && git merge -"
Run Code Online (Sandbox Code Playgroud)