Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git挤压旧提交(不是最后一个)_Git_Git Rebase - Fatal编程技术网

git挤压旧提交(不是最后一个)

git挤压旧提交(不是最后一个),git,git-rebase,Git,Git Rebase,我有一个非常混乱的git历史。我想压缩一堆旧的提交(不包括最后一个) 我知道如何挤压我最后的n提交。但这是不同的。在这里,我连续提交了n1到n2,我想将其压缩成一个,而在n2之后,我有一个提交历史记录,我想保存到最后一个 因此,如果我当前的历史记录如下所示: ---- n1 --- n2 -------- m ---- n1n2 -------- m 我想把n1挤压到n2上,结果是这样的: ---- n1 --- n2 -------- m ---- n1n2 -------- m 其中

我有一个非常混乱的git历史。我想压缩一堆旧的提交(不包括最后一个)

我知道如何挤压我最后的
n
提交。但这是不同的。在这里,我连续提交了
n1
n2
,我想将其压缩成一个,而在
n2
之后,我有一个提交历史记录,我想保存到最后一个

因此,如果我当前的历史记录如下所示:

---- n1 --- n2 -------- m
---- n1n2 -------- m
我想把
n1
挤压到
n2
上,结果是这样的:

---- n1 --- n2 -------- m
---- n1n2 -------- m
其中,
n1n2
是单个提交,包含从
n1
n2
的压缩内容

我该怎么做?从
n2
m
对历史有什么影响


也就是说,
n2
m
的每次提交的哈希值是否会因为我想做的事情而改变?

您可以根据和执行交互式重基

  • 启动交互式重新基准:

    git rebase -i HEAD~n
    
    (其中
    n
    是您希望追溯到历史的距离)

  • 默认编辑器将打开。在顶部,将按相反顺序显示最新的
    n
    提交列表。例如:

    pick a5f4a0d commit-1
    pick 19aab46 commit-2
    pick 1733ea4 commit-3
    pick 827a099 commit-4
    pick 10c3f38 commit-5
    pick d32d526 commit-6
    
  • 为所有要压缩的提交指定
    squash
    (或快捷方式
    s
    )。例如:

    pick a5f4a0d commit-1
    pick 19aab46 commit-2
    squash 1733ea4 commit-3
    squash 827a099 commit-4
    pick 10c3f38 commit-5
    pick d32d526 commit-6
    
    Git同时应用该更改和它之前的更改,并使您将提交消息合并在一起

  • 保存并退出

  • Git将应用所有更改并再次打开编辑器以合并三条提交消息。您可以修改提交消息或保持原样(如果是这样,所有提交的提交消息都将被连接)

  • 你完了!您选择的提交都将与上一个提交压扁


  • 1.交互式重基,请参见。2.n1的每一次提交都会被重写,是的。@jornsharpe只是为了确认,从
    n2+1
    m
    的所有提交也会得到新的哈希值?是的,因为它们现在都有新的父提交。@jornsharpe So提交
    1,…,n1
    将保留它们的哈希值,即使其中一些包含在交互式重基中,但使用了
    pick
    。不一定,提交时会用到一些东西,包括时间戳:。只是为了确认。在本例中,提交2、3、4将被压缩为单个提交,我们称之为提交
    2*
    。我的新历史记录看起来将包含提交
    1、2*、5、6
    。此外,
    1
    将保留其旧的SHA-1,但
    2*、5、6
    都将获得新的SHA-1哈希。我说的对吗?@becko correct--commit 2*得到一个新的哈希,因为commit的内容现在不同了;提交5和6获取新哈希,因为它们的父提交ID已更改。有关详细信息: