在Git上,说我弄乱了我的提交,我想让版本3提交以前作为新版本。如果我git checkout xxxx
,它会创建一个新的分支,看起来我只能合并它?我可以将它作为新的“主版本”吗?
我想:
A-B-C-D-E
成为
A-B-C-D-E-F
其中F与C
的内容完全相同如果我使用git revert xxxx
代替它,它似乎肯定会有冲突,我需要手动解决它。
我真正想要的只是在某个时刻进行旧提交,无论我的工作目录或最新提交中有什么。
我将如何做到这一点?
答案 0 :(得分:198)
git rm -r .
git checkout HEAD~3 .
git commit
提交后,新HEAD
中的文件与修订版HEAD~3
中的文件相同。
答案 1 :(得分:30)
听起来你只想重置为C;那就是树:
A-B-C
您可以使用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
将这些内容压缩在一起
答案 2 :(得分:16)
这正是我想要做的。我不确定上一个命令git cherry-pick C
,这听起来不错,但是看起来你这样做是为了从另一个分支进行更改而不是在同一个分支上,有人试过吗?
所以我做了一些其他的工作: 我通过文件
从旧的提交文件中获取了我想要的文件git checkout <commit-hash> <filename>
ex:
git checkout 08a6497b76ad098a5f7eda3e4ec89e8032a4da51 file.css
- &GT;这将从原来的提交中获取文件
然后我做了我的改变。我再次承诺。
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
检查了我的历史记录,但我仍然保留了我的历史记录以及从旧文件中进行的新更改。我也可以推。
请注意,要返回到您想要的状态,您需要在不需要的更改之前放置提交的哈希值。另外,请确保在执行此操作之前没有未提交的更改。
答案 3 :(得分:15)
eloone通过
文件归档git checkout <commit-hash> <filename>
但您可以通过
更轻松地检出所有文件git checkout <commit-hash> .
答案 4 :(得分:6)
git cherry-pick C
其中C是C的提交哈希。这将在最新的提交之上应用旧提交。
答案 5 :(得分:2)
到目前为止,其他答案会创建新的提交,以撤消旧提交中的内容。有可能回归并“改变历史”,但这可能有点危险。如果您正在更改的提交尚未推送到其他存储库,则仅执行此操作。
您正在寻找的命令是git rebase --interactive
如果要更改HEAD~3,则要发出的命令为git rebase --interactive HEAD~4
。这将打开一个文本编辑器,允许您指定要更改的提交。
在尝试使用重要内容之前,先练习不同的存储库。手册页应该为您提供所需的所有其他信息。