git reset or rebase - 删除过去的提交

git reset or rebase - remove commits from past

我正在尝试摆脱提交,但不确定该怎么做。我读了很多关于 git reset 和 git rebase 的文章,但还是不明白。大多数人需要 delete/revert 最后一次提交,而这不是我想要做的。

为了更好地理解我想做什么:我在分支 X 上工作,然后想将它合并到 master。但是我意识到在第 5 次提交时我添加了很多不是我的代码(它是框架)。这使得审查 X 和 master 之间的变化变得非常困难。因此,我将第 5 次提交签出为新分支 Y,并希望摆脱之前的 4 次提交,然后将其合并到 master。这样,当使用分支 X 创建拉取请求时,希望第 5 次提交不会被视为更改,我就在这里吗?假设是,我仍然需要删除这 4 个提交,不留下任何历史记录,以免发生合并冲突。

所以当键入 git 登录分支 Y 时,我得到如下信息:

git log 
commit: A1
commit: A2 
commit: A3
commit: A4
commit: A5

如何删除提交 A2-A5 而不留下任何痕迹?我想说的有意义吗?

git reset HEAD~N

其中 N 是您要重置的提交数。在这个操作之后,你会在你的工作目录文件中找到你在提交 A1 中的文件,但没有你的提交。

如果你 add . 然后 git commit 你有一个新的提交,旧的 N 提交将丢失。

我更喜欢使用变基。当我处理新功能时,我总是打开新分支。我每 5/6 分钟承诺一次。当我完成任务时,如果我的分支必须合并到master分支我运行命令

git rebase - i master

在那之后,我压缩了除第一个之外的所有提交。最后,我只有一个提交。希望对你有帮助。

您似乎只想使用提交 A1 创建 branchY,然后在拉取请求合并分支到 master 完成之前将其合并到 master。您可以使用以下方式:

假设原始分支结构如下图所示,并且您在 branchX 指向 A1master 分支指向 E 时创建了拉取请求。

A---B---C---D---E                master
         \
          A5---A4---A3---A2---A1 branchX

然后找到创建了 branchX 的父提交(如图中的提交 C)。因此,您可以从提交 C 创建 branchY,然后在其上挑选第 5 次提交(A1):

git checkout -b branchY <commit id for C>
git cherry-pick <commit id for A1>

那么提交历史将如下所示:

            A1'                    branchY
          /
 A---B---C---D---E                 master
          \
            A5---A4---A3---A2---A1 branchX

最后你可以将 branchY 合并到 master:

git checkout master
git merge branchY
git push origin master

master 分支上的合并提交如下图 F 所示:

           __ A1'___               branchY
          /         \
 A---B---C---D---E---F             master
          \
            A5---A4---A3---A2---A1 branchX

现在你合并 branchXmaster 分支的拉取请求将比较版本 FA1 之间的变化(不会比较框架变化)。