在过去的几个月中,我已经多次开发了一个功能代码,将该功能提交到git存储库,然后在稍后决定删除其中的一些功能。为了保持代码库清洁,我最终必须做的是删除一个文件或者提交给git并提交这些更改的文件部分。
但是,为了以后可以轻松恢复已删除的代码,我还需要在其他位置克隆存储库,在删除之前检出提交,复制已更改的文件(使用同上,甚至有时手动)然后将更改提交到新分支。这个额外的步骤使我能够在分支中抽象删除的特征,并通过合并分支在稍后阶段很容易地将特征恢复到代码库中。
这是一种常见的做法,更重要的是我错过了一个允许我开箱即用的git功能。如果是这样,那么实现这一目标的命令是什么?
答案 0 :(得分:3)
git checkout <sha1> filepath/filename
将修订版sha1中的文件转换为您的工作副本。
git revert
将还原包含合并提交的提交所做的更改。你也可以恢复还原。
请不要克隆,因为过程太重,结帐工作要快得多。
答案 1 :(得分:3)
假设您在Git的git存储库中工作,并且您有一个好主意。
$ git rm -rf Documentation $ git commit -m 'Documentation is for the weak'
这导致以下历史记录。 (注意:git lol
是一个非标准但非常有用的别名。)
$ git lol * d55a922 (HEAD, master) Documentation is for the weak * 443d803 (origin/master, origin/HEAD) Merge branch 'maint' |\ | * 8d44277 (origin/maint) Update draft release notes to 1.8.1.5 | * 6f0c336 Merge branch 'ef/non-ascii-parse-options-error-diag' into maint | |\ ...
为了给自己一个重新调整,在新的提交时检查一个分支并在那里恢复。
$ git checkout -b mulligan/delete-all-documentation $ git revert --no-edit HEAD
现在用
$ git checkout master
你可以回去工作。
假设您向master添加新提交,那么您的历史记录将变为
$ git lola * b4d76d9 (HEAD, master) Add new feature X | * 84b0e21 (mulligan/delete-all-documentation) Revert "Documentation is for the weak" |/ * d55a922 Documentation is for the weak | * 46b564f (origin/pu) Merge branch 'pc/subtree-add-before-fetch' into pu ...
这不是常见做法。只有当git merge
或git cherry-pick
干净利落时,即如果没有对您删除旧功能的代码应用其他更改,则恢复该功能将非常简单。沿着这条路向下看,看看它的规模有多么糟糕。要恢复旧功能,开发人员必须筛选一堆分支以找到合适的分支才能复活。 Git拥有优秀的支持搜索历史记录,我们从缺乏这些长期存在的mulligan分支看到这是一种常见的做法。