Git 重基到重基/挤压
这是我遇到的常见情况,我正在寻找一个干净的解决方案Git 重基到重基/挤压,git,git-rebase,git-squash,Git,Git Rebase,Git Squash,这是我遇到的常见情况,我正在寻找一个干净的解决方案 在git分支上做一些工作(我的第一个工作) 推到github 在我的第一份工作的基础上,开始一个新的分支(一些进一步的工作) 未指定的时间流逝量 批准人将我的第一份工作重新调整或压缩到主文件上 这会创建新的提交,git不会将其视为等同于我所基于的内容,即使最终结果是相同的(即master的头与我的第一部作品的头相同) 我运行git-rebase-master将一些进一步的工作移动到master 我现在基于的我的第一部作品的提交都与已经挤压/合并
我的第一个工作
)一些进一步的工作
)我的第一份工作重新调整或压缩到主文件上
master
的头与我的第一部作品的头相同)
git-rebase-master
将一些进一步的工作
移动到master
我的第一部作品
的提交都与已经挤压/合并的内容冲突git-rebase-I master
来解决这个问题,然后删除我的第一个作品的所有提交。这将在master
上干净地重放附加提交
有更清洁的解决方案吗?有没有一种方法可以让git自动识别何时发生了重基/挤压(如4所示)?清洁器在旁观者/工作人员的眼睛(或手)中,但您可以使用git-rebase--On
来区分哪些提交进行复制,哪些提交进行复制
请记住,git-rebase
意味着:1我有一个线性提交链,如图1所示,我想复制到一个新的线性提交链,如图2所示。复制完成后,我希望我的分支名称指向上次复制的提交。原来的A-B-C
链即使仍然存在,也不再有用
这告诉Git:
枚举从C
开始并向后工作的所有提交。这就是C
然后B
然后A
然后*
然后是*
之前的一切
枚举从上游/master
开始并向后工作的所有提交。这是第二个o
,然后是*
,然后是*
之前的所有内容
将第二份清单中的所有内容从第一份清单中删除。因此,这将淘汰*
和所有早期提交。第二个o
不在第一个列表中,但这没关系:如果它在,我们会把它删掉,但不是这样,所以我们什么也不做。我们的列表现在是C
、B
和A
颠倒列表以将其放入正确的顺序,然后,一次一个,将每个提交复制到新位置。新位置从上游/master
指向的提交点开始。因此,这会将A
复制到A'
,B
复制到B'
,C
复制到C'
将当前分支名称主题
从其以前的位置剥离,并像往常一样将其粘贴到新的提交链的末尾。因此,这使得topic
指向C'
,而不是C
但在你的新案例中,你有:
...--o--* <-- upstream/master
\
A--B--C <-- feature1
\
D--E--F--G <-- feature2
如果您只是运行git checkout feature2;git重新设置上游/master
,您的git将枚举提交G-F-E-D-C-B-A-*-…
,枚举ABC-*-…
,从第一个中减去第二个,并留下复制G-F-E-D-C-B-A
链的说明
fancier rebase命令是:
git checkout feature2
git rebase --onto upstream/master feature1
这将目标参数(Git开始复制的位置)与限制参数分开。现在的目标是上游/master
(Git文档将其调用到参数上)。限制参数现在是feature1
。如果愿意,可以使用commitC
的原始散列ID。Git只需要知道:从哪里开始我的淘汰这些提交枚举?(令人困惑的是,Git文档将其称为上游参数。)
如您所见,这将取消C-B-A-*
提交,而不仅仅是*
提交,因此在复制之后,您有:
D'-E'-F'-G' [in progress]
/
...--o--*--ABC <-- upstream/master
\
A--B--C <-- feature1
\
D--E--F--G <-- feature2
D'-E'-F'-G'[进行中]
/
…--o--ABC太棒了。答案很清楚,解释也很好。
...--o--*--ABC <-- upstream/master
\
A--B--C <-- feature1
\
D--E--F--G <-- feature2
git checkout feature2
git rebase --onto upstream/master feature1
D'-E'-F'-G' [in progress]
/
...--o--*--ABC <-- upstream/master
\
A--B--C <-- feature1
\
D--E--F--G <-- feature2