代码世界

再议git的checkout, revert, 和reset命令

2017-12-20  本文已影响6人  CodingCode

再议git的checkout, revert, 和reset命令

这三个命令都是git用于回退,修正错误的命令。

三个基本概念

Working Directory(工作区) <--> Staged Snapshot(暂存区) <--> Commit History

git checkout

迁出历史版本文件。

用法
git checkout <branch> # 这个是切换branch,不讨论
git checkout <commit> # 这个命令很难用, 我不知道怎么用?
git checkout <commit> -- <file> #连续两个连号(--)表示后面是文件名,而不是分支名。

功能

补充一点 git checkout <commit>的用法
通常把某个<commit>迁出后,在迁出的代码上拉一个新的分支,然后在新的分支里面继续做开发,最后提交新分支的代码。

$ git checkout <commit>
Note: checking out '<commit>'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at <commit>... <description>
$ git status
# HEAD detached at <commit>
nothing to commit, working directory clean
$ git branch
* (detached from <commit>)
  <current_branch>
$ git checkout -b test_branch    
Switched to a new branch 'test_branch'
$ git status
# On branch test_branch
nothing to commit, working directory clean
$ git branch
  <current_branch>
* test_branch

git revert

revert的作用是翻转一个commit;作用对象是一个commit,把它所有的改动翻转。
revert不能翻转单个文件,只能对一个完整的commit翻转。这个commit可以是最新的commit,或者历史上的任何一个commit。

用法
git revert <commit>
git revert HEAD~1

功能

git reset

reset的作用是回退到之前的某一个状态
reset既可以作用于commit,也可以作用于file

注意和revert的区别,revert作用于具体一个commit,而reset是commit所处的那个点的状态,所以那个点之后的信息全会被丢弃,包括历史,即那个点之后的所有操作历史都丢弃了。
也就是说以前的操作历史都被抹去了,是不是很开心,犯了错误找不到痕迹了?(想的美:-))

用法
git reset <commit> [<file>]
git reset HEAD~2 [<file>]

功能

注意reset之后,<commit>之后的操作历史都丢弃了,因此这个命令不能用在公共的分支上,也不能用在已经push到服务器上的分支上;所以通常在私有的分支上做reset操作。
因为如果分支已经push到服务器了,在reset完之后status命令会告诉你,当前分支已经落后服务器上的分支了,需要你重新从服务器pull下代码来,这样相当于reset没有用白做了嘛;而你如果想push到服务器,git直接就给你失败,因为你已经落后了。

三个选项
--soft – staged和当前工作区都不更新. (很少用到这个选项)
--mixed(default) – staged更新,但当前工作区不更新
--hard – staged和当前工作区都更新

git diff

缺省情况下git diff比较的是当前工作区和Staged区的文件差异。

上一篇 下一篇

猜你喜欢

热点阅读