Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 转到上一个提交,进行更改并作为新头提交_Git_Git Rebase_Git Commit_Git Reset_Git Revert - Fatal编程技术网

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
)。但是从您的第二个方案来看,您似乎只希望使用commit
B
中修改的更改创建一个新的commit,并将更改保留在commit
a
中。是的。我想完全实现我在问题中所描述的。那么你还需要提交
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 -- .