Git 如何在分支的第一次(根)提交时使用交互式重基?
如果我处于以下情况Git 如何在分支的第一次(根)提交时使用交互式重基?,git,rebase,squash,Git,Rebase,Squash,如果我处于以下情况 $ git log --oneline * abcdef commit #b * 123456 commit #a 我知道我总能跑 $ git reset HEAD~ $ git commit --amend 然而,我试图逃跑 $ git rebase -i HEAD~2 但是我有 fatal: Needed a single revision invalid upstream HEAD~2 因此我的问题是:有没有一种方法可以使用git rebase来压缩这两个提交
$ git log --oneline
* abcdef commit #b
* 123456 commit #a
我知道我总能跑
$ git reset HEAD~
$ git commit --amend
然而,我试图逃跑
$ git rebase -i HEAD~2
但是我有
fatal: Needed a single revision
invalid upstream HEAD~2
因此我的问题是:有没有一种方法可以使用git rebase来压缩这两个提交?这个参数似乎有帮助: 重新设置可从访问的所有提交的基础,而不是使用。这允许您重新设置根目录的基础 在分支上提交 这应该可以让您将第二次提交挤压到第一次提交上(我想您实际上想要修复):
git rebase --root -i
注意理解--root选项的作用,因为在您的情况下,它满足您的需要,但在分支中使用时可能会很棘手,因为它将重新基于历史上可访问的最远祖先(即树的根);所以rebase--root
将在a
到a-B-D-E-X-Y-z
上重新设置z
:
master A-B-C
\
upstream D-E
\
current branch X-Y-Z
您希望重新设置到
主分支的根提交的基础。更具体地说,要压缩这两个提交,您需要运行
git rebase -i --root
然后用弹出编辑器缓冲区第二行的pick
替换squash
:
pick 123456 a
squash abcdef b
有关该标志的更多详细信息,请参阅:
--根目录
改为重新设置可从
访问的所有提交的基础
用
限制它们。这允许您重新设置基础
分支上的根提交。[……]
根目录的交互式重基示例
#把事情安排好
$mkdir testgit
$cd testgit
$git init
#作出两项承诺
$touch自述文件
$git添加自述文件
$git commit-m“添加自述”
$printf“foo\n”>自述
$git commit-am“在自述文件中写入'foo'”
#检查日志
$git log--oneline--decoration--graph
*815b6ca(HEAD->master)在自述文件中写“foo”
*630ede6添加自述文件
#重新设置当前分支根的基(交互):
#-用第二行的“挤压”代替“拾取”;保存并退出编辑器。
#-然后写入结果提交的提交消息;保存并退出编辑器。
$git rebase-i--根
[分离头c9003cd]添加自述;在自述中写“foo”
日期:2015年5月16日星期六17:38:43+0100
1个文件已更改,1个插入(+)
创建模式100644自述文件
已成功重新设置基准并更新了基准/基准/主基准。
#再次检查日志
$git log--oneline--decoration--graph
*c9003cd(主机->主机)添加自述;在自述中写“foo”
我来问这个问题是为了找到标题的答案。在一个非常大的回购协议上,接受的答案为主分支(aka:master)中的每个提交生成一个交互式的重基,而不仅仅是针对给定的分支。对于来到这里的其他人,另一种选择是使用父分支名称(或提交):
git-rebase-i
在深入研究git文档并找到以下()之后,我意识到了这一点:
从要保留的最后一次提交开始:
git-rebase-i
编辑器将启动,其中包含所有提交
当前分支(忽略合并提交),它位于
给予承诺
假设您有一个从master分支出来的branch\u a,并且希望以交互方式重新设置branch\u a
上所有提交的基础。要做到这一点,您需要:
git-rebase-i-master
可选地,如果你想从中间开始(或者在任何提交),你可以这样做:
git-rebase-i
另一种常见形式是,如果您知道“我想从现在的位置重新设置5次提交的基础”
git-rebase-i头~5
希望这能帮助其他人在git rebase打开一个包含数千行提交的编辑器时避免心脏病发作。─=≡Σ((( つ><)つ 我在同一时间输入我的答案:)是的;我点击了“发布你的答案”,页面重新加载后返回了两个答案:)但你排在了第二位;)
pick 123456 a
squash abcdef b