--preserve-merges
Instead of ignoring merges, try to recreate them.
This uses the --interactive machinery internally, but combining it
with the --interactive option explicitly is generally not a good idea
unless you know what you are doing (see BUGS below).
Run Code Online (Sandbox Code Playgroud)
那么当你使用时会发生什么--preserve-merges?它与默认行为(没有该标志)有何不同?"重新创建"合并等意味着什么?
我有以下Git存储库拓扑:
A-B-F (master)
\ D (feature-a)
\ /
C (feature)
\
E (feature-b)
Run Code Online (Sandbox Code Playgroud)
通过重新feature分支我希望改变整个子树(包括子分支):
$ git rebase feature master
A-B-F (master)
\ D (feature-a)
\ /
C (feature)
\
E (feature-b)
Run Code Online (Sandbox Code Playgroud)
但是,这是实际结果:
C' (feature)
/
A-B-F (master)
\ D (feature-a)
\ /
C
\
E (feature-b)
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过执行以下方法手动修复它:
$ git rebase --onto feature C feature-a
$ git rebase --onto feature C feature-b
Run Code Online (Sandbox Code Playgroud)
但有没有办法自动重组分支,包括其所有子/后代?
我的项目中有一个主分支,用于从其他人那里获取更改.从那时起,我通常有几个主题分支,我正在工作.
我的问题是:有没有办法让我将新的更改添加到我的主人中,然后立即将所有主题分支重新绑定到该主题上?
情况就是这样:
D--E topic1
/
A--B--C master
\
F--G topic2
Run Code Online (Sandbox Code Playgroud)
我想用一个命令(H来自上游)完成这个任务:
D'--E' topic1
/
A--B--C--H master
\
F'--G' topic2
现在,我知道我可以通过将topic1和topic2重新设置为master来实现这一目标,我甚至可以编写一个脚本来自动执行此操作.但是,如果我有其他几个分支,创建新分支并经常删除其他分支并且我一直收到上游变更怎么办?
当手动完成时,这个操作(几个rebase)既累人又容易出错.
有没有更简单的方法?
谢谢!
是否可以使用git中的所有子分支来重新分支一个分支?
我经常使用分支作为快速/可变标记来标记某些提交.
* master
*
* featureA-finished
*
* origin/master
Run Code Online (Sandbox Code Playgroud)
现在我想rebase -i master进入origin/master,改变/重新提交提交featureA-finished^
之后git rebase -i --onto origin/master origin/master master,我基本上希望历史是:
* master
*
* featureA-finished
* (changed/reworded)
* origin/master
Run Code Online (Sandbox Code Playgroud)
但我得到的是:
* master
*
* (same changeset as featureA-finished)
* (changed/reworded)
| * featureA-finished
|.* (original commit i wanted to edit)
* origin/master
Run Code Online (Sandbox Code Playgroud)
有没有办法绕过它,还是我坚持在新的重新提交的作品上重新创建分支?
这是我目前的git树:
A - H (master)
|
\- B - C - D - E (feature)
|
\- F (new)
|
\- G (other)
Run Code Online (Sandbox Code Playgroud)
而且我想重新设计侧支,这取决于H而不是A:
A - H (master)
|
\- B'- C'- D'- E'(feature)
|
\- F'(new)
|
\- G'(other)
Run Code Online (Sandbox Code Playgroud)
看似简单的概念,很难自动完成.这已经在这里和这里被问过,但是提议的解决方案对我不起作用.
首先,正如前面所指出的那样,git branch当前分支存在时,输出并不容易解析(有一个*前置).但这不是一个塞子,在我的情况下,我可以轻松提供名称feature,new并other手动,或确保当前分支master.
然后我尝试了这些命令:
git rebase --committer-date-is-author-date --preserve-merges --onto master feature^ feature
git rebase --committer-date-is-author-date --preserve-merges --onto master …Run Code Online (Sandbox Code Playgroud) 我在git中使用了很多本地主题分支,有时最终导致主题分支之间的依赖关系导致rebase问题.例如,结构如下:
master ---> featureA ---> featureB
\--> featureC
Run Code Online (Sandbox Code Playgroud)
如果master变化和我(和解析)冲突时重订基featureA,然后后来重订featureB到featureA触发同样的冲突(有时是令人振奋的新的为好),因为它试图从重新应用补丁featureA分支.假设之间的实际的补丁featureA,并featureB会干净的应用,如果精挑细选,有没有在这种情况下做底垫,大约有樱桃采摘所有提交的之间的相同效果的方式featureA和featureB?
编辑问题归结为"也可以git rebase指示重新标记标签吗?" 但对原始问题的回答也会有所帮助.
问如何将过去添加到git存储库?我遵循了这些指示.< edit >然后我重新加入以包含仅在快照中的文件,请参见此处.< / edit >由于历史记录被重写(由git filter-branch或git rebase或两者?)所有标签仍然在原始时间线上*我不知何故喜欢将它们移动到新的.我想我用标签做了所有提交消息,所以我可以尝试编写一个使用它们的脚本,但更通用的git move-tags <from> <to>会更好.
那么,有没有办法解决"在新时间轴之后N提交的提交,以便标记旧时间轴上的第N次提交"?除了明显的手动重新定位之外的任何其他解决方案也会很棒.
(请随意将那个可怕的长句纠正为简单的英语......)
*)嘿,git解决了祖父悖论!
在处理我的功能分支时,我不断地对它们进行重新排序和压缩,git rebase -i以保持我的历史记录的更清晰版本。有时我会开发多个相互依赖的功能(我团队的规则是使 PR 尽可能小,因此较大功能的一个原子块通常会成为其自己的功能分支)。由于此工作流程,我通常会在重新设置分支基础后手动重新指向分支。有没有办法自动将这些指针移动到它们应该着陆的位置?
例如,在此图中:
5bab4818e (HEAD -> cell-toggle-comp) Added cell-toggle component
d55cab881 (toggle-comp) Toggle: Added honey traceability comment
4240f0ac3 Made Toggle a named export and replaced references to obsolete <ui> alias
90a0b2452 Refactored Switch instances to toggle
e15c758a0 Updated Switch component to latest specs (and renamed things to match design lingo)
d53090e93 (fix-switch-reference) Fixed Switch reference that was being imported from React Native instead of src/components
4a214cb72 (cell-text-selection-comp) Added CellTextSelection ui component
cef3b5716 (origin/master, origin/HEAD, master) …Run Code Online (Sandbox Code Playgroud)