最近开始使用 git rebase
,但不确定是否正确。为了这个问题,origin
中有两个分支:master
和next
,next
是从master
分支创建的。
自从两者上次同步以来,master
进行了2次提交,next
进行了6次提交:
$ git log --oneline origin/next..origin/master
59b5552 master commit #2
485a811 master commit #1
$ git log --oneline origin/master..origin/next
4ebf401 next commit #6
e9b6586 next commit #5
197ada0 next commit #4
4a2c3c6 next commit #3
040a055 next commit #2
84537bf next commit #1
当我检出 next
分支并执行 git rebase -i origin/master
命令时,会得到以下结果:
$ git status
# On branch next
# Your branch and 'origin/next' have diverged,
# and have 8 and 6 different commits each, respectively.
最后,在执行git pull --rebase
之后,来自master
的两个提交已经被合并到next
中:
$ git log --oneline origin/next..next
8741d09 master commit #2
485a811 master commit #1
问题:
- 这是正确的方法吗?
- 为什么在运行
pull --rebase
之前有8和6
个不同的提交? - 是否可能简化此流程?
非常感谢 :)
git rebase --pull
很像git pull --rebase
。它会先进行一次 fetch,然后执行git rebase @{u}
。虽然这是个谎言,但这是一个简单的思考方式。重点是你的本地分支被重置到了 @{u},然后在重置之前旧分支上的所有本地提交都会被重新应用到上游的内容之上。这允许轻松地将变更推送到上游。 - Seth Robertsongit pull --rebase
命令后,你会得到 A-D-E-F-G-H-I-B'-C'。该命令将强制使你的本地分支(next)包含 @{u}(origin/next)上的所有提交,然后会将 next 分支中独有的内容进行回放(可能是 cherry-pick)到其之上。感谢 Git 的智能处理,它不会尝试创建 D"-E"-F"-G"-H"-I"。 - Seth Robertsongit pull --rebase
。感谢您的解释,我现在明白发生了什么。我正在执行的流程正确吗?先执行git rebase
然后再执行git pull --rebase
,还是有其他方法? - David Kuridžagit checkout next; git cherry-pick ...master
。 - Seth Robertsonrebase
之后跟随pull --rebase
是自我否定的,因为它在一个方向上更改历史记录,然后返回到另一方向。在运行任何命令(除了git fetch
以更新origin/*
)之前要回答的真正问题是:完成时我想让历史记录看起来像什么?一旦您知道了这一点,那么您采取的行动应该朝着那个目标前进。 - Mike Seplowitz