在重置和回滚之间做出决定

时间:2017-10-17 09:21:34

标签: git atlassian-sourcetree

最近,我不得不使用SourceTree。每当我意识到我必须在提交之后(或在几次提交之后)撤消东西并且在某个修订版本回到项目状态时,我认为我可以简单地回滚因为我使用git(通过SourceTree)但是,当我双击提交以将其检出并从那里取出时,我总会收到一条警告消息,表明此操作会创建一个分离头等...

我已经看过很多关于硬重置等的帖子......但是我想知道如何只是回滚而不会导致诸如分离头之类的问题,而不必重置所有以前的提交?

我能想出的最佳选择是:

$ git checkout -b <branchName> <commitId>

将创建一个只有指定提交的新分支。

然而,以下似乎也在做我想要的事情:

$ git reset <commitId>

我的理解是两者真的是一样的。是吗?

每个人可能有什么优势?我很乐意听到长期使用git的高级开发人员,所以我可以学习你在几年后发现的东西......

1 个答案:

答案 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的情况下,我们保持在同一个分支上,并在工作目录中保留相同的内容。