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
指向 A1
、master
分支指向 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
现在你合并 branchX
到 master
分支的拉取请求将比较版本 F
和 A1
之间的变化(不会比较框架变化)。
我正在尝试摆脱提交,但不确定该怎么做。我读了很多关于 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
指向 A1
、master
分支指向 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
现在你合并 branchX
到 master
分支的拉取请求将比较版本 F
和 A1
之间的变化(不会比较框架变化)。