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

创建的存储库: mkdir GitTest2 cd GitTest2 git init 在master中发生并提交一些修改: echo“On Master”>文件 初始提交 Feature1分支了master并完成了一些工作: Git分支feature1 Git签出特性1 echo "Feature1" > featureFile git commit -a -m commit for feature1 同时,在主代码中发现了一个bug,并建立了一个热修复分支: Git checkout master Git分支hotfix1 Git签出hotfix1 该错误在热修复分支中修复,并合并回主程序(可能在拉取请求/代码审查之后): echo "Bugfix" > bugfixFile git commit -a -m " bug修正提交" Git checkout master Git merge -no-ff hotfix1 feature1的开发仍在继续: Git签出特性1

假设我需要在我的功能分支中进行热修复,可能因为bug也发生在那里。我怎样才能在不复制提交到我的特性分支的情况下实现这一点呢?

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

我不能做一个git合并主-ff-only: "fatal: not possible to fast-forward, aborting.",但我不确定这是否帮助了我。


当前回答

git 合并

您可以按照以下步骤进行操作

1. 合并源/主分支到特征分支

# 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. 将特征分支合并到原点/主分支

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

$ git checkout master
$ git pull origin/master

$ git merge feature
$ git push origin/master

其他回答

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)检查你的功能分支(遵循第一点提到的相同步骤)

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)现在你会在feature branch中看到Master branch的所有变化。消除冲突。

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

根据这篇文章,你应该:

创建基于master新版本的新分支 Git分支-b newmaster 将旧的功能分支合并为新的 Git checkout newmaster 解决新特性分支上的冲突

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

这样,您的历史记录将保持清晰,因为您不需要反向合并。你不需要这么小心谨慎,因为你不需要做Git的基础。

Zimi的回答大致描述了这个过程。具体情况如下:

创建并切换到一个新的分支。确保新的分支是基于master的,所以它将包括最近的修补程序。 Git checkout master Git分支feature1_new Git签出feature1_new #或者,组合成一个命令: Git checkout -b feature1_new master 切换到新分支后,合并现有特性分支的更改。这将添加您的提交,而无需重复热修复程序提交。 Git合并featue1 在新分支上,解决您的特性和主分支之间的任何冲突。

完成了!现在使用新的分支继续开发您的特性。

您可能能够“选择性”地将您需要的提交精确地拉到您的特性分支中。

执行git签出hotfix1以进入hotfix1分支。然后执行git日志以获得所讨论的提交的SHA-1哈希(唯一标识提交的随机字母和数字的大序列)。复制它(或前10个字符左右)。

然后,git签出feature1回到你的功能分支。

然后,git cherry-pick <刚才复制的SHA-1哈希值>

这将把那个提交,而且只有那个提交,拉到你的特性分支中。这个更改将在分支中—您只是“挑选”了它。然后,继续工作,编辑,提交,推送等等。

最终,当你执行另一次从一个分支到你的特性分支的合并时(反之亦然),Git会识别出你已经在那个特定的提交中合并了,知道它不需要再做一次,然后“跳过”它。

补充现有的答案,因为这些命令是循环的,我们可以在一行中完成它。假设我们在特征分支:

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

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

alias merge_with_master="git checkout master && git pull && git checkout - && git merge -"