我有一个我知道很常见的工作流程:
但是我总是犯的错误——所有该死的时间! — 是为了 忘记初步步骤:
所以我最终根据我发生的任何随机分支创建了一个分支 当我执行步骤 1 时打开,这是错误的,并且未设置 我希望我的同事在执行第 5 步后审查合并,以及 当然没有设置我最终想要恢复的合并 掌握。今天直到第5步之后我才发现这个错误, 撤消这是一个巨大的麻烦。
所以我有两个问题:
对于问题 1,我怀疑规范的答案是
git rebase
。但我什至不再尝试使用它,部分原因是
这太难思考了,部分原因是它很少起作用
无论如何对我来说。 (我认为失败模式是它抱怨
关于附近任何其他未提交的文件 - 我总是
有这些。)所以我倾向于依靠 git show
或 git diff
其次是git apply
,总感觉有点低级
平淡无奇,但至少很容易思考,而且通常有效。
但是我缺少什么吗?还有其他的吗 易于思考、有保证的功能获取方式 树枝并用不同的祖先把它扔下来? (我知道 git filter-branch,但更难思考 关于。)
但是我的另一个问题是,有没有一些好的方法 一开始就回避问题?我正在想象一个警告 每当我尝试创建新分支时都可能会弹出 从 master 以外的其他东西(或某些每个工作树)分支出来 可配置的“默认”分支)。如果这个功能不存在, 我想我可以尝试添加它,因为它会节省我很多 浪费了时间。
您的情况是 git 工作流程中的常见问题,最好解决如何从中恢复以及如何在将来预防它。
挽救错误
首先,从预期的基础分支(例如 master)创建一个新分支。
git checkout master
git pull
git checkout -b new-feature-branch
接下来,使用
cherry-pick
将错误创建的分支中的提交应用到新分支。识别您在错误分支上所做的提交(您可以使用 git log
为此)并将它们应用到新分支。
git cherry-pick <commit-sha>
对您要传输的每个提交重复此操作。此方法比 rebase 更简单,并且避免了未提交文件的问题。
对于工作目录中任何未提交的更改,请在切换分支之前将其存储并将其应用到新分支中。
git stash
git checkout new-feature-branch
git stash pop
防止错误
如果您不在预期的基础分支上,您可以在 Git 中使用
pre-commit
或 pre-push
挂钩来警告您。这需要一些脚本编写。
以下是此脚本的基本示例:
#!/bin/sh
intended_base="master"
current_branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$current_branch" != "$intended_base" ]; then
echo "Warning: You are not on the $intended_base branch."
exit 1
fi
将此脚本放入存储库中的“.git/hooks/pre-commit”或“.git/hooks/pre-push”文件中,并使其可执行(
chmod +x .git/hooks/pre-commit
)。如果您不在主分支上,这将中止提交或推送。
养成在开始新工作之前检查当前分支(git 分支或 git 状态)的习惯。虽然这依赖于手动纪律,但这是一个很好的开发实践。