在推动之前将多个提交合并成一个
这个问题不仅涉及到如何完成这个任务,而且涉及到使用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_xFeature
到master
,则可以执行以下操作:
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_xFeature
logging主服务器上的一个单独提交的主题。
(这样,你可以保留topical_xFeature
进行进一步的演变,你可以在master
logging下一个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