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