file git commit -a -m "Initial commit" Feature1 从 master 分支并完成了一些工作:git branch feature1 git ch......" /> file git commit -a -m "Initial commit" Feature1 从 master 分支并完成了一些工作:git branch feature1 git ch......"> file git commit -a -m "Initial commit" Feature1 从 master 分支并完成了一些工作:git branch feature1 git ch......" />
假设我们在 Git 中有以下情况:
创建的存储库: mkdir GitTest2 cd GitTest2 git init 在 master 中发生一些修改并提交:echo "On Master" > file git commit -a -m "Initial commit" Feature1 从 master 分支并完成了一些工作:git branch feature1 git checkout feature1 echo "Feature1" > featureFile git commit -a -m "Commit for feature1" 同时在master-code中发现了一个bug,并建立了一个hotfix-branch: git checkout master git branch hotfix1 git checkout hotfix1错误在 hotfix 分支中修复并合并回主分支(可能在拉取请求/代码审查之后): echo "Bugfix" > bugfixFile git commit -a -m "Bugfix Commit" git checkout master git merge --no-ff hotfix1 在 feature1 上的开发继续: git checkout feature1
假设我需要在我的功能分支中进行修补程序,可能是因为该错误也发生在那里。如何在不将提交复制到我的功能分支中的情况下实现这一点?
我想防止在我的功能分支上获得两个与功能实现无关的新提交。如果我使用拉取请求,这对我来说尤其重要:所有这些提交也将包含在拉取请求中并且必须进行审查,尽管这已经完成(因为修补程序已经在主服务器中)。
我不能做git merge master --ff-only
:“致命:不可能快进,中止。”,但我不确定这是否对我有帮助。
feature1
完全是本地的,请查看 git rebase
。
git rebase
对我来说似乎是黑魔法......
git branch feature1
和 git checkout feature1
可以合并为 git checkout -b feature1
和 4. 可以完全简化为 git checkout -b hotfix1 master
rebase
应该是最后的手段,imo,并且“管理所有冲突出现”......好吧。)
我们如何将 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 初学者来说会搞砸事情。
您应该能够在 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 上正是产生该结果的原因。相比之下,将 master 合并到他的分支中恰恰会做他特别不希望发生的事情:添加一个与他正在通过他的分支进行的功能实现无关的提交。
为了解决阅读问题标题的用户,跳过问题的实际内容和上下文,然后只盲目地阅读最佳答案,假设它总是适用于他们的(不同的)用例,请允许我详细说明:
仅 rebase 私有分支(即仅存在于您的本地存储库中并且尚未与其他人共享)。重新设置共享分支会“破坏”其他人可能拥有的副本。
如果您想将来自分支(无论是主分支还是其他分支)的更改集成到公共分支中(例如,您已推送分支以打开拉取请求,但现在与主分支发生冲突,您需要更新您的分支来解决这些冲突)您需要将它们合并(例如,与@Sven 的答案中的 git merge master 一起使用)。
如果这是您的偏好,您也可以将分支合并到您的本地私有分支中,但请注意,这将导致您的分支中出现“外部”提交。
最后,如果您不满意这个答案不是最适合您的情况,即使它适用于@theomega,在下面添加评论也不会特别有帮助:我无法控制选择哪个答案,只有@theomega 可以。
-f
强制更新以使用重新设置的版本覆盖分支。当心!
-f
?还是因为我需要 -f
而导致我的整个工作流程存在缺陷?
feature1
。
rebase
git-scm.com/docs/git-rebase 很明显,您不应该重新设置公共/共享分支,而是使用它来在您的私有分支上重写/清理历史记录(包括将其更新为分支 master
)很好:这正是私有分支存在的原因。说 rebase
命令适用于犯错或不理解 DVCS 的人对我来说似乎有点误导。
git 合并
您可以按照以下步骤操作
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. 合并特性分支到 origin/master 分支
origin/master 是远程 master 分支,而 master 是本地 master 分支
$ git checkout master
$ git pull origin/master
$ git merge feature
$ git push origin/master
git merge master
并获得了 Already up to date
。您的回答有助于了解我在当地有老主人。谢谢!
git merge master
。我的分支是本地和远程的。但是在 git merge master
之后,我总是在我的分支中看到来自 master 的所有新更改/提交。当我创建 PR 时,它会显示所有文件 = 我的更改 + 其他来自 master 的更改。难道我做错了什么?
根据 this article,您应该:
创建基于新版本 master git branch -b newmaster 的新分支
将旧功能分支合并到新的 git checkout newmaster
解决新功能分支上的冲突
前两个命令可以组合成 git checkout -b newmaster
。
这样您的历史记录就会保持清晰,因为您不需要反向合并。而且您不需要非常谨慎,因为您不需要执行 Git 变基。
我添加了我的答案,类似于其他人,但也许它会是最快的阅读和实施。
注意:在这种情况下不需要变基。
假设我有一个 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
我希望这可以帮助处于相同情况的其他人。
Zimi's answer 概括地描述了这个过程。以下是具体情况:
创建并切换到新分支。确保新分支基于 master,以便包含最近的修补程序。 git checkout master git branch feature1_new git checkout feature1_new # 或者,合并为一个命令: git checkout -b feature1_new master 切换到新分支后,合并现有功能分支的更改。这将添加您的提交,而不会复制修补程序提交。 git merge feature1 在新分支上,解决您的功能和主分支之间的任何冲突。
完毕!现在使用新分支继续开发您的功能。
这是一个可用于将主分支合并到当前分支的脚本。
该脚本执行以下操作:
切换到主分支
拉取主分支
切换回当前分支
将主分支合并到当前分支
将此代码保存为批处理文件 (.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 checkout hotfix1
以进入 hotfix1 分支。然后执行 git log
以获取相关提交的 SHA-1 哈希(唯一标识提交的随机字母和数字的大序列)。复制那个(或前 10 个左右的字符)。
然后,git checkout feature1
回到您的功能分支。
然后,git cherry-pick <the SHA-1 hash that you just copied>
这会将那个提交,并且只有那个提交,拉到你的特性分支中。该更改将在分支中-您只是“挑选”它。然后,恢复工作、编辑、提交、推送等,让您心满意足。
当您最终从一个分支执行另一次合并到您的功能分支(反之亦然)时,Git 会识别出您已经在该特定提交中合并,知道它不必再次合并,并且只需“跳过”它。
git merge
以您似乎暗示的这种“重放提交”方式工作(“跳过它”)。混合樱桃采摘和合并显然会导致问题;见:news.ycombinator.com/item?id=3947950
作为现有答案的补充,由于这些命令是经常性的,我们可以连续执行。鉴于我们在功能分支中:
git checkout master && git pull && git checkout - && git merge -
或者将它们添加到别名中:
alias merge_with_master="git checkout master && git pull && git checkout - && git merge -"
我在功能分支上并进行了重构。我现在想将主更改合并到我的功能分支。我远远落后。注意我不想将主更改拉到我的本地,因为我的功能分支已将模块从一个地方移动到另一个地方。我发现在没有拉动的情况下只在下面执行是行不通的。它说“已经是最新的”。
//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
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
不定期副业成功案例分享
git merge master
将从您的 本地 master 副本合并,因此即使您在其他人将不同的分支合并到 master 之后在您的功能分支中完成了git pull
,您需要先git checkout master
,然后是git pull
,然后是git checkout feature1
,然后是git merge master
。git fetch
和git merge origin/master
git pull origin master
将自动将orgin/master
合并到当前分支