我是 Git 新手,现在我处于这种情况:
我有四个分支(master、b1、b2 和 b3)。
在我从事 b1-b3 工作之后,我意识到我在分支 master 上需要更改一些应该在所有其他分支中的东西。
我改变了我在master中需要的东西......这是我的问题:
如何使用 master
分支代码更新所有其他分支?
你有两个选择:
第一个是合并,但这会为合并创建一个额外的提交。
检查每个分支:
git checkout b1
然后合并:
git merge origin/master
然后推:
git push origin b1
或者,您可以进行变基:
git fetch
git rebase origin/master
你基本上有两个选择:
你合并。这实际上非常简单,并且是一个完美的本地操作: git checkout b1 git merge master # repeat for b2 and b3 这使历史保持原样:您从 master 分叉,您对所有分支进行了更改,最后您合并了从 master 更改为所有三个分支。 git 可以很好地处理这种情况,它是为同时在各个方向发生的合并而设计的。您可以相信它能够正确地将所有线程聚集在一起。它根本不关心分支 b1 是否合并 master,或者 master 合并 b1,合并提交在 git 中看起来都一样。唯一的区别是,哪个分支最终指向这个合并提交。你变基。具有 SVN 或类似背景的人会觉得这更直观。这些命令类似于合并案例: git checkout b1 git rebase master # repeat for b2 and b3 人们喜欢这种方法,因为它在所有分支中保留了线性历史。然而,这个线性历史是一个谎言,你应该意识到它是一个谎言。考虑这个提交图: A --- B --- C --- D <-- master \ \-- E --- F --- G <-- b1 合并结果是真实的历史: A -- - B --- C --- D <-- master \ \ \-- E --- F --- G +-- H <-- b1 但是,变基会为您提供以下历史记录: A --- B --- C --- D <-- master \ \-- E' --- F' --- G' <-- b1 关键是,提交 E'、F' 和 G' 永远不会确实存在,并且可能从未经过测试。他们甚至可能无法编译。实际上,通过 rebase 创建无意义的提交非常容易,尤其是当 master 中的更改对 b1 中的开发很重要时。这样做的后果可能是,你无法区分 E、F 和 G 三个提交中的哪一个实际上引入了回归,从而降低了 git bisect 的价值。我并不是说你不应该使用 git rebase。它有它的用途。但是,无论何时使用它,您都需要意识到您在历史上撒谎的事实。你至少应该编译测试新的提交。
git checkout <source branch>
git pull
。然后继续上面的:git checkout b1
...
$ git rebase production First, rewinding head to replay your work on top of it... Applying: ADDED TO ENV AS TEST Using index info to reconstruct a base tree... M Puppetfile Falling back to patching base and 3-way merge... Auto-merging Puppetfile CONFLICT (content): Merge conflict in Puppetfile Failed to merge in the changes. Patch failed at 0001 ADDED TO ENV AS TEST The copy of the patch that failed is found in: /home/user/src/puppet4-controlrepo/.git/rebase-apply/patch
git rebase master
是执行此操作的正确方法。合并意味着将为合并创建提交,而变基则不会。
如果您一直在断断续续地在一个分支上工作,或者在您一直在处理某事时在其他分支上发生了很多事情,那么最好将您的分支重新定位到 master 上。这使历史保持整洁,并使事情更容易理解。
git checkout master
git pull
git checkout local_branch_name
git rebase master
git push --force # force required if you've already pushed
笔记:
不要对你与其他人合作过的分支进行变基。
您应该基于您将要合并到的分支,该分支可能并不总是主分支。
http://git-scm.com/book/ch3-6.html 有一章是关于变基的,网络上还有大量其他资源。
local_branch_name
,则 git checkout local_branch_name
可能是 git checkout -
@cmaster 做出了最详尽的回答。简单来说:
git checkout master #
git pull # update local master from remote master
git checkout <your_branch>
git merge master # solve merge conflicts if you have`
您不应该重写分支历史记录,而是将它们保持在实际状态以供将来参考。在合并到 master 时,它会创建一个额外的提交,但这很便宜。提交不收费。
使用您的主分支副本更新其他分支,例如(备份)。您可以按照任何一种方式(变基或合并)...
做rebase(不会对备份分支进行任何额外的提交)。合并分支(将有一个额外的自动提交到备份分支)。注意:变基只不过是建立一个新的基地(一个新的副本)
git checkout 备份 git merge master git push
(如果有任何类似backup2等的其他分支,请重复此操作)
git checkout 备份 git rebase master git push
(如果有任何类似backup2等的其他分支,请重复此操作)
从 master 更新您的分支:
git checkout master
git pull
git checkout your_branch
git merge master
git checkout master git pull git checkout feature_branch git rebase master git push -f
在对 master 进行 rebase 后,您需要进行有力的推动
有两种方法
您想将 master 分支合并到您的分支中 - git checkout master - git pull - git checkout your-feature-branch - git merge master //解决冲突(如果有)并提交 - git push
2:如果您想在 main.js 之上重新调整您的更改。
git checkout master #Switch to main branch
git pull #Take latest
git checkout your-feature-branch #Switch to story branch
git pull --ff-only # Ensure branch is up to date
git rebase -i origin master #Interactively rebase your commits on top of master. So your changes are on top of latest commits in main.
git rebase --continue #Resolve conflicts and rebase --continue to continue with next commits
git push -f origin your-feature-branch # As you have rewritten the commit history, you have to **force push** the commits
如果您想恢复到上次提交并删除日志历史记录
使用下面的命令,假设您想转到具有 commitID SHA - 71e2e57458bde883a37b332035f784c6653ec509 的上一个提交,您可以指向此提交,在此提交之后它不会显示任何日志消息,之后所有历史记录都将被删除。
git push origin +71e2e57458bde883a37b332035f784c6653ec509^:master
对于发现此线程的每个人都在寻找易于使用且一致的解决方案以将当前分支与 master 上的最新更改合并:
您可以将其添加到您的 shell 配置中:
alias merge='currentBranch=$(git rev-parse --abbrev-ref HEAD) && git checkout master && git pull && git checkout $currentBranch && git merge master'
此别名适用于 5 个命令:
currentBranch=$(git rev-parse --abbrev-ref HEAD) # gets your current branch(needed for point 4)
git checkout master # checks out master
git pull # gets latest changes from master
git checkout $currentBranch # checks out the in point 1 saved branch
git merge master # merges your current branch with master
添加别名后,您可以简单地使用命令“合并”来“更新”您当前正在处理的分支。
这个问题有两种选择。
1) git rebase
2)git合并
只有在合并的情况下与以上两者存在差异,才会在历史记录中有额外的提交
1) git checkout 分支(b1,b2,b3)
2) git rebase origin/master (如果发生冲突,通过执行 git rebase --continue 在本地解决)
3) git推送
或者, git merge 选项是类似的方式
1) git checkout "your_branch"(b1,b2,b3)
2) git 合并大师
3) git推送
got push origin master
...没有意义。您没有更改主分支。我认为 119 upvote 是一个错误:/git rebase master
是正确答案