如何将更改的文件添加到Git中的旧(不是最后)提交

lee*_*een 405 git

我在过去一小时内改变了一些事情,并一步一步地提交了它们,但我刚刚意识到我忘了在一些提交之前添加一个已更改的文件.

日志看起来像这样:

GIT TidyUpRequests u:1 d:0> git log 
commit fc6734b6351f6c36a587dba6dbd9d5efa30c09ce 
Author: David Klein <> 
Date:   Tue Apr 27 09:43:55 2010 +0200

    The Main program now tests both Webservices at once

commit 8a2c6014c2b035e37aebd310a6393a1ecb39f463 
Author: David Klein <>
Date:   Tue Apr 27 09:43:27 2010 +0200

    ISBNDBQueryHandler now uses the XPath functions from XPath.fs too

commit 06a504e277fd98d97eed4dad22dfa5933d81451f 
Author: David Klein <> 
Date:   Tue Apr 27 09:30:34 2010 +0200

    AmazonQueryHandler now uses the XPath Helper functions defined in XPath.fs

commit a0865e28be35a3011d0b6091819ec32922dd2dd8 <--- changed file should go here
Author: David Klein <> 
Date:   Tue Apr 27 09:29:53 2010 +0200

    Factored out some common XPath Operations
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Gre*_*ill 600

使用git rebase.特别:

  1. 使用git stash存储您要添加的变化.
  2. 使用git rebase -i HEAD~10(或者你希望看到的许多提交).
  3. a0865...通过pick将行开头的单词更改为,将问题()中的提交标记为编辑edit.不要删除其他行,否则会删除提交.[^ vimnote]
  4. 保存rebase文件,git将退回到shell并等待您修复该提交.
  5. 通过使用弹出存储 git stash pop
  6. 添加你的文件git add <file>.
  7. 修改提交git commit --amend --no-edit.
  8. 做一个git rebase --continue会重写你的其余提交对新的提交.
  9. 如果您已标记多个提交进行编辑,请从步骤2开始重复.

[^ vimnote]:如果您正在使用,vim则必须Insert按键进行编辑,然后Esc键入:wq以保存文件,退出编辑器并应用更改.或者,您可以配置一个用户友好的git的承诺编辑git config --global core.editor "nano".

  • 如果您要将未添加的更改添加到编辑中,该怎么办?如果我藏匿它们,我就不能"git add". (23认同)
  • 注意:使用`edit`标记提交时,请勿删除文件中列出的其他提交.如果你这样做,提交将被删除,你必须[按照这些步骤](http://stackoverflow.com/a/2496001/574190)将它们取回. (17认同)
  • Sam你可以简单地在有问题的提交时解除更改,它会正常工作. (15认同)
  • 关于@DavidTuite 所说的话,我在 git 上做事时的一个习惯,我不确定结果如何是创建一个“branchname-ref”分支来保存时间线的当前状态,以防万一我搞砸了。完成后,我将其删除。 (6认同)
  • 请注意,“--no-edit”是可选的,它将保留您现有的提交消息。如果您打算更新原始提交消息,请保留该参数,然后您将进入另一个编辑器视图来更改它。另外,您的工作目录必须是干净的,然后才能“git rebase --Continue”。因此,如果您只从存储中添加一部分代码,则需要在继续变基之前重新存储(即在步骤 7 和 8 之间)。 (2认同)
  • @Dave,如果您已经将提交推送到远程,则必须使用“--force-with-lease”进行推送(请注意,推送后重新设置基准并不总是一个好主意)。详细信息[此处]解释(/sf/ask/625798421/) (2认同)
  • 我认为重要的是要注意,如果您已经远程推送了这个分支,您将编辑已经获取您的分支的每个人的历史记录。[理解后果](/sf/ask/104370101/)很重要。另外,如果您担心这些后果,那么值得了解 [--force-with-lease](/sf/ask/3697658471/ ) (2认同)

Joe*_*rra 284

要通过一个小的更改"修复"旧的提交,而不更改旧提交的提交消息,其中OLDCOMMIT类似于091b73a:

git add <my fixed files>
git commit --fixup=OLDCOMMIT
git rebase --interactive --autosquash OLDCOMMIT^
Run Code Online (Sandbox Code Playgroud)

您还可以使用git commit --squash=OLDCOMMIT在rebase期间编辑旧的提交消息.


  • git rebase --interactive将调出一个文本编辑器(可以配置)来确认(或编辑)rebase指令序列.文件中有关于rebase指令更改的信息; 只需保存并退出编辑器(:wqinvim)继续使用rebase.
  • --autosquash将自动--fixup=OLDCOMMIT按所需顺序进行任何提交.请注意,--autosquash仅在使用该--interactive选项时有效.
  • ^OLDCOMMIT^意味着它是一个参考之前提交OLDCOMMIT.

上述步骤适用于验证和/或修改rebase指令序列,但也可以通过以下方式跳过/自动化交互式rebase文本编辑器:

请参阅git commitgit rebase.与往常一样,当重写git历史记录时,您应该只修改或压缩尚未发布给其他任何人的提交(包括随机互联网用户和构建服务器).

  • 比其他选项更清晰,它就像一个魅力 (16认同)
  • @Jonah:编辑器未打开以编辑*commit消息*,而是确认(或编辑)*rebase步骤*.这是无法避免的; [`--autosquash`仅在使用`--interactive`选项时有效](https://git-scm.com/docs/git-rebase). (4认同)
  • 使用这个解决方案我卡住git出现VIM.我的问题是,我不知道如何使用VIM.我怎么能摆脱它,我怎么能控制这个东西,这太混乱了. (4认同)
  • 一行不错的别名 [here](/sf/answers/3429991771/) (3认同)
  • 杜德 您将永远不会获得应有的荣誉。谢谢。 (3认同)
  • @NeonWarge:首选编辑器可以使用例如`git config --global core.editor"pico"`进行配置.有[其他几种配置git和/或更改系统默认编辑器的方法](/sf/ask/181776381/ -choice-for-commits)等. (2认同)

kni*_*ttl 60

使用git 1.7,有一个非常简单的方法git rebase:

暂存你的文件:

git add $files
Run Code Online (Sandbox Code Playgroud)

创建一个新的提交并重新使用"破坏"提交的提交消息

git commit -c master~4
Run Code Online (Sandbox Code Playgroud)

fixup!在主题行中添加前缀(或者squash!如果要编辑commit(message)):

fixup! Factored out some common XPath Operations
Run Code Online (Sandbox Code Playgroud)

用于git rebase -i --autosquash修复您的提交

  • @oschrenk:你需要提供你想要改变的提交,例如`git rebase -i --autosquash HEAD~10` (6认同)
  • +1.很好地使用新的fixup指令(1.7+):http://stackoverflow.com/questions/2302736/trimming-git-checkins/2302947#2302947 (2认同)

Von*_*onC 8

您可以尝试一个rebase --interactive会话来修改您的旧提交(前提是您尚未将这些提交送到另一个仓库).

有时在b.2中修复了这个问题.不能修改为它修复的不太完美的提交,因为该提交深深埋藏在补丁系列中.
这正是交互式rebase的用途:在大量的"a"和"b"之后使用它,通过重新排列和编辑提交,并将多个提交压缩成一个.

使用您要保留的最后一次提交启动它:

git rebase -i <after-this-commit>
Run Code Online (Sandbox Code Playgroud)

编辑器将被激活当前分支中的所有提交(忽略合并提交),这些提交在给定的提交之后.
您可以将此列表中的提交重新排序到您的内容,然后您可以删除它们.该列表看起来或多或少像这样:

pick deadbee The oneline of this commit
pick fa1afe1 The oneline of the next commit
...
Run Code Online (Sandbox Code Playgroud)

在线描述纯粹是为了您的乐趣; git rebase不会查看它们,而是查看提交名称(本例中为"deadbee"和"fa1afe1"),因此不要删除或编辑名称.

通过使用命令"edit"替换命令"pick",您可以告诉git rebase在应用该提交后停止,以便您可以编辑文件和/或提交消息,修改提交并继续重新定位.


归档时间:

查看次数:

78955 次

最近记录:

6 年,7 月 前