在重置和回滚之间做出决定
Deciding between resetting and rolling back
最近,我不得不使用 SourceTree。每次我意识到我必须在提交后(或几次提交后)撤消某些内容并返回到某个修订版的项目状态时,我假设我可以简单地回滚,因为我使用 git (通过 SourceTree)但是当我双击提交以检查它并从那里取出它时,我总是收到一条警告消息,指出此操作将创建一个 分离的头 ,等等。 ..
我看过很多关于硬重置等的帖子...但我想知道如何才能 回滚 而不会导致分离头等问题,然后,而不必重置所有以前的提交?
我能想到的最佳选择是:
$ git checkout -b <branchName> <commitId>
这将创建一个新分支,该分支仅通过指定的提交。
然而,以下似乎也是我想要的:
$ git reset <commitId>
我的理解是,两者真的是一回事。是吗?
每个人可能有什么优势?我很想听听长期使用 git 的高级开发人员的意见,这样我就可以学到一些你在几年后发现的东西......
这两个命令给出不同的结果。
要了解 git checkout -b <branchName> <commitId>
和 git reset <commitId>
之间的差异,最好的办法是进行实验。创建一个新的空目录和 运行 以下命令:
(初始化,常见场景)
# 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 的新分支并切换到它。这个新分支只包含第一次提交。分支master完好无损
(重置)
git reset HEAD~1
结果:
我们留在分支 master 上,最后一次提交被删除但其内容保留在工作目录中。
总而言之,我们可以说在这两种情况下我们看到了相同的提交日志。但是在 git checkout -b <branchName> <commitId>
的情况下我们创建了一个新的分支,而在 git reset HEAD~1
的情况下我们留在同一个分支上并在工作目录中保持相同的内容。
最近,我不得不使用 SourceTree。每次我意识到我必须在提交后(或几次提交后)撤消某些内容并返回到某个修订版的项目状态时,我假设我可以简单地回滚,因为我使用 git (通过 SourceTree)但是当我双击提交以检查它并从那里取出它时,我总是收到一条警告消息,指出此操作将创建一个 分离的头 ,等等。 ..
我看过很多关于硬重置等的帖子...但我想知道如何才能 回滚 而不会导致分离头等问题,然后,而不必重置所有以前的提交?
我能想到的最佳选择是:
$ git checkout -b <branchName> <commitId>
这将创建一个新分支,该分支仅通过指定的提交。
然而,以下似乎也是我想要的:
$ git reset <commitId>
我的理解是,两者真的是一回事。是吗?
每个人可能有什么优势?我很想听听长期使用 git 的高级开发人员的意见,这样我就可以学到一些你在几年后发现的东西......
这两个命令给出不同的结果。
要了解 git checkout -b <branchName> <commitId>
和 git reset <commitId>
之间的差异,最好的办法是进行实验。创建一个新的空目录和 运行 以下命令:
(初始化,常见场景)
# 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 的新分支并切换到它。这个新分支只包含第一次提交。分支master完好无损
(重置)
git reset HEAD~1
结果: 我们留在分支 master 上,最后一次提交被删除但其内容保留在工作目录中。
总而言之,我们可以说在这两种情况下我们看到了相同的提交日志。但是在 git checkout -b <branchName> <commitId>
的情况下我们创建了一个新的分支,而在 git reset HEAD~1
的情况下我们留在同一个分支上并在工作目录中保持相同的内容。