这个问题不仅涉及如何完成这项任务,还涉及使用Git这样做是好还是坏.
考虑到本地我在master分支上工作最多,但我创建了一个我称之为"topical_xFeature"的主题分支.在处理"topical_xFeature"并在主分支上来回切换的过程中,事实证明我在"topical_xFeature"分支上进行了多次提交,但在每次提交之间,我没有做过推.
首先,你会考虑这种不良做法吗?每次推送每个分支坚持一次提交是不是更明智?在什么情况下,在推送之前在分支上进行多次提交会很好?
其次,如何才能最好地将topical_xFeature分支上的多个提交引入主分支以进行推送?不担心它并且只是推动多个提交被推送的推动是否是令人讨厌的,或者以某种方式将提交合并为一个然后推送不那么烦人?再说一遍,怎么做?
Bri*_*ell 131
对于你的第一个问题,不,一次推送多个提交没有错.很多时候,您可能希望将您的工作分解为一些小的逻辑提交,但只有在您觉得整个系列准备就绪时才会将它们推迟.或者您可能在断开连接时在本地进行多次提交,并在再次连接后将它们全部推送.没有理由限制每次推送一次提交.
我通常发现,保持每个提交都是单一的,逻辑的,连贯的更改,包括它需要工作的所有内容(因此,它不会使您的代码处于损坏状态)是一个好主意.如果你有两个提交,但如果你只应用第一个提交会导致代码被破坏,那么将第二个提交压缩到第一个提交可能是个好主意.但是如果你有两个提交,每个提交做出一个合理的改变,推动它们作为单独的提交是好的.
如果你想要将几个提交压缩在一起,你可以使用git rebase -i
.如果你在分支机构topical_xFeature
,你会跑git rebase -i master
.这将打开一个编辑器窗口,其中列出了一堆前缀的提交pick
.您可以更改除第一个之外的所有内容squash
,这将告诉Git保留所有这些更改,但将它们压缩到第一个提交中.完成后,检查master
并合并您的功能分支:
git checkout topical_xFeature
git rebase -i master
git checkout master
git merge topical_xFeature
Run Code Online (Sandbox Code Playgroud)
或者,如果您只想将所有内容topical_xFeature
压入master
,您可以执行以下操作:
git checkout master
git merge --squash topical_xFeature
git commit
Run Code Online (Sandbox Code Playgroud)
你选择哪一个取决于你.一般来说,我不担心有多个较小的提交,但有时你不想打扰额外的小提交,所以你只需将它们压缩成一个.
Kon*_*aka 62
这是我在推送代码之前将多个Commits组合成单个提交的方式.
为实现这一目标,我建议您使用GIT提供的" 壁球 "概念.
请按照以下步骤操作.
1)git rebase -i master(而不是master,你也可以使用特定的提交)
打开rebase交互式编辑器,它将显示所有提交.基本上,您需要在哪里标识要合并到单个提交中的提交.
想象一下这些是你的提交,并在编辑器中显示这样的东西.
pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file
Run Code Online (Sandbox Code Playgroud)
请务必注意,这些提交的顺序与您通常使用log命令看到的顺序相反.意味着,旧的提交将首先显示.
2)将'pick'更改为'squash'以进行上次提交的更改.如下所示的东西.这样做,您的最后2次提交将与第一次合并.
pick f7f3f6d changed my name a bit
squash 310154e updated README formatting and added blame
squash a5f4a0d added cat-file
Run Code Online (Sandbox Code Playgroud)
如果你有很多提交需要合并,你也可以使用简短形式:
p f7f3f6d changed my name a bit
s 310154e updated README formatting and added blame
s a5f4a0d added cat-file
Run Code Online (Sandbox Code Playgroud)
对于编辑使用'i',它将使编辑器能够插入.请记住,最先(最旧)的提交不能被压扁,因为之前没有提交要提交.所以必须选择或'p'.使用'Esc'退出插入模式.
3)现在,使用以下命令保存编辑器. :WQ
保存时,您只需一次提交即可引入所有三次提交的更改.
希望这会帮助你.
Von*_*onC 11
第一:没有什么告诉你每次推送每个分支只有一个提交:推送是一种发布机制,允许您在远程仓库上发布本地历史记录(即提交集合).
第二:git merge --no-ff topical_xFeature
在推送之前,a 会记录master作为单个提交主题的工作master
.
(这样,你可以继续topical_xFeature
进行进一步的演变,你可以master
在下一次合并时作为一个新的提交记录--no-ff.
如果摆脱topical_xFeature
是目标,那么这git merge --squash
是正确的选择,详见Brian Campbell的答案.)
首先选择你想要的所有提交。
git reflog
5976f2b HEAD@{0}: commit: Fix conflicts
80e85a1 HEAD@{1}: commit: Add feature
b860ddb HEAD@{2}: commit: Add something
Run Code Online (Sandbox Code Playgroud)重置为您选择的头部(我已选择HEAD@{2}
)
git reset b860ddb --soft
Run Code Online (Sandbox Code Playgroud)git status
(只是要确定)
添加您的新提交
git commit -m "Add new commit"
Run Code Online (Sandbox Code Playgroud)注意:HEAD@{0}
&HEAD@{1}
现在合并为 1 个提交,这也可以用于多个提交。
git reflog
再次应显示:
git reflog
5976f2b HEAD@{0}: commit: Add new commit
b860ddb HEAD@{1}: commit: Add something
Run Code Online (Sandbox Code Playgroud)
切换到主分支并确保您是最新的.
git checkout master
Run Code Online (Sandbox Code Playgroud)
git fetch
这可能是必要的(取决于你的git配置)来接收origin/master的更新
git pull
Run Code Online (Sandbox Code Playgroud)
将功能分支合并到主分支中.
git merge feature_branch
Run Code Online (Sandbox Code Playgroud)
将主分支重置为原始状态.
git reset origin/master
Run Code Online (Sandbox Code Playgroud)
Git现在将所有更改视为未分级更改.我们可以将这些更改添加为一次提交.添加.还会添加未跟踪的文件.
git add --all
git commit
Run Code Online (Sandbox Code Playgroud)
参考:https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit