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

时间:2017-05-31 05:55:34

标签: git github version-control reset rebase

我试图摆脱提交,但不知道该怎么做。我读了很多关于git reset和git rebase但是仍然没有得到它。大多数人需要删除/恢复上次提交,而不是我想要做的。

为了更好地理解我想要做什么:我正在研究分支X,然后想将它合并到master。但我意识到在第5次提交时我添加了许多不是我的代码(它是框架)。它非常难以回顾X和master之间的变化。所以我检查第5次提交作为新的分支Y并想要摆脱4个先前的提交然后将它合并到master。这种方式当使用分支X创建pull请求时,希望第5次提交不会被视为更改,我就在这里吗?假设是的,我仍然需要删除那些没有历史记录的4次提交,以避免合并冲突。

因此,当在分支Y上输入git log时,我得到这样的结果:

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

如何删除提交A2-A5而不留下任何痕迹?我想要的是有道理的吗?

2 个答案:

答案 0 :(得分:1)

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

假设原始分支结构如下图所示,当branchX指向A1时,您创建了拉取请求,master分支指向E

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

然后找到创建branchX的父提交(在图中为提交C)。因此,您可以从提交branchY创建C,然后在其上挑选第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

现在,将branchX合并到master分支的拉取请求将比较版本FA1之间的更改(不会比较框架更改)。

答案 1 :(得分:0)

git reset HEAD~N

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

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

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

git rebase - i master

之后,我压扁所有提交但第一个。最后,我只有一个提交。我希望这能帮到你。