如何修改旧的Git提交?

mic*_*ael 148 git version-control git-rewrite-history

我做了3个git提交,但没有被推送.如何修改不是最新的旧版本(ddc6859af44)和(47175e84c)?

$git log
commit f4074f289b8a49250b15a4f25ca4b46017454781
Date:   Tue Jan 10 10:57:27 2012 -0800

commit ddc6859af448b8fd2e86dd0437c47b6014380a7f
Date:   Mon Jan 9 16:29:30 2012 -0800

commit 47175e84c2cb7e47520f7dde824718eae3624550
Date:   Mon Jan 9 13:13:22 2012 -0800
Run Code Online (Sandbox Code Playgroud)

Ada*_*ruk 189

git rebase -i HEAD^^^
Run Code Online (Sandbox Code Playgroud)

现在用edite(替换pick)标记要修改的那些.现在保存并退出.

现在进行更改

git add -A
git commit --amend --no-edit
git rebase --continue
Run Code Online (Sandbox Code Playgroud)

如果要添加额外删除,请从commit命令中删除选项.如果要调整消息,请忽略该--no-edit选项.

  • 注意 - 你不必在git add -A之后进行git commit,只需git rebase --continue就会保留你的更改. (8认同)
  • 使用`git stash`或`git stash [-p | --patch]`(交互式)可以很方便地在rebase期间将更改轻松应用于较旧的提交. (7认同)
  • 或者,“git rebase -i HEAD~N”返回最后 N 次提交(无需键入多个“^”) (5认同)
  • @kleinfreund 两年后你可能已经解决了这个问题,但对于其他有这个问题的人(比如我)来说:一些 shell(比如 zsh)将 `^` 解析为模式。在这种情况下,您可以使用“~”来代替。 (3认同)
  • 三重^有什么作用? (3认同)

ako*_*nov 105

我准备好了我想用旧版本修改的提交,并且惊讶地看到rebase -i抱怨我有未提交的更改.但我不想再次指定旧提交的编辑选项进行更改.所以解决方案非常简单明了:

  1. 准备更新旧提交,添加和提交
  2. git rebase -i <commit you want to amend>^- 注意^这样你就可以在文本编辑器中看到所述提交
  3. 你会得到像这样的东西:

    pick 8c83e24 use substitution instead of separate subsystems file to avoid jgroups.xml and jgroups-e2.xml going out of sync
    pick 799ce28 generate ec2 configuration out of subsystems-ha.xml and subsystems-full-ha.xml to avoid discrepancies
    pick e23d23a fix indentation of jgroups.xml
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在要结合e23d23a和8c83e24你可以改变行顺序并使用像这样的壁球:

    pick 8c83e24 use substitution instead of separate subsystems file to avoid jgroups.xml and jgroups-e2.xml going out of sync    
    squash e23d23a fix indentation of jgroups.xml
    pick 799ce28 generate ec2 configuration out of subsystems-ha.xml and subsystems-full-ha.xml to avoid discrepancies
    
    Run Code Online (Sandbox Code Playgroud)
  5. 写入和退出文件,您将出现一个编辑器来合并提交消息.这样做并保存/退出文本文档

  6. 你完成了,你的提交被修改了

学分归于:http://git-scm.com/book/en/Git-Tools-Rewriting-History 还有其他有用的演示git魔法.

  • 我没有意识到我可以重新排序rebase文件中的行.棒极了! (11认同)
  • @DanBechard 重新排序时要小心:如果你不小心剪切并忘记粘贴:该提交就消失了! (3认同)
  • 对我来说,这更容易理解。而且效果很好 (2认同)
  • 如果有人不熟悉在终端中编辑文件的 vi 命令,此页面是一个很好的参考 https://www.cs.colostate.edu/helpdocs/vi.html (2认同)

Ben*_*ier 13

您可以使用git rebase来重写提交历史记录.这可能会对您的更改造成破坏,因此请谨慎使用.

首先将"修改"更改作为正常提交提交.然后从最早提交的父项开始执行交互式rebase

git rebase -i 47175e84c2cb7e47520f7dde824718eae3624550^
Run Code Online (Sandbox Code Playgroud)

这将启动所有提交的编辑器.对它们重新排序,以便您的"修改"提交低于您要修改的提交.然后使用"修改"提交替换行上的第一个单词s,将其与之前的提交组合(s quash).保存并退出编辑器并按照说明操作.

  • 他不想压缩或重新排序提交. (3认同)
  • @AdamDymitruk:他在哪里这么说?顺便说一句,你的回答也建议重写历史. (3认同)
  • @AdamDymitruk:修改是提交和压缩最后两次提交的简写.两者都更改提交SHA1("重写历史记录").如果我有错误的心理图片,请教育我. (3认同)

Mel*_*ius 12

我已经用了几次另一种方式.实际上,它是一本手册git rebase -i,当你想要重新排列几个提交包括挤压或拆分其中的一些时,它很有用.主要优点是您不必在一个时刻决定每个提交的命运.您还可以在此过程中使用所有Git功能,这与rebase期间不同.例如,您可以随时显示原始历史记录和重写历史记录,甚至可以进行其他修改!

我将通过以下方式引用提交,因此它易于阅读:

C # good commit after a bad one
B # bad commit
A # good commit before a bad one
Run Code Online (Sandbox Code Playgroud)

您在开始时的历史如下所示:

x - A - B - C
|           |
|           master
|
origin/master
Run Code Online (Sandbox Code Playgroud)

我们将以这种方式重新创建它:

x - A - B*- C'
|           |
|           master
|
origin/master
Run Code Online (Sandbox Code Playgroud)

程序

git checkout B       # get working-tree to the state of commit B
git reset --soft A   # tell Git that we are working before commit B
git checkout -b rewrite-history   # switch to a new branch for alternative history
Run Code Online (Sandbox Code Playgroud)

提高你的旧提交使用git add(git add -i,git stash等等)现在.您甚至可以将旧提交分成两个或更多.

git commit           # recreate commit B (result = B*)
git cherry-pick C    # copy C to our new branch (result = C')
Run Code Online (Sandbox Code Playgroud)

中间结果:

x - A - B - C 
|    \      |
|     \     master
|      \
|       B*- C'
|           |
|           rewrite-history
|
origin/master
Run Code Online (Sandbox Code Playgroud)

让我们完成:

git checkout master
git reset --hard rewrite-history  # make this branch master
Run Code Online (Sandbox Code Playgroud)

就是这样,你push现在可以取得进步.


Avi*_*Avi 10

您可以使用git rebase --interactive,使用edit命令上提交你想修改.