有没有办法静默创建
提交像
A-B-C-D-E-F-G # master
\ \
X Y
在没有用户注意的情况下创建X
和Y
的位置。
推理:
我正在撰写大量探索性实验代码,并希望在运行实验时自动提交当前状态。这些中间状态不应该在我的Git历史中结束,我不想在经常运行之前经历提交的心理开销(或者偶尔忘记它)。
这个想法是有很多悬挂提交,不会被推送到我的遥控器,可能会被垃圾收集删除。每个单独的提交SHA1都将注释到我的实验结果,使我能够追溯哪些更改对结果产生了什么影响。
答案 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/master
,master
和dev
分支
我们需要两组代码。如果您不想一遍又一遍地执行此操作,我们可以将这些功能存储在.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都可以注释到您的实验结果,使您能够追溯每次运行代码时哪些更改对结果有什么影响。它还允许您(本地)对您的更改进行版本控制。