1318

假设我们在 Git 中有以下情况:

  1. 创建的存储库:

    mkdir GitTest2
    cd GitTest2
    git init
    
  2. master 中的一些修改发生并被提交:

    echo "On Master" > file
    git commit -a -m "Initial commit"
    
  3. Feature1 分支了 master 并完成了一些工作:

    git branch feature1
    git checkout feature1
    echo "Feature1" > featureFile
    git commit -a -m "Commit for feature1"
    
  4. 同时,在master-code中发现了一个bug,并建立了一个hotfix-branch:

    git checkout master
    git branch hotfix1
    git checkout hotfix1
    
  5. 该错误已在 hotfix 分支中修复并合并回主分支(可能在拉取请求/代码审查之后):

    echo "Bugfix" > bugfixFile
    git commit -a -m "Bugfix Commit"
    git checkout master
    git merge --no-ff hotfix1
    
  6. feature1 的开发仍在继续:

    git checkout feature1
    

假设我需要在我的功能分支中进行修补程序,可能是因为该错误也发生在那里。如何在不将提交复制到我的功能分支中的情况下实现这一点?

我想防止在我的功能分支上获得两个与功能实现无关的新提交。如果我使用拉取请求,这对我来说尤其重要:所有这些提交也将包含在拉取请求中并且必须进行审查,尽管这已经完成(因为修补程序已经在主服务器中)。

我不能做git merge master --ff-only:“致命:不可能快进,中止。”,但我不确定这是否对我有帮助。

4

11 回答 11

1593

我们如何将 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 初学者来说会搞砸事情。

于 2013-06-06T08:42:35.777 回答
662

您应该能够在 master 上重新设置您的分支:

git checkout feature1
git rebase master

管理出现的所有冲突。当您进行带有错误修复的提交时(已经在 master 中),Git 会说没有更改,并且可能已经应用了它们。然后你继续 rebase(同时跳过已经在 master 中的提交)

git rebase --skip

如果您git log在功能分支上执行 a,您将看到错误修复提交仅出现一次,并且在主部分中。

有关更详细的讨论,请查看git rebase( https://git-scm.com/docs/git-rebase ) 上的 Git 书籍文档,其中涵盖了这个确切的用例。

================ 编辑其他上下文 ====================

考虑到他的特殊情况,此答案是专门针对@theomega 提出的问题提供的。注意这部分:

我想防止我的功能分支上的 [...] 提交与功能实现无关。

将他的私有分支重新建立在 master 上正是产生该结果的原因。相比之下,将 master 合并到他的分支中恰恰会做他特别不希望发生的事情:添加一个与他正在通过他的分支工作的功能实现无关的提交。

为了解决阅读问题标题的用户,请跳过问题的实际内容和上下文,然后只盲目地阅读最佳答案,假设它始终适用于他们的(不同)用例,请允许我详细说明:

  • 仅 rebase 私有分支(即仅存在于您的本地存储库中并且尚未与其他人共享)。重新设置共享分支会“破坏”其他人可能拥有的副本。
  • 如果您想将来自分支(无论是主分支还是其他分支)的更改集成到公共分支中(例如,您已推送分支以打开拉取请求,但现在与主分支发生冲突,您需要更新你的分支来解决这些冲突)你需要将它们合并(例如git merge master@Sven的答案)。
  • 如果这是您的偏好,您也可以将分支合并到您的本地私有分支中,但请注意,这将导致您的分支中出现“外部”提交。

最后,如果您不满意这个答案不是最适合您的情况,即使它适用于@theomega,在下面添加评论也不会特别有帮助:我无法控制选择哪个答案,只有@theomega 可以。

于 2013-06-06T07:24:07.420 回答
81

git merge

您可以按照以下步骤操作

1. 合并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


2. 合并feature分支到origin/master分支

origin/master是远程主分支,master而是本地主分支

$ git checkout master
$ git pull origin/master

$ git merge feature
$ git push origin/master

于 2019-11-12T07:38:49.910 回答
76

根据这篇文章,您应该:

  • 创建基于新版本 master 的新分支

    git branch -b newmaster

  • 将旧功能分支合并到新功能分支

    git checkout newmaster

  • 解决新功能分支上的冲突

前两个命令可以组合成git checkout -b newmaster.

这样您的历史记录就会保持清晰,因为您不需要反向合并。而且您不需要非常谨慎,因为您不需要执行 Git 变基。

于 2014-06-09T14:16:47.673 回答
29

紫米的回答概括地描述了这个过程。以下是具体情况:

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

完毕!现在使用新分支继续开发您的功能。

于 2017-03-08T08:56:22.357 回答
27

我添加了我的答案,类似于其他人,但也许它会是最快的阅读和实施。

注意:在这种情况下不需要变基。

假设我有一个repo1和两个分支masterdev-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 

我希望这可以帮助处于相同情况的其他人。

于 2020-07-08T11:42:40.557 回答
13

这是一个可用于将主分支合并到当前分支的脚本。

该脚本执行以下操作:

  • 切换到主分支
  • 拉出主分支
  • 切换回当前分支
  • 将主分支合并到当前分支

将此代码保存为批处理文件 (.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
于 2018-11-13T11:59:32.240 回答
10

您也许可以进行“挑选”以将您需要的确切提交拉到您的功能分支中。

做一个git checkout hotfix1到 hotfix1 分支。然后执行 agit log以获取相关提交的 SHA-1 哈希(唯一标识提交的随机字母和数字的大序列)。复制那个(或前 10 个左右的字符)。

然后,git checkout feature1回到您的功能分支。

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

这会将那个提交,并且只有那个提交,拉到你的特性分支中。该更改将在分支中-您只是“挑选”它。然后,恢复工作、编辑、提交、推送等,让您心满意足。

当您最终从一个分支执行另一次合并到您的功能分支(反之亦然)时,Git 会识别出您已经在该特定提交中合并,知道它不必再次合并,并且只需“跳过”它。

于 2013-10-02T05:39:22.680 回答
4

作为现有答案的补充,由于这些命令是经常性的,我们可以连续执行。鉴于我们在功能分支中:

git checkout master && git pull && git checkout - && git merge -

或者将它们添加到别名中:

alias merge_with_master="git checkout master && git pull && git checkout - && git merge -"
于 2020-11-13T16:59:22.487 回答
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
于 2020-05-15T01:12:27.037 回答
-3
In Eclipse -

1)结帐主分支

Git Repositories ->Click on your repository -> click on Local ->double click master branch
->Click on yes for check out

2)拉主分支

Right click on project ->click on Team -> Click on Pull

3)检查您的功能分支(按照 1 点中提到的相同步骤)

4)将master合并到feature中

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.

或者

Git Repositories ->Click on your repository -> click on Local ->Right Click on your selected feature branch ->Click on Push Branch ->Preview ->Push
于 2020-08-03T04:23:41.267 回答