最近,我不得不使用SourceTree。每当我意识到我必须在提交之后(或在几次提交之后)撤消东西并且在某个修订版本回到项目状态时,我认为我可以简单地回滚因为我使用git(通过SourceTree)但是,当我双击提交以将其检出并从那里取出时,我总会收到一条警告消息,表明此操作会创建一个分离头等...
我已经看过很多关于硬重置等的帖子......但是我想知道如何只是回滚而不会导致诸如分离头之类的问题,而不必重置所有以前的提交?
我能想出的最佳选择是:
$ git checkout -b <branchName> <commitId>
将创建一个只有指定提交的新分支。
然而,以下似乎也在做我想要的事情:
$ git reset <commitId>
我的理解是两者真的是一样的。是吗?
每个人可能有什么优势?我很乐意听到长期使用git的高级开发人员,所以我可以学习你在几年后发现的东西......
答案 0 :(得分:1)
这两个命令会产生不同的结果。
要查看git checkout -b <branchName> <commitId>
和git reset <commitId>
之间的差异,最好是进行实验。创建一个新的空directoy并运行以下命令:
(初始化,常见情景)
# Common commit
git init
echo a > a; git add .; git commit -m"a"
echo b > b; git add .; git commit -m"b"
(结帐)
git checkout -b branch1 HEAD~1
结果:我们创建了一个名为branch1的新分支并切换到它。这个新分支只包含第一个提交。分支机构主管完好无损。
(复位)
git reset HEAD~1
结果: 我们留在分支主机上,最后一次提交被删除,但其内容保留在工作目录中。
总之,我们可以说在这两种情况下我们都看到相同的提交日志。但是在git checkout -b <branchName> <commitId>
的情况下,我们创建了一个新的分支,在git reset HEAD~1
的情况下,我们保持在同一个分支上,并在工作目录中保留相同的内容。