2014-01-28 115 views
4

我在我的分支中有以下历史记录。从Git中删除推送提交

  • “承诺3”(产地/主)
  • “犯2”
  • “承诺1”(主2落后)
  • ...以前提交

我想从历史中删除提交2和3。所以第一次提交是最新的。我是唯一使用这个存储库的人。

我使用SourceTree并在终端我进入以下:

git rebase -i 

然后我得到一个多彩的屏幕,在这里我不能输入命令。我能做什么?

编辑:

推错误

ssh: connect to host <myhost> port 22: Bad file number 
fatal: Could not read from remote repository. 

Please make sure you have the correct access rights 
and the repository exists. 
+1

你最有可能被抛入'vim' - 尝试运行'git config --global core.editor EDITOR_OF_CHOICE' – Eric

+0

你想从你的本地仓库或本地和远程仓库中删除这些提交? – R0MANARMY

+0

本地和远程 – Nfear

回答

2

如果你想取消提交,但让你的文件进行的修改:

git reset --soft HEAD^2 

如果你既想取消提交并取消本地文件中的修改:

git reset --hard HEAD^2 

Head^X表示在当前分支上次提交前第X次提交。

+0

我得到“模棱两可的论点”HEAD^2':未知版本或路径“ – Nfear

+0

也许你的索引与分支分离?另一种选择是用您想要返回的提交的标识符替换HEAD^2。 – kgautron

+0

我知道如何设置当前分支。问题是最新的两个提交可以被拉。我想彻底删除它们。 – Nfear

0

您可以在这两个提交不回复:2和3:

git revert "commit 3" 
git revert "commit 2" 

或git的复位:

git reset --hard "commit 1" 
+0

这两个命令之间有什么区别? – DougM

+0

'git revert'将创建新的提交以反转commit2和commit3的影响。但原来的commit2&commit3当然还在那里。 'git reset --hard commit1'会将指针移回HEAD分支回到commit1,所以你可以从那里开始工作 - 让你假装你从未做过commit2和commit3。 –

0

如果你想在当前头顶犯了确切状态在不同的提交中,撤消所有的中间提交,那么你可以使用reset来创建索引的正确状态来进行提交。

# reset the index to the desired tree 
git reset 56e05fced 

# move the branch pointer back to the previous HEAD 
git reset --soft [email protected]{1} 

git commit -m "Revert to 56e05fced" 

# Update working copy to reflect the new commit 
git reset --hard 
1

所有这些问题的答案似乎表明如何从本地存储库中删除commit2 & commit3,但没有解决远程存储库。

首先,退出您所在的交互式底座。仅影响本地历史记录。您可能需要退出您所在的文本编辑器或运行git rebase --abort。我不确定你的确切状态。

一旦您回到正常的命令行,checkout master,因为它已经在所需的commit1。

git checkout master

然后迫使origin/master的更新掌握。

git push -f

以此警告其他读者,从来不知道一个共享资源库的强制推动与其他开发者!这适用于原始海报,因为它们是唯一使用其远程存储库的海报。

+0

这似乎是解决方案,但是当我输入push命令时,它会显示“错误的文件编号”,“无法从远程存储库读取”。但是,我可以通过用户界面推送。 – Nfear

+0

你能输入错误的全文吗?并且是否从用户界面(SourceTree,我假设)强制推送? –

+0

它通过用户界面工作,但不在终端。我会在OP中添加错误。 – Nfear