我如何将最后的N承诺集成到一个承诺中?
当前回答
感谢这个有用的博客帖子,我发现你可以使用这个命令来破坏过去的3个任务:
git rebase -i HEAD~3
显示的文档是相当清晰的. 在任何指定线上,您可以将命令从选择到您选择的命令更改。
我做的第一件事是纠正错误,并在评论中做出新的承诺,把这一点推到我的新功能中。
接下来,我将包含修复(fe7f1e0)的承诺移动到属性承诺下方,并将选择转换为修复。
这在所有承诺都是本地的时工作得很好,但如果你试图改变已经推到远程的承诺,你真的可能会给那些已经检查过同一个分支的其他骗子带来问题!
其他回答
基于这篇文章,我发现这个方法对我的使用更容易。
我的“dev”分支在“起源/dev”前面有96个承诺(因此这些承诺尚未推到远程)。
我宁愿将分支重新设置为“起源/dev”状态(这将使96个分支的所有变更无效),然后立即进行变更:
git reset origin/dev
git add --all
git commit -m 'my commit message'
这是超级可爱的,但在某种寒冷的方式,所以我只会把它推到戒指中:
GIT_EDITOR='f() { if [ "$(basename $1)" = "git-rebase-todo" ]; then sed -i "2,\$s/pick/squash/" $1; else vim $1; fi }; f' git rebase -i foo~5 foo
翻译:为 git 提供一个新的“编辑器”,如果要编辑的字体名称是 git-rebase-todo(互动的 rebase prompt) 会改变所有,但第一个“点”到“squash”,否则 spawns vim - 这样,当你被要求编辑破碎的承诺消息时,你会得到 vim。
也许我会做马克·隆加尔所建议的事情。
Anomies 答案很好,但我对此感到不安全,所以我决定添加几张屏幕截图。
步骤 0: git log
查看你在哪里与 git log. 最重要的是,找到第一个 commit 的 commit hash 你不想 squash。
此分類上一篇
步骤一:转动
在我的案例中,执行 git rebase -i(你的哈希):
$ git rebase -i 2d23ea524936e612fae1ac63c95b705db44d937d
步骤2:选择 / 切割你想要的东西
在我的情况下,我想把所有的承诺,这是第一次在时间上。 订单是从第一到最后,所以正如在 git log。 在我的情况下,我想:
此分類上一篇
步骤 3: 调整消息(s)
如果您只选出一个承诺,并解除其余的承诺,您可以调整一个承诺消息:
此分類上一篇
一旦你保存这个(:wq),你已经完成了。
只需将此 bash 函数添加到.zshrc 文件的 bash。
# Squash last X commits with a Commit message.
# Usage: squash X 'COMMIT_MSG'
# where X= Number of last commits.
# where COMMIT_MSG= New commit msg.
function squash() {
if [ -z "${1}" -o -z "${2}" ]; then
echo "Usage: \`squash X COMMIT_MSG\`"
echo "X= Number of last commits."
echo "COMMIT_MSG= New commit msg."
return 1
fi
git reset --soft HEAD~"$1"
git add . && git ci -m "$2" # With 100 emoji
git push --force
}
然后跑
squash X 'New Commit Message'
你已经完成了。
程序1
(一)定义承诺短暂的哈希
# git log --pretty=oneline --abbrev-commit
abcd1234 Update to Fix for issue B
cdababcd Fix issue B
deab3412 Fix issue A
....
在这里,即使是 git log --oneline 也可以用来获得短暂的 hash。
# git rebase -i deab3412
....
pick cdababcd Fix issue B
pick abcd1234 Update to Fix for issue B
....
....
pick cdababcd Fix issue B
squash abcd1234 Update to Fix for issue B
....
# git log --pretty=oneline --abbrev-commit
1122abcd Fix issue B
deab3412 Fix issue A
....
# git push origin +master
程序2
首先,添加所需的文件
git add <files>
git commit --fixup=OLDCOMMIT
现在这个创建了一个新的承诺在头顶与 fixup1 <OLDCOMMIT_MSG>。
其次,下令下令下令下令下令下令下令下令下令下令下令下令。
git rebase --interactive --autosquash OLDCOMMIT^
在这里 ^ 意味着以前的承诺到 OLDCOMMIT. 这个 rebase 命令在一个编辑器(vim 或 nano)上打开了互动窗口,我们不需要做任何事情,只是保存和输出是足够的. 因为转移到此的选项将自动移动最新的承诺到旧的承诺旁边,并将操作转换为 fixup(相当于 squash)。 然后 rebase 继续完成。
程序3
如果需要将新的更改添加到最后的承诺方式 - 更改可以使用 git-commit。
# git log --pretty=oneline --abbrev-commit
cdababcd Fix issue B
deab3412 Fix issue A
....
# git add <files> # New changes
# git commit --amend
# git log --pretty=oneline --abbrev-commit
1d4ab2e1 Fix issue B
deab3412 Fix issue A
....
结论
推荐文章
- Bower: ENOGIT Git未安装或不在PATH中
- Bitbucket上的Git:总是要求密码,即使上传了我的公共SSH密钥
- Git别名-多个命令和参数
- 如何添加一个“打开git-bash这里…”上下文菜单到windows资源管理器?
- 是否可以在Git中只提取一个文件?
- 当我做“git diff”的时候,我怎么能得到一个并排的diff ?
- 在git中如何将提交移动到暂存区?
- 如何缩小。git文件夹
- 如何在本地删除分支?
- 找到包含特定提交的合并提交
- Windows上Git文件的权限
- 如何从一个枝头摘到另一个枝头
- 如何获得在两次Git提交之间更改的所有文件的列表?
- 什么是跟踪分支?
- 如何在不稳定的连接上完成一个大项目的git克隆?