假设我们在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.",但我不确定这是否帮助了我。


当前回答

我添加了我的答案,与其他答案相似,但可能是最快阅读和执行的答案。

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

假设我有一个repo1和master和dev-user两个分支。

Dev-user是在某个master状态下完成的分支。

现在假设dev-user和master都在前进。

在某些情况下,我希望dev-user获得所有在master中做出的提交。

我该怎么做?

我首先进入我的存储库根文件夹

cd name_of_the_repository

then

git checkout master 
git pull 
git checkout dev-user
git pull
git merge master 
git push 

我希望这能帮助到其他有同样情况的人。

其他回答

下面是一个脚本,您可以使用它将主分支合并到当前分支中。

该脚本的功能如下:

切换到主分支 拉动主分支 切换回当前分支 将主分支合并到当前分支中

将此代码保存为批处理文件(.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

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

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

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

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

你应该能够在master上重新建立你的分支:

git checkout feature1
git rebase master

处理所有出现的冲突。当你提交bug修复(已经在master中)时,Git会说没有任何更改,可能它们已经被应用了。然后,您将继续使用。(同时跳过已经在master中的提交)

git rebase --skip

如果你在你的特性分支上执行git日志,你会看到bug修复提交只出现一次,而且是在master部分。

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

================ 编辑额外的上下文 ====================

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

我想防止[…]]提交到我的特性分支上,这与特性实现没有关系。

将他的私有分支重新基于master正是会产生这个结果的原因。相比之下,将master合并到他的分支中将会做他特别不想发生的事情:添加一个与他正通过他的分支进行的特性实现无关的提交。

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

只重新建立私有分支(即只存在于本地存储库中,没有与他人共享的分支)。重设共享分支将“破坏”其他人可能拥有的副本。 如果你想从一个分支(无论是master还是其他分支)集成到一个公共分支(例如,你已经推动了一个分支打开了一个pull请求,但现在与master有冲突,你需要更新你的分支来解决这些冲突),你需要合并它们(例如,git合并master,如@Sven的答案)。 如果您愿意的话,还可以将分支合并到本地私有分支中,但是请注意,这会导致在您的分支中提交“外部”。

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

我在特征分支上进行重构。我现在想合并主更改到我的功能分支。我远远落后了。注意,我不想把主更改拉到本地,因为我的特性分支有模块从一个地方移动到另一个地方。我发现仅仅在没有拉力的情况下表演是行不通的。上面写着“已更新”。

 //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合并origin/master:

 git checkout master 
    git fetch 
    git checkout my-feature-branch 
    git merge origin/master