能否将git提交标记为“正在进行中”?

12

我知道关于是否所有提交到主分支的代码都应该保持有效、可工作状态有各种不同的意见和哲学。但我不是来询问这些意见的。

为了论证,让我们假设在 master 分支的历史记录中,我找到了一个实际上是进行中的提交(work-in-progress commit),也就是说,它没有构建成功或导致其他问题出现。既然我们在讨论主分支的历史记录,那么变基、修改(或任何实际更改提交的方式)都不是选项。

为了警告其他开发人员,并使自动化的 Git 二分脚本跳过此提交,我想以某种方式标记此提交为进行中的工作。我该怎么做呢?

我考虑过使用 git tag,但由于标签必须是唯一的,因此最终会使用像 wip/<some_unique_id> 这样的标签,我认为这是一种丑陋的 hack。而且,从概念上讲,我们不希望将此提交视为已标记的提交,即我们可能永远不想检出它,也可能不希望它出现在标记的提交点列表中等等。

4个回答

14
使用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/*

Have a read of ProGit for more details.


3
另一方面,为了提高实践水平,我想说,如果你在master分支上不能进行rebase或amend操作的情况应该永远不会发生。在共享分支(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 的清晰。
正如你所说,一个人永远不应该在共享分支上重写历史记录。这就是为什么你不想让自己处于可能会产生这种想法的境地。总是在专用分支上工作,这样重写历史记录就无关紧要,并将干净和稳定的提交合并到共享分支上。(:

2
-1. 这并没有回答问题。OP的问题假设在主分支上有一个wip-commit。即使您对此完全正确,说这不应该发生是没有帮助的。 - mr_georg
1
正如我在第一句话中所说,我只是在谈论良好的实践,提供了一种针对有偏见问题的替代方法。但你说得对,这并不是一个直接回答问题的答案,它本应该是一条评论。我的错。(: - Scolopendre

1

我之前从未听说过这种功能,所以我创建了它:

# 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操作。


这些代码应该放在哪里?gitrwip是什么? - Rudey
@RuudLenders 这是一个bash函数。您可以将其放在提示符后面的终端中。如果您希望该函数每次使用终端登录时都存在,则必须将其放入.bashrc文件中(如果您正在使用bash)。 - Moebius

0
我们可以用两种方法将提交标记为工作正在进行中:
第一种方法是使用用户界面。
第二种方法是使用命令:git push origin HEAD:refs/for/master%wip

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接