如何在不失去当前进度的情况下将旧提交的更改带到当前提交

时间:2018-01-07 12:25:47

标签: git

我在分支机构工作时偶然发现了一个问题(让我们称之为)y

以下是我在y的工作路线图:

... --> important-commit --> commit2 --> commit3

事实证明important-commit中的更改已被commit2删除。我希望commit3拥有important-commit中的所有数据。

我的问题是我不知道如何从important-commit进行更改并且还保存commit3

中完成的工作

3 个答案:

答案 0 :(得分:1)

考虑使用git cherry-pick。从功能上讲,挑选提交意味着复制提交,方法是将提交的快照转换为更改集,并将该更改集应用于当前提交以产生新提交。

也就是说,git cherry-pick $hash的作用实质上是:

git diff $hash^1 $hash > /tmp/patch   # see what changed in $hash vs its parent
git apply /tmp/patch                  # and then if this works, commit

(虽然实际上它将使用Git&n合并机制的全部功能来处理提交{em>提交后发生的变化:以上仅仅是为了帮助了解这个过程。)

请注意,$hash git revertgit cherry-pick非常相似。关键区别是git revert 会反转差异:如果差异显示"将新行37添加到README.txt",git revertREADME.txt移除该行,而不是尝试再次添加。如果差异显示"将orange更改为purple&#34 ;, cherry-pick将尝试将橙色更改为紫色,但还原会尝试将紫色更改为橙​​色。

换句话说,git revert实际上意味着通过支持重新执行此操作 wile git cherry-pick意味着通过重新执行此操作重新执行此操作。两者都是使用相同的代码在内部实现的(Git称之为 sequencer; 最新版本的Git也使用sequencer来实现交互式rebase)。

答案 1 :(得分:0)

如果您可以容忍完全撤消提交#2,那么git revert是一个选项:

git checkout y
git revert <SHA-1 of commit #2>

这将为你的y分支的HEAD添加一个新的提交,它将在功能上撤消#2提交的所有内容,包括删除前一次提交的重要更改。

答案 2 :(得分:0)

您可以使用git checkout important-commit file1 file2 file3指定您需要的文件。