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

Is it possible to mark a git commit as work-in-progress?

我知道对于主分支上的所有提交是否应该使项目处于有效的工作状态存在各种意见和哲学。我不是征求这些意见。

为了争论起见,我们假设在 master 分支历史记录中的某处我确定了一个实际上是正在进行的提交的提交,即它没有构建或破坏了其他东西.由于我们正在讨论 master 分支中的历史记录,因此变基或修改(或任何实际更改提交的内容)不是一个选项。

为了警告其他开发人员并使自动 git 对分脚本更容易跳过此提交,我想以某种方式将此提交标记为正在进行的工作。我该怎么做?

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

使用 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 了解更多详情。

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

# 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 '{= ""; print [=10=]}'`
   lastCommitMessage=${lastCommitMessage:1:30}
   [ "$lastCommitMessage" = wip ] && git reset HEAD~1 || echo "#$lastCommitMessage#[...]" is not a wip commit
}

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

另一方面,为了在对话中引入良好实践,我想说的是,在 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 干净。

正如您所说,永远不要在共享分支上重写历史记录。这就是为什么你不想让自己处于这样的境地,这样的事情甚至可能会出现在你的脑海中。始终在重写历史无关紧要的专用分支上工作,并在共享分支上合并干净稳定的提交。 (:

我们可以在 2 种方法中将提交标记为 work-in-progress:

1st 你可以使用 UI.

第二种方法,使用命令:git push origin HEAD:refs/for/master%wip