21

我有两个相应的提交,在本地历史的某个地方,一个文件被错误地添加到第二个文件中。我想解决这个问题。

我不明白我应该如何使用交互式变基。我这样做git rebase -i HEAD~10并选择使用文件编辑提交,以便从那里检查出来。我使用 git guit 但是,在提交区域中看不到任何文件。我可以选择修改以前的提交,然后我会看到文件。但是,我无法将放错位置的文件添加到之前的提交中,因为我在当前提交中看不到该文件以开始。

4

5 回答 5

33

因此,在变基时,选择同时编辑您错误添加文件的提交,以及您要按该顺序添加文件的提交。如果文件在稍后的提交中,但应该在较早的提交中,则必须重新排序行。例如,我从

pick 8de731b Commit with missing file.
pick bbef925 Commit with too many files.
pick 52490ce More history.

我需要将其更改为

edit bbef925 Commit with too many files.
edit 8de731b Commit with missing file.
pick 52490ce More history.

然后,

# In the commit containing an extra file
git reset HEAD^ badfile.c
git commit --amend
git rebase --continue

# Now in the commit to add it to
git add badfile.c
git commit --amend
git rebase --continue

不幸的是,在一个分支中编辑历史时,我不知道有什么方法可以避免在所有分支中编辑历史。应尽早进行变基以避免此类问题。在我这里的简单案例中,我可以合并 master 和另一个分支,但是提交不合并,然后我必须在 master 中重新设置基准,并重新排序和压缩提交,如下所示:

pick 7cd915f Commit with missing file.
fixup 8de731b Commit with missing file. #This was the higher of the two entries
pick 8b92c5a Commit with too many files.
fixup bbef925 Commit with too many files. #This was the higher of the two entries
pick 94c3f7f More history.
fixup 52490ce More history. #This was the higher of the two entries

后期编辑:我只是注意到我不小心将提交历史重新排序为原始答案的结转。交换变基中的行会更改您提交的顺序;编辑后,您可以再次变基并将它们交换回去以返回原始提交顺序。

于 2013-09-02T09:53:41.673 回答
18

如果我没有弄错,您想要的是将包含提交 2 的一些更改移动到提交 1。

我发现最简单的方法是执行两个连续的交互式变基。

在第一个中,您将提交 2 拆分为两个提交:第一个仅包括您要移动的更改,第二个包括所有其余的。我们现在有提交 1、2.1 和 2.2。

然后你再次变基,这次选择将提交 2.1 压缩为 1。

于 2013-09-02T10:08:27.030 回答
11

因为我经常偶然发现这个问题,所以我为此编写了一个脚本。它完全自动工作。你可以在Github上找到它。将其复制到本地文件系统,将其添加到 PATH 中,您将能够以如下方式运行它:

mv-changes <source-commit> <destination-commit> <path>...

您还可以在 Windows 上的 Git-Bash shell 中运行该脚本。

请注意,如果和<path>之间的中间提交发生变化,它将不起作用。source-commitdestination-commit

此处提供了更多详细信息。

于 2016-02-17T09:49:00.210 回答
4

首先获取有关简短历史的信息

> git log --oneline -n 3 --decorate=short
333333  (HEAD -> work_AAA) added test              /*file is updated here*/
222222  corrected bug 
111111  (origin/master, origin/HEAD, master) version XXX 

所以我们可以在提交 22222 时变基并停止

> git rebase -i master 
pick 22222 corected bug 
pick 33333 added test

改成 :

edit 22222 corected bug 
pick 33333 added test

那么你将在提交 22222 中处于更新模式,它显示如下:

Stopped at 22222... corrected bug
You can amend the commit now, with
   git commit --amend 
Once you are satisfied with your changes, run
   git rebase --continue

这里将文件从提交 3 复制到提交 2

git show 33333:path/to/file  >  path/to/file

修改提交 2 并继续变基

git commit --amend --no-edit path/to/file
git rebase --continue

完毕 !

于 2018-08-07T14:09:51.487 回答
0

我有同样的问题,想解释一下我做了什么。

在提交 AI 中添加了一个文件 f,我必须在接下来的提交 B 中删除该文件。

现在我想摆脱两个提交中的文件,但也想避免拆分提交,因为涉及到许多其他文件。我做了这个

  • 恢复文件
  • 在提交 ADD 中再次添加它
  • 在提交 REM 中删除它 - 现在有历史 A - B - ADD - REM
  • 用 REM 压缩提交 A - 然后文件从 AB中消失
  • drop commit ADD - 现在文件已经消失了

也许这是一个古怪的解决方案,但对我来说它有效。
如果您因为某些原因觉得这很糟糕,请发表评论。

于 2018-09-20T08:04:05.387 回答