是否可以将git提交标记为正在进行的工作?

时间:2016-01-18 10:31:21

标签: git version-control git-tag git-bisect

我知道关于主分支上的所有提交是否应该使项目处于有效的工作状态存在各种观点和理念。我不是要求这些意见。

为了论证,让我们假设master分支历史中的某个地方我确定了一个实际上是正在进行的提交的提交,即它没有构建或它破坏了其他的东西。由于我们在主分支中讨论历史,因此不能选择重新定位或修改(或实际更改提交的任何内容)。

警告其他开发人员并让自动git bisect脚本轻松跳过此提交,我想以某种方式将此提交标记为正在进行中。我该怎么做?

我考虑过使用git tag,但由于代码必须是唯一的,因此您最终会使用像wip/<some_unique_id>这样的标签,这在我看来是一个丑陋的黑客。另外,从概念上讲,我们不希望将此提交视为标记提交,即我们可能永远不想检查它,我们可能不希望它出现在标记提交点列表等中。

3 个答案:

答案 0 :(得分:8)

使用git notes为某些提交添加备注而不触及其提交哈希值。

如果您想用注释注释HEAD~5,请执行

git notes add HEAD~5 -m "better don't use this commit. It breaks the build"

发布笔记
git push origin refs/notes/*

阅读ProGit了解更多详情。

答案 1 :(得分:0)

我从未听说过这样的功能,所以我创建了它:

# Commit current work as wip so that I can switch branch
function gitwip {
    git add -A && git commit -m wip
}

# Reset last commit if it is a work in progress
function gitrwip {
   lastCommitMessage=`git log --oneline -n1 | awk '{$1= ""; print $0}'`
   lastCommitMessage=${lastCommitMessage:1:30}
   [ "$lastCommitMessage" = wip ] && git reset HEAD~1 || echo "#$lastCommitMessage#[...]" is not a wip commit
}

如果最后一次提交不是gitwip提交,则git reset HEAD~1函数会阻止我执行wip

答案 2 :(得分:0)

另一方面,只是为了给对话带来好的做法,我想说的是,在master上,你不能改变或修改所描述的情况永远不会发生。在共享分支上合并的每个提交(masterdevelop,无论如何)应始终保持稳定。我没有看到任何理由解释为什么WIP提交不能在专用分支上。

在一种更好的方法中,您可以,例如:

git checkout -b hotfix-branch
git add .
git commit -m "[wip] Fixing index route access"
git push origin wip-branch

然后,完成工作后:

git commit --amend  # Let's reword to "[hotfix] Fixed index route access"
git push origin hotfix-branch --force
git checkout master
git merge hotfix-branch  # Fast-forward or not, etc., whatever
git push origin master
git push --delete origin hotfix-branch
git branch -d hotfix-branch

在这个示例中(肯定可以改进,但不是重点),如果需要,amend可以被某些fixup / autosquash替换,但是你得到了这幅画。关键是要在专用分支上工作,使用Git通过WIP提交来保存不稳定状态,然后在合并到共享分支之前重写历史记录以保持git log清洁。

正如你所说,永远不应该在共享分支上重写历史记录。这就是为什么你不想把自己置于甚至可能出现这种情况的情况。始终在重写历史无关紧要的专用分支上工作,并在共享分支上合并干净和稳定的提交。 (: