在推送之前将多个提交组合成一个

Tod*_*son 121 git workflow

这个问题不仅涉及如何完成这项任务,还涉及使用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)

你选择哪一个取决于你.一般来说,我不担心有多个较小的提交,但有时你不想打扰额外的小提交,所以你只需将它们压缩成一个.

  • @balki因为Git根据它们是否出现在给定分支的历史记录中来检测补丁是否合并.压扁提交会改变它们; 它们成为一个新的提交,虽然新提交恰好与其他提交做同样的事情,Git无法分辨,它只能告诉提交是否相同,如果它们具有相同的提交ID(SHA-1) .因此,一旦你压缩它,你需要告诉git用`git branch -D topic`删除旧分支以强制删除它. (7认同)
  • 在与 --squash 合并后,我无法使用“gitbranch -d topic”删除主题分支。为什么 git 无法识别所有更改都已合并? (2认同)

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

保存时,您只需一次提交即可引入所有三次提交的更改.

希望这会帮助你.

  • 也许这对其他人来说是显而易见的,但是当你说"git rebase -i"时,你还需要指定你从哪个提交开始.当我尝试按照这个例子时,这是我没有意识到的.所以,在这个例子中,它是"git rebase -i xxxxx",其中xxxxx是按时间顺序在f7f3f6d之前的提交.一旦我弄明白,一切都完全如上所述. (4认同)

Von*_*onC 11

第一:没有什么告诉你每次推送每个分支只有一个提交:推送是一种发布机制,允许您在远程仓库上发布本地历史记录(即提交集合).

第二:git merge --no-ff topical_xFeature在推送之前,a 会记录master作为单个提交主题的工作master.
(这样,你可以继续topical_xFeature进行进一步的演变,你可以master在下一次合并时作为一个新的提交记录--no-ff.
如果摆脱topical_xFeature是目标,那么这git merge --squash是正确的选择,详见Brian Campbell答案.)


Edd*_*ofo 9

  1. 首先选择你想要的所有提交。

    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)
  2. 重置为您选择的头部(我已选择HEAD@{2}

    git reset b860ddb --soft
    
    Run Code Online (Sandbox Code Playgroud)
  3. git status (只是要确定)

  4. 添加您的新提交

    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)


shi*_*mar 8

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

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

  • 这个答案很容易理解,很容易想象. (3认同)