如何从私有分支的提交中删除文件?

时间:2014-01-26 11:10:04

标签: git version-control git-branch git-merge git-commit

我正在研究主分支修改10个文件并添加5个新文件 我意识到其中一个文件不应该被修改,我应该取消它,因为原始版本是正确的 我还决定继续在分公司工作 我做了一个:git checkout -b newBranch
然后我对我的所有工作进行了git addgit commit分支 但是我忘记了我必须取消其中一个文件! 所以现在我能想到的唯一解决方案是将原始文件从主分支复制到我的分支,然后添加并提交以替换修改后的文件。
我认为这应该可行,但我认为将我的私有分支的最后一次提交与我的主分支合并并提交与主分支上的文件相同的文件会很奇怪。
有没有更好的方法来应对这种混乱?

1 个答案:

答案 0 :(得分:2)

只要你没有分享这个分支,你就有几个解决方案。


提交 - 发送

如果您刚刚提交了所有文件,则可以

#Restore the file
git checkout HEAD -- my/file.txt

#Fix your commit
git add my/file.txt
git commit --amend

它将重新修复您的文件

的最后一次提交

rebase -i

另一种方式有点复杂,但更灵活一点。即使你今天不使用它,它也可能在其他时间节省你的时间。

你可以压缩你的提交。

假设你有

  • 您添加了所有文件的一次提交(让我们称之为abc
  • 一个提交,您可以在其中检索您不想更改的旧版本文件(让我们称之为def

你可以做git rebase -i HEAD^^。它将打开一个文本编辑器,其中包含您最近的两次提交,例如

pick abc first commit message
pick def second commit message

将其替换为

pick abc first commit message
fixup def second commit message

然后保存并退出,git将合并这两个提交


Edit1 :关于第二个解决方案的一些解释,以便对评论采取后续行动

git rebase -i HEAD^^表示“让我更改我的提交树,从HEAD^^开始”(而HEAD^^表示“the parent of the parent of my current commit”)

然后它将打开一个文本编辑器,其中包含所涉及的所有提交的列表,并且它将允许您为每个提交选择一个操作。可能的操作列表显示在文件的底部。

pick,默认操作,意味着“不要更改此提交。squash表示”合并此提交和前一个提交。“fixup是”合并此提交和上一个,并重新使用提交消息“

无论如何,如果你不确定你在做什么,你可以在进行这种操作之前标记初始提交。例如:

git tag safetyNet
git rebase -i HEAD^^
#damned, I screwed up
git checkout safetyNet

Edit2 回答其他评论

如果你已经将你的分支推到遥控器上,如果你是唯一一个使用它的人,那么这不是什么大问题。但是,你必须“强行”推动。这就是为什么

假设您有以下提交:

A -- B
     L  newBranch | commit with the file you didn't want to modify

自推,这就是你在本地和远程回购中所拥有的。

修复后(使用解决方案1或2),您将拥有本地仓库

A -- B2
 \   L newBranch |fixed commit
  \
   \- B
      L commit with the file you didn't want to modify, not on any branch anymore

如果您尝试git push origin newBranch,则会失败,因为您无法BB2git push -f origin newBranch

所以你需要做{{1}}告诉git“我知道我在做什么;继续前进并推动”。

阅读fast forward可能有助于澄清这些概念