我正在研究主分支修改10个文件并添加5个新文件
我意识到其中一个文件不应该被修改,我应该取消它,因为原始版本是正确的
我还决定继续在分公司工作
我做了一个:git checkout -b newBranch
然后我对我的所有工作进行了git add
和git commit
分支
但是我忘记了我必须取消其中一个文件!
所以现在我能想到的唯一解决方案是将原始文件从主分支复制到我的分支,然后添加并提交以替换修改后的文件。
我认为这应该可行,但我认为将我的私有分支的最后一次提交与我的主分支合并并提交与主分支上的文件相同的文件会很奇怪。
有没有更好的方法来应对这种混乱?
答案 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
,则会失败,因为您无法B
从B2
到git push -f origin newBranch
。
所以你需要做{{1}}告诉git“我知道我在做什么;继续前进并推动”。
阅读fast forward可能有助于澄清这些概念