在我的Git工作流中,我们有一个主存储库和一个分支master。每个人从远程主机拉,每个人推到远程主机。当我准备一个特性时,我想在自己的分支中工作。到目前为止,我的历史是这样的:
git pull --rebase
git checkout -b new_feature
<make some commits>
git checkout master
git pull --rebase
现在我想合并这个分支,我需要的是:
本地主分支中没有合并提交。
所有提交到我的新的_功能分支合并到master中,就好像我在master中提交了它们一样。
所有合并的提交都将在本地远程头指针的顶部进行合并。
我最关心的是第3项,在需要的时候,我可以安全地推动变化。如果合并的提交与head之前的提交交织在一起,那么我在推送时会遇到问题,请参阅我遇到的相关问题:git: Pushing Single Commits, Reordering with rebase, Duplicate Commits。
我读过以下内容:
http://mettadore.com/2011/05/06/a-simple-git-rebase-workflow-explained/
Keep commits history after a 'git merge'
How do you rebase the current branch's changes on top of changes being merged in?
我想我需要这样做:
git checkout master
git pull --rebase
git checkout new_feature
git rebase master
git checkout master
git rebase new_feature
git push
我的理解是
git checkout new_feature
git rebase master
将使新的_功能看起来像是从新的当前头部分支出来的。是真的吗?还有那个
git checkout master
git rebase new_feature
将在主控形状上放置新的\功能。对吗?如果是这样,这就是我困惑的主要点。如果“git-rebase-master”将master提交放在新的_特性的底部,那么为什么“git-rebase-new_-feature”将新的_特性提交放在master的顶部,即为什么它不做相反的事?
最佳答案
回答
这里有一个工作流,您可以使用它来完成您需要它做的事情。
git checkout master
git pull --rebase (1)
git checkout new_feature
<do a bunch of commits>
git rebase master (2)
git checkout master
git merge new_feature (3)
git branch -D new_feature (4)
解释
(1)
git pull --rebase
将首先获取origin/master
并在其上重放本地的master
。请注意,在示例日志中,您的本地提交位于“本地远程头指针”的顶部。> git log --oneline --all -10 --decorate
d34d34c (HEAD, master) Local commit message.
d3434r2 Local commit message.
d234d4c Local commit message.
er3ede3 (origin/master, origin/HEAD) Remote commit message.
sfe3fd3 Remote commit message.
现在您可以
checkout
并在您的new_feature
分支上工作一段时间。完成后…(2)
git rebase master
将在new_feature
顶部重放master
同样,本地提交仍然位于“本地远程头指针”之上。> git log --oneline --all -10 --decorate
fc5773d (new_feature) Local new_feature commit.
9282838 Local new_feature commit.
d34d34c (HEAD, master) Local commit.
d3434r2 Local commit.
d234d4c Local commit.
er3ede3 (origin/master, origin/HEAD) Remote commit.
sfe3fd3 Remote commit.
rebase
命令只需将new_feature
放在master前面,为了对齐它们,您需要运行…(3)
git merge new_feature
,这将执行快进合并。现在,HEAD
、new_feature
和master
都指向同一提交。> git log --oneline --all -10 --decorate
fc5773d (HEAD, new_feature, master) Local new_feature commit.
9282838 Local new_feature commit.
d34d34c Local commit.
d3434r2 Local commit.
d234d4c Local commit.
er3ede3 (origin/master, origin/HEAD) Remote commit.
sfe3fd3 Remote commit.
(4)之后,您可以安全地删除
new_feature
分支。推送前的最终日志如下所示:> git log --oneline --all -10 --decorate
fc5773d (HEAD, master) Local new_feature commit 2
9282838 Local new_feature commit.
d34d34c Local commit.
d3434r2 Local commit.
d234d4c Local commit.
er3ede3 (origin/master, origin/HEAD) Remote commit.
sfe3fd3 Remote commit.