Git 转到上一个提交,进行更改并作为新头提交
它是一个仅限本地的存储库。没有分支。日志显示Git 转到上一个提交,进行更改并作为新头提交,git,git-rebase,git-commit,git-reset,git-revert,Git,Git Rebase,Git Commit,Git Reset,Git Revert,它是一个仅限本地的存储库。没有分支。日志显示 HEAD->master A 9812 B 4578 C 我想使当前工作目录与C相同,编辑一些文件,替换一些二进制文件(PDF)并进行新的提交,比如ModC。因此,新日志将是: HEAD->master ModC 7845 A 9812 B 4578 C 看起来很简单。但我一直在挣扎,面临着各种各样的分支机构、合并、重新调整、重置 要实现我想
HEAD->master A
9812 B
4578 C
我想使当前工作目录与C相同,编辑一些文件,替换一些二进制文件(PDF)并进行新的提交,比如ModC。因此,新日志将是:
HEAD->master ModC
7845 A
9812 B
4578 C
看起来很简单。但我一直在挣扎,面临着各种各样的分支机构、合并、重新调整、重置
要实现我想要的目标,什么样的方法才是可靠的、万无一失的
我想使当前工作目录与C相同
您可以使用还原C之后的更改
git revert C..HEAD
这将进行一次新的提交,恢复a和B
HEAD->master Revert A & B
7845 A
9812 B
4578 C
现在,工作目录将与C相同。然后,您可以像平常一样进行更改,添加并提交它们。那你就要这个了
HEAD->master ModC
3847 Revert A & B
7845 A
9812 B
4578 C
HEAD->master C
您还可以使用
git reset
使A和B永远不会发生git reset
可用于将分支移动到您想要的任何位置,比如将master移回C
git checkout master
git reset --hard C
现在你有这个了
HEAD->master ModC
3847 Revert A & B
7845 A
9812 B
4578 C
HEAD->master C
好像A和B从未发生过。现在,您可以像往常一样在C上添加和提交更改
有一个更强大的工具叫做“交互式重基”,可以搞乱历史,但你也可以用它把事情搞砸 以下是实现这一目标的方法:
# get content of 'C' commit (without creating any commit yet) :
git checkout 4578 -- . # <- the '.' is very important. see below
# edit whatever files you want ...
# make regular commit with your new content :
git add <files>
git commit
将活动提交设置为4578
,并将提交4578
的内容放在磁盘上
git checkout 4578 .
# or
git checkout 4578 -- .
不会触动当前活动提交并将提交的内容放入磁盘只有在不需要当前提交更改的情况下才会将分支重置为上一次提交(在您的情况下,还原提交
A
)。但是从您的第二个方案来看,您似乎只希望使用commitB
中修改的更改创建一个新的commit,并将更改保留在commita
中。是的。我想完全实现我在问题中所描述的。那么你还需要提交A
&B
吗?@Eimantas是的。我不想失去任何承诺。谢谢你。但为了确保解决方案适用于以前的任何提交,我修改了这个问题。请你看一下好吗?@deshmukh当你说“我想让当前工作目录与C相同”时,你的意思是你想扔掉A和B吗?不,A和B将保留在git中。所以,我可以随时回到A或B。只是工作目录中的所有文件都将来自C。@Schwern:您也可以在提交ModC
时使用git commit--amend
,另一种方法是:git checkout 4578;#编辑文件;git添加文件;git commit
这种方法的缺点是,您现在在一次提交中混合了两件事:恢复A和B,然后添加新的更改。这将使审查更加困难。
git checkout 4578 .
# or
git checkout 4578 -- .