让我们说我们在git中有以下情况:
创建的存储库:
mkdir GitTest2
cd GitTest2
git init
主人的一些修改发生并得到承诺。
echo "On Master" > file
git commit -a -m "Initial commit"
Feature1分支主人,完成了一些工作:
git branch feature1
git checkout feature1
echo "Feature1" > featureFile
git commit -a -m "Commit for feature1"
同时,在主代码中发现错误并建立了修补程序分支
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
feature1上的开发仍在继续:
git checkout feature1
现在我的问题:说我需要在我的功能分支中使用此修补程序,可能是因为那里也出现了错误。如何在不将提交复制到我的功能分支的情况下实现此目的?我想阻止在我的功能分支上获得两个与功能实现无关的新提交。如果我使用Pull请求,这对我来说尤为重要:所有这些提交也将包含在Pull Request中,并且必须进行审核,尽管已经完成(因为修补程序已经在主服务器中)。
我无法做git merge master --ff-only
:“致命:不可能快进,堕胎。”但我不确定这是否对我有帮助。
答案 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 rebase
(https://git-scm.com/docs/git-rebase)上涵盖此确切用例的Git图书文档。
================编辑其他上下文====================
这个答案专门针对@theomega提出的问题提出,并考虑到他的特殊情况。请注意这一部分:
我想阻止我的功能分支上的提交与功能实现无关。
将他的私人分支重新绑定在主人身上正是会产生这种结果的。相比之下,将master合并到他的分支中会精确地执行 特别不希望发生的事情 :添加与他正在处理的功能实现无关的提交他的分支。
要解决阅读问题标题的用户,请跳过问题的实际内容和上下文,然后盲目地阅读最佳答案,假设它将始终适用于他们(不同的)用例,请允许我详细说明:
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分支合并到当前分支中。
脚本执行以下操作:
将此代码另存为批处理文件(.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
和两个分支master
和dev-user
。
dev-user
是在特定状态master
中完成的分支。
现在假设dev-user
和master
都前进。
在某个时候,我希望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