Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.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_Version Control_Git Branch_Git Merge_Git Commit - Fatal编程技术网

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

Git 如何从私有分支的提交中删除文件?,git,version-control,git-branch,git-merge,git-commit,Git,Version Control,Git Branch,Git Merge,Git Commit,我正在处理master branch修改10个文件并添加5个新文件。 我意识到其中一个文件不应该被修改,我应该将其解压缩,因为原始版本是正确的。 我还决定继续在一家分公司工作。 我做了一个:git结帐-b newBranch 然后,我将所有工作的git add和git commit提交到分支机构。 但我忘了我必须解开其中一个文件 因此,现在我能想到的唯一解决方案是将原始文件从主分支复制到我的分支,然后添加并提交以替换修改后的文件。 我认为这应该行得通,但我认为稍后将我的私人分支的最后一次提交与我

我正在处理master branch修改10个文件并添加5个新文件。
我意识到其中一个文件不应该被修改,我应该将其解压缩,因为原始版本是正确的。
我还决定继续在一家分公司工作。
我做了一个:
git结帐-b newBranch

然后,我将所有工作的
git add
git commit
提交到分支机构。
但我忘了我必须解开其中一个文件
因此,现在我能想到的唯一解决方案是将原始文件从主分支复制到我的分支,然后添加并提交以替换修改后的文件。
我认为这应该行得通,但我认为稍后将我的私人分支的最后一次提交与我的主分支合并,并交付一个与主分支上的文件相同的文件会很奇怪。

有没有更好的方法来处理这一混乱局面?

只要您不共享此分支,您就有几种解决方案


提交--修改

如果你只是提交了所有文件,你就可以

#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^ ^
表示“”)

然后,它将打开一个包含所有提交列表的文本编辑器,并允许您为每个提交选择一个操作。文件底部列出了可能的操作列表

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
,它将失败,因为您无法从
B
B2

因此,您需要执行git push-f origin newBranch来告诉git“我知道我在做什么;不管怎样,继续推吧。”


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

git-rebase-HEAD^
这在我的私人分支机构中是如何实现的?我也不确定什么是
pick/fixup
,只要你没有共享这个分支机构“如果这是你的意思,我已经把它推到了远程。但我是唯一一个在处理它的人。因为你是唯一一个处理它的人,所以你是安全的。但是,请注意,您必须
git-push-f
之后
git-push-f
?对于2中的哪种方法?我为什么需要它?很抱歉,我对git不是很有经验,我仍在努力