将删除移动到git中的分支

时间:2013-03-01 16:15:58

标签: git

在过去的几个月中,我已经多次开发了一个功能代码,将该功能提交到git存储库,然后在稍后决定删除其中的一些功能。为了保持代码库清洁,我最终必须做的是删除一个文件或者提交给git并提交这些更改的文件部分。

但是,为了以后可以轻松恢复已删除的代码,我还需要在其他位置克隆存储库,在删除之前检出提交,复制已更改的文件(使用同上,甚至有时手动)然后将更改提交到新分支。这个额外的步骤使我能够在分支中抽象删除的特征,并通过合并分支在稍后阶段很容易地将特征恢复到代码库中。

这是一种常见的做法,更重要的是我错过了一个允许我开箱即用的git功能。如果是这样,那么实现这一目标的命令是什么?

2 个答案:

答案 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 mergegit cherry-pick干净利落时,即如果没有对您删除旧功能的代码应用其他更改,则恢复该功能将非常简单。沿着这条路向下看,看看它的规模有多么糟糕。要恢复旧功能,开发人员必须筛选一堆分支以找到合适的分支才能复活。 Git拥有优秀的支持搜索历史记录,我们从缺乏这些长期存在的mulligan分支看到这是一种常见的做法。