有没有办法对文件进行不同的提交。假设我修改了一个文件 5 次,并且在我已经提交并推送到存储库之后,我想返回更改 2。
在我的理解中,唯一的方法是保留许多分支,我做对了吗?如果我是对的,我将在几天内拥有数百个分支,所以我可能并不真正理解它。
有人可以澄清一下吗?
让我们从对我们想要做的事情的定性描述开始(Ben Straub 的回答中说了很多)。我们进行了一些提交,其中五个更改了给定文件,我们希望将文件恢复到以前的版本之一。首先,git 不保留单个文件的版本号。它只是跟踪内容——提交本质上是工作树的快照,以及一些元数据(例如提交消息)。因此,我们必须知道哪个提交具有我们想要的文件版本。一旦我们知道了这一点,我们就需要进行新的提交,将文件恢复到该状态。(我们不能只是乱搞历史,因为我们已经推送了这个内容,编辑历史会把其他人弄得一团糟。)
因此,让我们从寻找正确的提交开始。您可以很容易地看到对给定文件进行了修改的提交:
git log path/to/file
如果您的提交消息不够好,并且您需要查看每次提交中对文件所做的操作,请使用以下-p/--patch选项:
-p/--patch
git log -p path/to/file
或者,如果您更喜欢 gitk 的图形视图
gitk path/to/file
通过视图菜单启动 gitk 后,您也可以这样做;视图的选项之一是要包含的路径列表。
无论哪种方式,您都可以使用所需文件的版本找到提交的 SHA1(哈希)。现在,您所要做的就是:
# get the version of the file from the given commit git checkout <commit> path/to/file # and commit this modification git commit
(checkout 命令先将文件读入索引,然后将其复制到工作树中,因此无需使用git add将其添加到索引中以准备提交。)
git add
如果您的文件可能没有简单的历史记录(例如重命名和副本),请参阅 VonC 的出色评论。git可以被引导更仔细地搜索这些东西,而牺牲速度。如果您确信历史很简单,则无需费心。
git