无需签出即可创建悬空提交

时间:2016-07-27 15:30:44

标签: git

有没有办法静默创建

提交
  • 未连接到当前分支
  • 之后没有签出

A-B-C-D-E-F-G   # master
       \   \
        X   Y

在没有用户注意的情况下创建XY的位置。

推理:

我正在撰写大量探索性实验代码,并希望在运行实验时自动提交当前状态。这些中间状态不应该在我的Git历史中结束,我不想在经常运行之前经历提交的心理开销(或者偶尔忘记它)。

这个想法是有很多悬挂提交,不会被推送到我的遥控器,可能会被垃圾收集删除。每个单独的提交SHA1都将注释到我的实验结果,使我能够追溯哪些更改对结果产生了什么影响。

4 个答案:

答案 0 :(得分:3)

您可以使用git commit-tree命令创建悬空提交。

首先,暂存您要提交的文件,例如,执行git add file

接下来,从索引创建一个树。

git write-tree

这将打印到stdout的哈希值。这是您要提交的树的哈希值。假设哈希是12345678

现在您有了索引树,您可以取消更改这些更改,这样您就不会错误地将它们“真实地”提交。 (git reset HEAD file。)

最后,从该树创建一个提交。

git commit-tree 12345678 -p HEAD -m "Description"

这会创建一个新提交并将其哈希打印到stdout。提交的父级为HEAD,评论为Description

提醒一下,这是一个悬挂的提交,因此将受GC影响。

答案 1 :(得分:2)

如果你这样做

$ git commit -m 'Foo'
[my_branch b54ed59] Foo
$ git reset --hard HEAD^

你会发现你重置的提交没有消失,但仍然存在,所以你可以做

git checkout b54ed59

然后回到那个提交,悬挂你的分支。

标记提交将允许您永久保留它。

答案 2 :(得分:2)

比我在另一个答案中建议的git commit-tree更简单的方法是创建一个分离的头并提交到它。

git checkout HEAD^{commit}

这使您保持相同的提交,但您现在已从分支中分离,因此任何将来的提交都不会更新分支。提交您的更改,然后检查原始分支,让您的提交悬空。

答案 3 :(得分:0)

保持历史:

我会给你一个答案来实现你的目标,但心态不同于你的要求。虽然你可以通过在reflog中浮动提交来解决问题,但我们并没有这样做。

您将对一个分支进行一系列提交。您关心每个提交,因为您需要从测试中引用它们。在你有一个工作分支,并且你想与远程共享​​你的工作后,我们将改变我们的历史。

假设:

您有origin/mastermasterdev分支

如何:

我们需要两组代码。如果您不想一遍又一遍地执行此操作,我们可以将这些功能存储在.bashrc中。每次运行代码时,您都会调用自动提交并运行代码的函数。

1)每次运行代码时都会提交:

git add --all
git commit --allow-empty-message -m '' 
<command for running code>

现在每次运行都会有SHA1,您将获得开发历史记录(本地)。要显示每个提交的作用,您可以执行git log --patch以显示每个提交的行更改。

接下来,我们将在与远程共享​​之前更改历史记录。我们会将您的所有更改压缩为一次提交。

2)与远程分享您的工作:

git checkout master
git merge --squash dev
git commit -m "<commit message for dev history>"
#fetch & push to origin/master after dealing with any remote issues.

这将获取每个微小提交的所有补丁,并将它们全部合并到一个补丁中,其中包含一个SHA1和一个消息。

此时,您可以使用新的历史记录git branch -f dev强制更新您的dev分支,然后垃圾回收可以接受您已被压缩的提交。

结论

这样就完成了处理许多提交的目标,这些提交不会被推送到您的远程,并且可能会被垃圾收集删除(完成后)。每个单独的提交SHA1都可以注释到您的实验结果,使您能够追溯每次运行代码时哪些更改对结果有什么影响。它还允许您(本地)对您的更改进行版本控制。