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

时间:2010-10-24 23:13:58

标签: git workflow git-rebase git-branch

这是我经常遇到的常见工作流障碍:

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分支获取最新内容?

3 个答案:

答案 0 :(得分:32)

如果您不需要分支:

如果你已经将foo合并到master,“git branch -d foo”来杀死主题分支,然后当你需要再次攻击它时“checkout -b foo”。

如果您确实需要分支:

您可以针对主分支重新设置主题分支:

git checkout foo
git rebase master

或者:

git rebase master foo

答案 1 :(得分:6)

重新引导是将提交序列移动或组合到新的基本提交的过程。重新定位在功能分支工作流的上下文中最有用且易于可视化。一般过程可以看作如下:

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

将修补程序合并到master后,我们有一个分叉的项目历史记录。我们将功能分支与rebase集成以保持线性历史记录,而不是简单的git合并:

git checkout new-feature
git rebase master

这会将新功能移到master的顶端,这样我们就可以从master进行标准的快进合并:

git checkout master
git merge new-feature

取自Atlassian Git Rebase Tutorial

答案 2 :(得分:1)

我使用以下内容合并两个分支(我的和你的)的更改,并同步两个分支以继续工作。这似乎正在工作。有人看到这个问题吗?

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