Ste*_*ett 9 git git-merge git-rebase
我们有一系列这样的事件:
是否可以将第3步中的合并转换为基准?如果没有别的,它将使即将进行的合并变得更加简单,因为历史记录更少了。
我们尚未启用重新启用功能。
Dan*_*ank 10
考虑以下Git图:
A...C...D...F
^ ^ ^ master
\ \
G...H...I...J
^ feature
Run Code Online (Sandbox Code Playgroud)
...表示“大量提交”。
假设我们想从本质上进行基准化,即将提交提交到要素的历史记录中,而不是在master的历史记录中,然后将其重新构建为master中的线性提交序列。这是因为我们在提交时将master合并为功能I。如果我们尝试重新设置基准,那么Git就会搞砸了,因为它试图将其应用到例如Cmaster之上并发现冲突。
我们可以通过从中获取实际更改feature并将其打包到新提交中来解决此问题。这是仅使用非常基本的Git命令执行此操作的方法:
(1) git checkout feature
(2) git merge master
(3) git reset A
(4) git add -A # This stages all working copy changes
(5) git commit -m "Every change between A and J"
Run Code Online (Sandbox Code Playgroud)
在步骤(2)中,feature分支在master和中都具有所有更改J。步骤(3),在HEAD点后A,但我们的工作副本都来自变化master和J和步骤(4)和(5)阶段和提交这些更改。
此时,我们的图形如下所示
A...C...D...F
^ ^ master
\
J'
^ feature
Run Code Online (Sandbox Code Playgroud)
请注意,J'其中包含所有内容A...F。现在我们做
git rebase master
Run Code Online (Sandbox Code Playgroud)
Git乐于将更改J'作为新提交应用J'',但是要添加的唯一更改是那些G...J更改,因为其他更改已在master中。所以现在我们有了
A...F<--J''
master^ ^feature
Run Code Online (Sandbox Code Playgroud)
我们feature分支中的所有变化都被压入提交J''。此时,您可以根据需要以更精细的方式(甚至使用)重置F并重新应用更改。J''git add --patch
另一种方法基本上是相同的事情是read-tree在解释这对方的回答
git checkout master
git read-tree -u -m feature
Run Code Online (Sandbox Code Playgroud)
从此答案中窃取的另一种做同一件事的方法是
git diff master > feature.patch
git checkout master
patch -p1 < feature.patch
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1022 次 |
| 最近记录: |