如果中间有其他提交,如何将所有git提交合并为一个提交?

时间:2016-12-16 09:01:33

标签: git

如果我的日志之间还有其他提交,如何将我的所有提交组合成一个git哈希?,

e.g

asdadf = mine
sdffdf = other dev
34234a = another dev
asdfaf = other dev
23423a = mine
a23232 = another dev
asdfsd = other
adsf23 = mine
asdfa= = anotherdev
23423a = anotherdev

我想在一次提交中合并我的所有内容?如果在我之间有其他提交,如何做到这一点,因为 我担心来自其他人的其他承诺可能已经建立在我的上面......

2 个答案:

答案 0 :(得分:1)

如果你还没有在远程分支上推送提交,你可以使用rebase和cherry-picking的组合。

为了做到这一点,你必须重写提交历史。

这样做的一种方法是从历史开始创建另一个分支。

git branch my_branch <first-commit>

Cherry-pick the commits

git cherry-pick <commit-A> <commit-B> ...

然后使用交互式rebase来压缩提交

git rebase -i <after-this-commit>

最后将分支重新集成到当前分支中。

答案 1 :(得分:1)

你可以使用git rebase --interactive来做,但是,在你开始之前,请注意你的行动的负面影响。

你打算改写历史; 本身这不是一件坏事,但它可能会影响在同一个项目上工作的其他开发人员。如果执行此操作然后将更改推送到中央存储库,则会为分支创建新的历史记录。

在您的回购和中央回购中,这个新历史取代了您在问题中描述的那个。但是其他开发人员的存储库并不知道替换,他们认为你的分支(具有新的历史)只是代码的一个分支,与他们所知道的历史不同。当其他开发人员尝试提取更改时,他们最终会发生合并提交,并可能发生冲突。

只有当所有其他开发人员都知道您想要做什么时,他们才能安全地执行此操作,他们不会在完成操作之前推送他们的更改,然后他们会在他们继续工作之前正确更新他们的存储库。

警告足够了,让我们看看你怎么做。

首先,确保您的仓​​库处于干净状态。使用git status了解相关信息。如果它不干净,则在继续之前提交或存储您的更改。

开始修改历史记录的命令是:

git rebase --interactive asdfa

git rebase命令的参数是最后一次提交的哈希(或其他识别方式),这是正常的,不需要更改。我从你的描述中选择了最后一次开发提交的哈希值。

当你运行上面的命令时,Git会打开你为它配置的编辑器(当你运行git commit时它会打开它),文件看起来像这样:

pick adsf23 commit message #n
pick sdffdf commit message #2
...
pick asdadf commit message #1


# Rebase asdfa..asdadf onto asdfa (8 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
... more lines follow here ...

该文件有两个部分:第一部分,以pick开头的行包含要重新设置的提交列表以及要对其执行操作的操作。第二部分是注释(每行以#开头)并包含有关操作的说明。阅读它们,让它们独自一人。

提交按其时间顺序列出。第一个是最老的,最后一个是最新的。

重新排序提交行,将您的行放在列表的末尾。然后,除了第一次提交之外,请将pick替换为squash。不要改变任何其他东西。不要删除行。如果删除提交行,则会从历史记录中删除相应的提交。你可能不希望发生这种情况。

保存文件并退出编辑器。退出编辑器时,Git会使用您在文件中提供的说明开始重新提交提交。它在历史记录中返回到命令行中提供的修订版,然后逐个应用更改,如文件中所述。它首先应用其他开发者的提交(因为squash)它将所有提交合并为一个提交并应用它。

有可能在操作期间,Git遇到冲突,因为您的提交引入了与其他开发人员的提交重叠的更改。在这种情况下,Git停止,屏幕显示它停止的原因(有冲突的文件)和指示如何继续。

如果可以解决冲突,您可以继续(但可能会在后续提交中产生更多冲突)。

如果您遇到太多冲突并且无法解决冲突,您可以随时使用以下命令中止rebase:

git rebase --abort

这会使您的存储库恢复到启动时的状态。

如果您的rebase成功完成并将其推送到中央仓库,请告知其他开发人员:

git fetch origin
git rebase origin/master

在他们的存储库上,以便正确获取新历史记录。