如果我使用Team Foundation Source Control,我可以轻松回滚到旧的变更集。
假设我有一个包含4个版本的文件,每个版本都有一个变更集:
现在我在版本3和版本4中发现了很多错误,我想快速返回版本2。
在Visual Studio中,我可以单击文件上的“查看历史记录”,单击“更改集”b347(“版本2”),然后单击“回滚”。
现在我在版本2中有一个新的变更集,我可以签入它(我的历史记录中仍然有3/4版本,所以我也可以在某个时候返回它们)。
在Git,我知道有revert
,reset
(硬,软)但我不知道我需要做什么来达到相同的结果。
那么在Git中回滚到旧版本的最佳方法是什么(首选通过Visual Studio)?
假设你有4个提交A-B-C-D
,文件foo.txt
在每个中都有变化,C
和D
的代码有foo.txt
引入的bug。
1.可以在C和D中更改其他文件。如果要仅将foo.txt
回滚到B
的版本:
git checkout B -- foo.txt
如果要提交回滚,
git commit
历史将是A-B-C-D-R1
。
2.如果要回滚C和D的所有更改(包括其他文件的更改),并且CD已被推送到远程存储库:
git revert D C
历史将是A-B-C-D-R2-R3
。
3.如果要回滚C和D的所有更改,并且CD尚未推送到远程存储库:
git reset B --hard
历史将是A-B
。您也可以将此解决方案用于案例2,但是您需要强制推送分支以覆盖远程存储库中的分支。如果其他贡献者已经获取旧历史记录,则需要告诉他们获取新历史记录。
git reset --hard b347
git push -f origin master
这完全消除了c560
和d912
,但之后你需要强制推动。
见What's the difference between Git Revert, Checkout and Reset?
要撤消创建新提交的更改:
git revert d912 c560
不知道TFVC中有什么签到,但是如果你只是想查看v2文件,你可以git checkout b347 -- thefilenameyouwant
要继续处理工作副本中存储库的v2状态,您可以执行此操作
# get uncommitted changes out of the way
git stash
# recreate v2 in the working copy
git checkout commit-hash-or-tag-of-v2
# create new branch based on v2
git checkout -b branchname-for-new-branch
它很简单:
git reset --hard b347
说明:
git checkout b347
git checkout -b redo-work-from-version-2
说明:
redo-work-from-version-2
的新分支。