如何在同一Git仓库中同步两个分支?

52

我常常遇到一个常见的工作流障碍:

master 是我们的“稳定”分支

$ git status
# On branch master
nothing to commit (working directory clean)

在分支上创建一个模块

$ git checkout -b foo
$ echo "hello" > world
$ git add .
$ git commit -m "init commit for foo module"
$ git checkout master
$ git merge foo

在主分支或其他分支上进行工作

在接下来的几周里,更多的代码将直接提交到主分支和其他分支。在此期间,foo 分支将不会被修改。

恢复工作/更新 foo 分支

$ git checkout foo

糟糕!foo已经严重过期了!我知道为什么,但是我确实需要将foo与同步。

问题

我如何从master分支获取最新内容?

4个回答

62

如果您不需要这个分支:

如果您已经将foo合并回master,则使用“git branch -d foo”删除主题分支,然后在未来需要再次进行编辑时,“checkout -b foo”。

如果您需要这个分支:

您可以针对主分支重新派生您的主题分支:

git checkout foo
git rebase master

或者:

git rebase master foo

1
Adam,rebase正是我正在寻找的东西;比删除/重新创建主题分支更合适。如果您将您的答案更新为“git rebase master”,我将很高兴接受它。(请不要指定origin/master,因为我没有处理远程) - maček
7
有用的附加信息:git rebase master foo 等同于 git checkout foo && git rebase master :) - maček
4
如果你已经将分支foo发布到服务器上,那么重新在master分支上进行变基操作可能会导致潜在的问题。这是因为变基操作会改变分支中所包含的提交记录的哈希值,当你尝试推送变基后的foo分支时,它与服务器上的不匹配,导致无法完成推送,提示错误信息"不是一个快进"。 - giorgiosironi
2
giorgiosironi: 没错。git rebase 应该在提交更改之后,但在将更改推送或合并到公共分支之前进行。 - Teemu Leisti
这确实很好,但如果有人在其中添加了一些东西(比如团队成员),那么它就不起作用了,或者你会丢弃他们的东西,尽管你不应该这样做。 - matanster
显示剩余3条评论

20
重新定位是将一系列提交移动或合并到一个新的基本提交的过程。在特性分支工作流程中,重新定位是最有用和易于可视化的。一般的过程可以可视化为以下步骤: Git Rebase visual explanation 下面的示例结合使用 git rebase 和 git merge 来维护线性项目历史记录。这是一种快速简便的方式,确保您的合并将被快进。
# Start a new feature
git checkout -b new-feature master
# Edit files
git commit -a -m "Start developing a feature"

在我们的项目开发过程中,我们意识到存在一个安全漏洞。

# Create a hotfix branch based off of master
git checkout -b hotfix master
# Edit files
git commit -a -m "Fix security hole"
# Merge back into master
git checkout master
git merge hotfix
git branch -d hotfix

将热修复分支合并到主分支后,我们有了一个分叉的项目历史记录。为了保持线性历史记录,我们不会使用简单的Git合并,而是使用变基将功能分支集成到主分支中:

git checkout new-feature
git rebase master

这将新功能移动到主分支的末端,使我们可以从主分支进行标准的快进式合并:

git checkout master
git merge new-feature

摘自Atlassian Git Rebase教程


我希望你也可以用图示的方式展示这个。 - not2qubit
2
@not2qubit 你是指截图吗?还是图片解释正在对分支进行的操作? - Mauricio Gracia Gutierrez

2
我使用以下方法来合并两个分支(我的和你的),并同步这两个分支以继续工作。这似乎有效。有人认为有问题吗?"
git checkout mine # make sure I'm on my branch
git commit -a     # commit changes
git push origin mine  
git checkout yours # switch to your branch
git pull origin yours # get changes you've committed & pushed
git checkout mine 
git merge yours # merge your changes into mine
git push origin mine 
git checkout yours 
git rebase mine # set your branch to the merged result
git push origin yours # push the merged result up to your branch on origin
git checkout mine # get back to my branch

0

Adam的回答很好。

此外,对于那些正在使用IntelliJ并需要关于rebase和merge的帮助的人,这里有一个YouTube视频链接。这将帮助您直观地了解rebase的工作原理。

https://www.youtube.com/watch?v=Nftif2ynvdA


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接