2010-08-01 59 views
159

在Git上,说我搞砸了我的提交,并且我想让第3版提交前作为新版本。如果我做git checkout xxxx,它会创建一个新的分支,看起来像我只能合并它?我可以让这个新的“主版本”?签出旧的提交,并使其成为一个新的提交

我想:

A-B-C-D-E 

成为

A-B-C-D-E-F 

其中F具有完全相同的内容为C

如果我使用git revert xxxx相反,它好像它肯定会有冲突我需要手动解决它。

我真正想要的只是在某个时间点提交新的提交,无论我的工作目录或最新提交中的内容如何。

我该怎么做呢?

回答

178
git rm -r . 
git checkout HEAD~3 . 
git commit 

提交后,在新的HEAD文件将是相同的,他们在修订HEAD~3

+0

这似乎是做我想做的事情。谢谢。如果我想通过SHA-1散列来引用版本,我应该做git checkout HEAD〜XXXXX吗? – huggie 2010-08-04 12:09:16

+7

不,只是'git checkout XXXXX'。 'rev〜n'表示在'rev'之前的* n *版本。 – svick 2010-08-04 17:39:38

+75

HEAD〜3之后的点很重要。 – bbuser 2012-02-21 16:54:49

27

这听起来像你只是想重置为C;这是使树:

ABC

你可以做到这一点与reset

git reset --hard HEAD~3 

(注:你说的三个提交前,所以这是我写的,在你的例如C只有两次提交前,所以你可能想要使用HEAD~2


您也可以使用revert如果你想,但据我所知,你需要做的就返回一次一个:

git revert HEAD  # Reverts E 
git revert HEAD~2 # Reverts D 

这将创建一个新提交的f是相同的内容d,和G这是相同的内容C.可以rebase壁球那些在一起,如果你想

+3

感谢喜的答案更容易检出的所有文件。但是,如果我不想进行硬重置,因为它已经被推入公共存储库了? – huggie 2010-08-01 11:02:50

+1

@huggie啊。那么你可能想要使用回复方法 – 2010-08-01 18:05:55

+0

,然后git push -f强制推送 – radtek 2014-11-30 05:39:30

2

到目前为止的其他答案会创建新的提交,以撤消旧提交中的内容。有可能回去“改变历史”,但这可能有点危险。您应该只有如果您正在更改的提交未被推送到其他存储库,请执行此操作。

你要找的命令是git rebase --interactive

如果你想改变HEAD〜3,要发出命令是git rebase --interactive HEAD~4。这将打开一个文本编辑器,并允许您指定要更改的提交。

在尝试使用某些重要事项之前,先在不同的存储库上练习。手册页应该为您提供所有您需要的信息。

+0

投票下来。 1.这个问题明确地要求保留较旧的提交,所以这可能是其他答案尝试这样做的原因。 2.如你所说,提交可能已经发布,并且不需要就重新分配意味着什么进行评论。 – tishma 2016-02-22 10:57:46

5

git cherry-pick C

其中C为C.提交散列这适用旧提交的最新的一个的顶部。

+11

'git cherry-pick C'将C引入的*改变*应用到E的顶部。这不是OP所要求的。他希望这些文件处于C状态,即'git checkout'提供的确切状态。 – gotgenes 2013-05-30 13:06:41

13

这正是我想要做的。我不知道以前的命令git cherry-pick C,听起来不错,但你似乎这样做是为了从另一个分支获得更改,但不在同一分支上,有没有人试过?

所以,我没有别的东西也工作: 我得到了我从旧提交文件希望后面的文件按文件

git checkout <commit-hash> <filename> 

例如: git checkout 08a6497b76ad098a5f7eda3e4ec89e8032a4da51 file.css

- >这需要的文件,他们是从旧承诺

然后我做了我的更改。我又犯了一次。

git status (to check which files were modified) 
git diff (to check the changes you made) 
git add . 
git commit -m "my message" 

我检查我的历史与git log,我还有我的历史我从旧的文件提出了新的变化一起。我也可以推。

请注意,要回到所需状态,需要在不需要的更改之前放置提交的哈希值。在做这件事之前,请确保您没有未提交的更改。

6

eloone做到了按文件文件,

git checkout <commit-hash> <filename> 

,但你可以通过做

git checkout <commit-hash> . 
+0

这会在推送到原点时导致拒绝。 – jtheletter 2016-05-06 22:43:54

+0

这对我有用。推动起源不是问题。 – Noffls 2017-03-02 08:47:15

相关问题