因此,我正在与一些队友一起进行项目,并且已经基于他们的更改,但是有没有办法删除他们的提交(只是在本地-不打算以这种方式推送)并随意重新添加?
**编辑:澄清,我不想将提交与我的提交结合使用,我只想使其像从未执行过的提交一样(从该提交中删除任何更改,等等)
Commit A: Commit that both of us got out
Commit B: His commit <- want to locally remove just this commit
Commit C: My commit
Run Code Online (Sandbox Code Playgroud)
我曾考虑过要创建一个分支,而只是将提交保留在分支上,而不是将他的更改拉到那个分支上,但是我想知道是否有一种更干净的方式不涉及单独的分支?
提前致谢!
不要怕树枝!分支(尤其是分支名称,因为Git中的“分支”一词含糊不清)是如此便宜以至于几乎是免费的。对于Git,创建一个新分支包括将一个提交哈希ID写入一个文件1,删除分支包括将一个文件删除。
提交本身虽然便宜,但仍然不那么昂贵。每一个承诺都只有一个“真实姓名”,这是一个又大又丑的散列ID,face0ff...或cafedad...或什么的。这些提交中的每个提交都记录其父提交ID,因此您(和Git)可以从分支上的最后一次提交开始向后工作,以查找分支上的所有提交。这些提交是永久且不变的。可以更改的不是提交,而是分支名称。
您绘制的内容具有三个提交,但您并未绘制它们之间的显式关系。通过仅记录父母,在每次提交中就记录了这种关系,这是一种父母/孩子的事情。2 因此,假设(合理地,我认为)A首先提交,然后是B,然后是C,您所拥有的是:
A <- B <- C <-- branch
Run Code Online (Sandbox Code Playgroud)
也就是说,分支名称branch指向您的提交C,而您的提交C又指向B(C表示“ B是我的父母”)并B指向A。这些都不是父指针可以更改的,但是分支名称可以更改,并且使新的分支名称如此便宜以至于它可能也是免费的。
因此,让我们重新命名并指向C:
$ git checkout -b temp
Run Code Online (Sandbox Code Playgroud)
现在我们有:
A--B--C <-- branch, HEAD -> temp
Run Code Online (Sandbox Code Playgroud)
即使有两个分支名称都指向commit,我在HEAD ->此处表示当前分支是。tempC
现在,您可以做的就是复制 C到一个新的commit中,该提交大体上类似于C,但不太一样。我们将其称为副本C'。在中C',我们需要以下两个主要区别:
A不是BB到的C更改,然后将这些更改作为补丁应用到A而不是上B。复制命令如下所示,然后移动分支名称git rebase:
$ git rebase --onto HEAD~2 HEAD~1 # we'll explain these later
Run Code Online (Sandbox Code Playgroud)
rebase命令复制每个“重新设置”的提交,在这种情况下,这只是commit C。然后,它将当前分支名称移动到指向副本:
A--B--C <-- branch
\
`---C' <-- HEAD -> temp
Run Code Online (Sandbox Code Playgroud)
请注意,原始提交C仍在其中,并且仍在branch的尖端branch。我们从temp制作副本时就放弃了它,但branch仍然记得它。
现在,您可以孤立地测试您的更改了:没有,是否C'可以正常工作B?如果是这样,你在任何问题C通过的大概介绍B,因为C'VS A几乎是“同”为CVS B。
1这是一个实现细节,分支名称也可以使用多合一文件而不是每个文件存储,但是它应该使您了解真正便宜的分支。
2这是必要的,因为在创建提交时,它没有子级。一旦创建了提交,它便是永久不变的,因此无法记录其子级。它的孩子还不存在!但是,只要有一个孩子存在,该孩子就会有其父母,并且该孩子的父母也是永久不变的,因此该孩子可以而且确实在记录其父母。
HEAD~2和的说明HEAD~1每当您要在Git中标识特定提交时,都可以提供其原始SHA-1哈希。例如,您可以从git log输出中剪切并粘贴这些内容。但是,您也可以使用符号名称,例如分支名称或标记名称,或特殊名称HEAD。这些符号名称只是解析为提交ID:
$ git rev-parse HEAD
de2efebf7ce2b308ea77d8b06f971e935238cd2f
Run Code Online (Sandbox Code Playgroud)
可以缩写这些东西,所以face0ff还是cafebabe工作,如果实际的ID与开始。
您也可以使用相对名称,这是通过采用任何合适的名称并添加来形成的。因此,无论与此意思是一样的。该后缀表示“回去一定数目的父母”,和家长的数量回去是以后无论发生什么事。~numberHEAD~2de2efeb~2~~
由于HEAD始终是当前提交,因此HEAD~1意味着“返回一个父母”,并且HEAD~2意味着“返回两个父母”。从一开始C,回到一个父母会得到你B,回到两个父母会得到你A。
从而:
--onto HEAD~2
Run Code Online (Sandbox Code Playgroud)
表示“复制,以便我们在其后添加A”,而:
HEAD~1
Run Code Online (Sandbox Code Playgroud)
在这种情况下,意味着“不要复制commit B或更早的版本”,而只保留commit C。
| 归档时间: |
|
| 查看次数: |
143 次 |
| 最近记录: |