标签: git-branch-sculpting

删除/隐藏git分支而不删除提交历史记录

情况:

我有一个主要的回购,主要的开发分支和许多"实验"分支从它发芽(例如,exp1exp2).这些实验分支的目的是作为产生数值结果的实验​​的占位符.我记录了实验分支的分支名称(和提交ID),因此我可以返回到提交,以准确查看结果背后的代码和历史记录.

但是,现在,有很多实验分支,很难看到主树.所以,我正在重新思考将占位符保留在每组结果背后的代码(即每个实验)的策略.显然我可以在每个分支保存工作目录,但保留提交历史记录也会很好.

可能的方法:

解决此问题的一种方法是将实验分支移动到它们自己的独立存储库中,每个存储库都以dev分支的提交历史记录中的相应节点的子节点为根.这是我的意思的说明:

在此输入图像描述

点击此处查看大图版本(在imgur.com上).

因此,例如,对于分支exp1,我想将提交导出A->B->C到以提交为根的单独repo A.然后,我可以记录提交的哈希值,P1以便我知道exp1分支的后果.

题:

我怎样才能做到这一点?

更好的问题:

另一方面,我强烈怀疑有一个更好的策略来做我想做的事情 - 即,整理树进行目视检查,但将占位符保留在先前的分支中,以便我可以在需要时返回它们.那么,任何人都可以为此推荐一个策略吗?

git git-branch git-branch-sculpting

25
推荐指数
1
解决办法
9247
查看次数

如何将Git存储库组合成线性历史记录?

我有两个Git仓库R1R2,包含从产品发展的两个时期承诺:1995 - 1997年和1999年至2013年.(我通过将现有的RCS和CVS存储库转换为Git来创建它们.)

R1:
A---B---C---D

R2:
K---L---M---N
Run Code Online (Sandbox Code Playgroud)

如何将两个存储库合并为一个包含项目线性历史的准确视图的存储库?

A---B---C---D---K---L---M---N
Run Code Online (Sandbox Code Playgroud)

请注意,之间R1R2文件已添加,删除和重命名.

我尝试创建一个空的存储库,然后将它们的内容合并到它上面.

git remote add R1 /vol/R1.git
git fetch R1

git remote add R2 /vol/R2.git
git fetch R2

git merge --strategy=recursive --strategy-option=theirs R1
git merge --strategy=recursive --strategy-option=theirs R2
Run Code Online (Sandbox Code Playgroud)

但是,这会留下最新的文件D,但不是修订版K.我可以制作一个合成提交来删除合并之间的额外文件,但这对我来说似乎不优雅.此外,通过这种方法,最终结果包含实际上没有发生的合并.

git merge git-rewrite-history git-branch-sculpting

15
推荐指数
1
解决办法
1228
查看次数

跨多个分支的 Git 交互式变基

我有一个 git repo,它有一个源文件,其中包含一些我希望删除的敏感内容(我不想删除该文件,只需修改其内容)。提交是在项目开发的早期(当时我们只有一个分支),但现在在其他 n 个分支中找到了它自己。

是否有任何 git-fu 我可以运行以在所有分支中清理它?交互式 rebase 一次只能对一个 Head 起作用。

我确实在 github 上找到了这个命令:

git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch DotNet/src/ExternalLibs/GemBox/' \
--prune-empty --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)

但它只适用于删除,而不是修改

A-B-C-**STUPID**-D-E-F
                    \
                     \-G-H-I
                          \-J-K
Run Code Online (Sandbox Code Playgroud)

git rebase git-rebase git-rewrite-history git-branch-sculpting

6
推荐指数
1
解决办法
1144
查看次数

合并提交时如何避免rebase地狱?

我的git树中有以下情况:

1 -- 2 -- 3 -- 4 <-- master
      \         \
       5 -- 6 -- 7 -- 8 -- 9 <-- feature
Run Code Online (Sandbox Code Playgroud)

我想从功能中重新定义和压缩所有东西,这样我就可以通过添加功能的单个提交来提升master.

由于提交7已经是解决所有冲突的合并,我尝试了以下方法:

git rebase -i -p master
Run Code Online (Sandbox Code Playgroud)

我在这里给出的唯一选择是提交7,8和9."有道理",我想,"因为合并已经包括5和6,所以它们可以被丢弃".我继续在一次提交中压缩7,8和9,我们称之为"789".(我知道,我是创意类型.)

在此之后,我的树看起来像这样:

1 -- 2 -- 3 -- 4 <-- master
                \
                 5 -- 6 -- 789 <-- feature
Run Code Online (Sandbox Code Playgroud)

同一分支中5和6的存在使我感到困惑,但同样,因为它们已经包含在7中(现在是789),我可以放弃它们.

所以我git rebase -i master又一次,这次我丢弃了5和6.

然而,冲突在这里和那里出现,所以我放弃了整个事情.

我目前处于该阶段,但我的远程分支尚未更新,因此我可以重置为原始状态.

在没有手动解决所有合并冲突的情况下,哪些是正确的步骤,这将使我想到的地方?

git rebase git-rebase git-rewrite-history git-branch-sculpting

5
推荐指数
2
解决办法
2337
查看次数