将一个提交分割为更小的提交,使用Git?

9 浏览
0 Comments

将一个提交分割为更小的提交,使用Git?

在将一个提交提交到本地仓库后,是否可以在不创建分支和进行一堆奇怪的工作的情况下,将一个提交拆分为几个不同的提交?

0
0 Comments

在使用Git时,有时候我们需要将一个大的提交拆分成多个小的提交。之前的答案已经介绍了使用git rebase -i命令来编辑要拆分的提交,并将其拆分为多个部分进行提交。这种方法适用于将文件拆分为不同提交的情况,但如果你想将对单个文件的更改拆分开来,还需要了解更多的知识。

当你通过rebase -i命令进入到要拆分的提交时,将其标记为edit,你有两个选择:

1. 使用git reset HEAD~命令,逐个使用git add -p命令选择每个提交中你想要的部分。

2. 编辑工作副本,删除你不想要的更改;提交该中间状态;然后拉回完整的提交进行下一轮操作。

第二个选项对于拆分大的提交非常有用,因为它允许你检查中间版本是否能够成功构建和运行。

在使用rebase -iedit编辑提交后,使用git reset --soft HEAD~命令撤销该提交,但保留已提交的文件在索引中。你也可以通过省略--soft参数来执行混合重置,这取决于你的初始提交与最终结果有多接近。唯一的区别是是否将所有更改都暂存或者都不暂存。

现在进入代码编辑。你可以删除更改、删除添加的文件,以及进行任何你想要构建所需的第一个提交的操作。你还可以构建并运行它,确认你拥有一套一致的源代码。

一旦满意,根据需要暂存/取消暂存文件(我喜欢使用git gui),通过UI或命令行提交更改。

第一个提交完成了。现在你想要将工作副本恢复到拆分提交之后的状态,以便在下一次提交中继续拆分更多的更改。要找到你正在编辑的提交的SHA1值,使用git status命令。在状态的前几行中,你将看到当前正在执行的rebase命令,其中可以找到你原始提交的SHA1值。

例如,我正在编辑的提交的SHA1值是65dfb6a。知道了这一点,我可以使用git checkout命令将该提交的内容检出到我的工作目录中:

git checkout 65dfb6a .

别忘了最后的点!

这将检出并暂存文件,就像它们在你正在编辑的提交之后一样,但相对于你之前进行的提交,所以你已经提交的任何更改都不会包含在该提交中。

现在你可以继续提交它来完成拆分,或者再次进行操作,在进行另一个中间提交之前删除某些部分的提交。

如果你想要重用一个或多个提交的原始提交消息,你可以直接从rebase的工作文件中使用它:

git commit --file .git/rebase-merge/message

最后,一旦你提交了所有的更改,使用git rebase --continue命令将继续并完成rebase操作。

感谢!这应该是被接受的答案。如果早些知道这个方法就可以节省我很多时间和痛苦了。这是唯一一个最终提交的结果与被编辑的提交处于相同状态的答案。

我喜欢你使用原始提交消息的方式。

使用第二个选项时,当我执行git checkout *我正在编辑的SHA* .命令时,它总是显示Updated 0 paths from *某个不在Git日志中的SHA*,并且没有任何更改。

0
0 Comments

如何使用Git将一个提交拆分为多个提交?

有时候我们可能会在一个提交中包含了太多的更改,或者我们想要对一个提交进行进一步的细分。在这种情况下,我们可以使用Git的一些工具来将一个提交拆分成多个较小的提交。本文将介绍如何使用git rebase -i命令来实现这个目标。

首先,我们需要确保当前的工作目录是干净的,即没有未提交的修改、删除或添加。可以使用git status命令来检查当前的工作状态。

接下来,我们需要决定要拆分的提交是哪个。下面分别介绍了两种情况下的拆分方法。

A) 拆分最近的提交

如果我们要拆分最近的提交,可以使用以下步骤:

1. 首先,使用命令git reset HEAD~来取消最近的提交。

2. 然后,按照通常的方式逐个提交需要拆分的部分,直到得到所需的所有提交。

B) 拆分较早的提交

如果我们要拆分较早的提交,需要使用git rebase -i命令来重写历史。具体操作如下:

1. 使用命令git rebase -i HEAD~n,其中n是要拆分的提交距离当前提交的步数。

2. 在编辑界面中,找到要拆分的提交并将其前面的pick替换为edit

3. 保存文件并退出编辑。Git会在所选提交之后停下来等待进一步的操作。

4. 使用git reset HEAD~命令来取消当前的提交。

5. 按照需要逐个提交需要拆分的部分,直到得到所需的所有提交。

6. 使用git rebase --continue命令来继续进行重写。

需要注意的是,拆分提交可能会导致一些冲突,需要手动解决这些冲突。此外,我们还可以使用git add -p命令来部分地添加文件的更改,并使用git stash命令将一些工作暂存起来。

总之,使用Git的git rebase -i命令可以有效地将一个提交拆分成多个较小的提交。通过选择适当的提交并进行合理的操作,我们可以更好地组织和管理我们的代码提交历史。

0
0 Comments

问题:如何使用Git将一个提交分解为多个较小的提交?

在Git的手册中,有一个名为"SPLITTING COMMITS"的章节介绍了如何使用交互式rebase来将一个提交分解为多个较小的提交。具体步骤如下:

1. 执行命令git rebase -i <commit>^,其中<commit>是要分解的提交。实际上,只要包含该提交的任何提交范围都可以。

2. 使用"edit"操作将要分解的提交标记为"edit"。

3. 当要编辑该提交时,执行命令git reset HEAD^。这个命令的效果是将HEAD回退一个提交,索引也随之变化,但是工作树保持不变。

4. 现在将要包含在第一个提交中的更改添加到索引中。可以使用git add(可能是交互式地)或者git gui(或者两者都可以)来完成这一步骤。

5. 使用适当的提交消息提交当前的索引。

6. 重复上述两个步骤,直到工作树干净为止。

7. 继续rebase操作,执行命令git rebase --continue

需要注意的是,在Windows上,需要使用~而不是^

关于提交消息的问题,当使用这种方法分解提交时,提交消息将会丢失。如果想要保留一部分或全部提交消息,可以在rebase之前复制一份消息,或者在需要时通过reflog找回。只有在2周后或者其他时间通过垃圾回收清理时,提交消息才会被真正删除。

如果使用的是PowerShell,需要使用HEAD`^来转义符号^。如果使用cmd.exe,可以使用HEAD^^来转义。在大多数(或者全部)shell中,可以使用引号包围,例如"HEAD^"

如果想要恢复提交消息,可以使用git reflog命令或者git log <sha>命令。

另外,还有一些其他的解决方法,例如使用git commit --reuse-message=abcd123命令来重用消息,或者使用git commit --reedit-message=<commit>命令来修改消息。

上述是使用Git将一个提交分解为多个较小的提交的解决方法。这种方法可以通过交互式rebase来实现,具体步骤包括标记要分解的提交、重置HEAD、添加更改到索引、提交索引等。同时,还介绍了一些其他的解决方法,例如通过reflog找回提交消息,或者使用特定命令来重用消息或修改消息。

0