在推动之前将多个提交合并成一个

这个问题不仅涉及到如何完成这个任务,而且涉及到使用Git是好还是不好的做法。

考虑到本地我在主分支上做的大部分工作,但我已经创build了一个专题分支,我将称之为“topical_xFeature”。 在处理“topical_xFeature”并在主分支上来回切换做其他事情的过程中,我发现在“topical_xFeature”分支上做了多个提交,但是在每次提交之间,我做了no推。

首先 ,你会考虑这种不好的做法吗? 坚持一个分支每推一个提交不会更明智吗? 在什么情况下,在推送之前在分支上进行多次提交是很好的做法?

其次 ,我应该如何最好地将topical_xFeature分支上的多个提交引入主分支来进行推送? 不用担心这个问题,只是在多个提交被推送的地方进行推送,或者是不是很方便地将提交合并到一个提交然后推送,这是一件麻烦的事情? 再次,如何做到这一点?

对于第一个问题,不,一次推送多个提交没有任何问题。 很多时候,你可能想把你的工作分解成几个小的逻辑提交,但是只要你觉得整个系列已经准备好了,就只能把它推上去。 或者您可能在断开连接的情况下在本地进行了多次提交,并且在您重新连接后再将其全部推送。 没有理由限制自己每次推一次提交。

我通常会发现,保持每个提交一个单一的,逻辑的,连贯的变化是一个好主意,包括它需要的一切工作(所以,它不会让你的代码处于破碎的状态)。 如果您有两个提交,但是如果您只应用了第一个提交,则会导致代码被破坏,所以将第二个提交压缩到第一个提交可能是一个好主意。 但是如果你有两个提交,每个提交一个合理的改变,推动他们作为单独的提交是好的。

如果你想一起挤压几个提交,你可以使用git rebase -i 。 如果你在分支topical_xFeature ,你会运行git rebase -i master 。 这将打开一个编辑器窗口,其中列出了一系列提交前缀的提交。 你可以改变除第一个之外的所有内容,这将告诉Git保留所有这些改变,但是将它们压缩到第一次提交中。 完成之后,请查看master和mergefunction分支:

 git checkout topical_xFeature git rebase -i master git checkout master git merge topical_xFeature 

或者,如果您只想将topical_xFeature所有内容topical_xFeaturemaster ,则可以执行以下操作:

 git checkout master git merge --squash topical_xFeature git commit 

你select哪一个取决于你。 一般来说,我不会担心有多个较小的提交,但有时候你不想再多做一些小的提交,所以你只要将它们压缩成一个。

在我推送代码之前,这是我通常遵循的将多个提交合并成一个提交的方式。

为了达到这个目的,我build议你使用GIT提供的' squash '概念。

按照以下步骤。

1)git rebase -i

打开rebase交互式编辑器,在那里它会显示你所有的提交。 基本上,你需要确定你想合并成一个提交的提交。

想象一下,这些是你的提交,并在编辑器中显示。

 pick f7f3f6d changed my name a bit pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file 

需要注意的是,这些提交按照与通常使用log命令查看它们的顺序相反的顺序列出。意思是,较早的提交将首先显示。

2)将“挑选”更改为“压扁”最后承诺的更改。 如下所示。 这样做,你的最后2个提交将被合并到第一个。

 pick f7f3f6d changed my name a bit squash 310154e updated README formatting and added blame squash a5f4a0d added cat-file 

为了编辑使用“我”,它将使编辑器插入。

3)现在,用下面的命令保存编辑器:WQ

当你保存的时候,你有一个单一的提交,介绍了所有三个提交的变化。

希望对你有帮助..

首先 :没有任何东西告诉你每个分支每次只有一个提交:一个推送是一个发布机制,允许你发布一个远程回购的本地历史logging(即一组提交)。

第二git merge --no-ff topical_xFeature会在主git merge --no-ff topical_xFeaturelogging主服务器上的一个单独提交的主题。
(这样,你可以保留topical_xFeature进行进一步的演变,你可以在masterlogging下一个merge –no-ff的新提交。
如果摆脱topical_xFeature是目标,那么git merge --squash是正确的select,正如Brian Campbell的答案中所详述的那样)。

切换到主分支,并确保您是最新的。

 git checkout master 

git fetch这可能是必要的(取决于你的gitconfiguration)接收来源/主的更新

 git pull 

将function分支合并到主分支中。

 git merge feature_branch 

将主分支重置为原点状态。

 git reset origin/master 

Git现在将所有更改视为未分离的更改。 我们可以将这些更改添加为一个提交。 添加。 也会添加未跟踪的文件。

 git add --all git commit 

参考: https : //makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit