我试图摆脱提交,但不知道该怎么做。我读了很多关于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而不留下任何痕迹?我想要的是有道理的吗?
答案 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
分支的拉取请求将比较版本F
和A1
之间的更改(不会比较框架更改)。
答案 1 :(得分:0)
git reset HEAD~N
其中N是您要重置的提交数。在此操作之后,您将在工作目录文件中找到提交A1但没有提交的文件。
如果你add .
然后git commit
你有一个新的提交,旧的N提交将会丢失。
我更喜欢使用rebase。当我处理新功能时,我总是打开新分支。我每5/6分钟一次。当我完成任务时,如果我的分支必须合并到master
分支,我运行命令
git rebase - i master
之后,我压扁所有提交但第一个。最后,我只有一个提交。我希望这能帮到你。