在推送到主机之前清理Git分支

在推送到主机之前清理Git分支,git,branching-and-merging,Git,Branching And Merging,下面是我的开发分支上的简化提交状态 7f75hsyfr - changes to file1 file1 94dfsrg43 - more changes to file2 file2 92d7a513 - changes to file3 file3 035a72fd - Merge branch 'master' into dev 35bcc341 - Merge branch 'master' into dev 2e05a2fc - changes to file2

下面是我的开发分支上的简化提交状态

7f75hsyfr - changes to file1
    file1
94dfsrg43 - more changes to file2
    file2
92d7a513 - changes to file3
    file3
035a72fd - Merge branch 'master' into dev
35bcc341 - Merge branch 'master' into dev
2e05a2fc - changes to file2
    file2
60c9daaf - changes to file1
    file1

因为我在分支之间切换,所以我正在提交未完成的工作,这导致了与相同文件相关的多个提交。还存在合并来自主服务器的更改的合并提交。在推到主分支之前,我如何清理东西?理想情况下,我希望重新组织此操作,以便每个文件1文件2都有一个提交。我不认为有什么特别的原因要这样做-通常您会保持所有提交的完整性。但是,如果您想这样做,您可以创建一个补丁文件,并将其应用到主机上。我通常使用gitk来创建补丁,因为它可以很容易地选择开始和结束,但是也有一个命令来完成这项工作

编辑:

命令行解决方案类似于:

git checkout <branch>
git format-patch master --stdout > ../blahblah.patch
git checkout master
git apply ../blahblah.patch
git add .
git commit . -m"apply changes from branch"
git签出
git格式修补程序主控程序--stdout>。/blahblah.patch
切换到主分支
git apply../blahblah.patch
git添加。
git提交-m“从分支应用更改”

这将把来自分支的所有更改放在一个提交中,但是您可以选择提交并根据自己的选择绑定它们。

我认为这样做没有什么特别的原因-通常您会保持所有提交完好无损。但是,如果您想这样做,您可以创建一个补丁文件,并将其应用到主机上。我通常使用gitk来创建补丁,因为它可以很容易地选择开始和结束,但是也有一个命令来完成这项工作

编辑:

命令行解决方案类似于:

git checkout <branch>
git format-patch master --stdout > ../blahblah.patch
git checkout master
git apply ../blahblah.patch
git add .
git commit . -m"apply changes from branch"
git签出
git格式修补程序主控程序--stdout>。/blahblah.patch
切换到主分支
git apply../blahblah.patch
git添加。
git提交-m“从分支应用更改”

这将把来自分支的所有更改放在一个提交中,但是您可以选择提交并根据自己的选择绑定它们。

您需要使用
git-rebase-i
命令。检查
git-rebase
的文档。您可以将您的提交压缩为一个提交、重写、重新排序,并在推到master之前进行任何类型的清理。
既然您提到了合并提交,我建议您运行
git config--global pull.rebase true
,这将确保将来无论何时从远程分支进行拉取,您的提交都将在本地分支的头更新后重新应用。这意味着,在提交之间不会出现合并提交。在恢复更改时,将其与
git-rebase
结合使用会非常有帮助。

您需要
git-rebase-i
命令。检查
git-rebase
的文档。您可以将您的提交压缩为一个提交、重写、重新排序,并在推到master之前进行任何类型的清理。 既然您提到了合并提交,我建议您运行
git config--global pull.rebase true
,这将确保将来无论何时从远程分支进行拉取,您的提交都将在本地分支的头更新后重新应用。这意味着,在提交之间不会出现合并提交。在恢复更改时,它还可以使事情变得简单,并将其与
git-rebase
相结合,这对恢复更改非常有帮助。

如果您没有合并提交,您可以简单地使用一个交互式重基,如中所指出的

您也可以通过简单地在master上重定或挑选分支特有的提交来摆脱合并提交,因为代码的最终状态将相当于完成了合并

要清理分支,以下解决方案将结合重定基址和樱桃拾取提交以删除合并提交,然后交互重定基址以挤压其他提交

在Master上重新设置基础并选择樱桃色 我们将创建一个临时分支,以保持
dev
的当前状态,然后在
master
master
合并之前,将
dev
的部分重新设置基础,这相当于首先合并了
master

#创建临时分支以保存开发的当前状态
git分支临时开发
#在合并之前暂时将开发重置为状态
git复位——硬2e05a2fc
#将dev重设为master
git重基主控器
接下来,从
temp
中选择剩余的提交。我们将使用提交范围,其中范围的开头是独占的(即,实际上不包括):

git cherry pick 035a72fd..7f75hsyfr
使用交互式重基压缩提交 现在,您已经准备好使用交互式重基挤压提交。在示例中查找与
60c9daaf
对应的重写提交。让我们调用commit
X
。然后

git rebase -i X^
X^
表示基础的提交,实际上不会更改。但是,每个子体提交都不会按从最早到最新的顺序出现在交互式基础编辑器中:

pick X  changes to file1
pick Y  changes to file2
pick Z  changes to file3
pick AA more changes to file2
pick AB changes to file1
对提交进行重新排序,以使更改文件的提交相邻

pick X  changes to file1
pick AB changes to file1
pick Y  changes to file2
pick AA more changes to file2
pick Z  changes to file3
然后将
squash
s
添加到要压缩到上一个提交中的每个提交:

pick X  changes to file1
squash AB changes to file1
pick Y  changes to file2
squash AA more changes to file2
pick Z  changes to file3
完成后,保存并退出编辑器,重新基础将继续,除非存在冲突,在这种情况下,您需要解决每个冲突并继续重新基础

验证结果 现在,您需要验证您的结果,以确保所做的更改仍然与开始进行修改之前分支的状态相同:

git diff temp
如果没有输出,则分支的最终状态与开始修改它之前相同,因此现在可以使用
git branch-D temp
删除
temp

另见
简短的回答 如果你没有