git中匿名分支和checkout命令

责编:menVScode 2018-03-04 13:50 阅读(1362)

准备工作:新建工作目录,用 git init 初始化项目,分别创建1.txt、2.txt、3.txt,依次对三个文件执行 git add 和 git commit -m 命令。

执行 git log --decorate --oneline --graph --all 命令

git log --decorate --oneline --graph --all

* 0bc27d5 (HEAD -> master) 3.txt
* 8df4cf6 2.txt
* e9ed88e 1.txt


执行 git checkout HEAD~ 执行上一个快照

git checkout HEAD~

Note: checking out 'HEAD~'.

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 8df4cf6... 2.txt

执行 git log --decorate --oneline --graph --all

git log --decorate --oneline --graph --all

* 0bc27d5 (master) 3.txt
* 8df4cf6 (HEAD) 2.txt
* e9ed88e 1.txt

执行 git checkout 命令时,如果不指定分支名,那么git会自动帮你创建一个匿名分支。当你切换到别的分支时,这个匿名分支所做的所有操作提交都会被抛弃掉。


再创建4.txt,执行 git add 和 git commit -m 命令。然后执行 git log --decorate --oneline --graph --all 命令

git log --decorate --oneline --graph --all

* 2fa31e3 (HEAD) 4.txt
| * 0bc27d5 (master) 3.txt
|/
* 8df4cf6 2.txt
* e9ed88e 1.txt


将 HEAD 指向切换到 master:git checkout master。

git checkout master

Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  2fa31e3 4.txt

If you want to keep it by creating a new branch, this may be a good time
to do so with:

 git branch <new-branch-name> 2fa31e3

Switched to branch 'master'


git checkout 命令

1、从历史快照(或暂缓区域)中拷贝文件到工作目录

当给定某个文件名时,git会从指定的提交中拷贝文件到暂存区域和工作目录。比如执行 git checkout HEAD~ README.md 命令,会将上一个快照中的 README.md 文件复制到工作区域和暂存区域中。

如果命令中没有指定具体的快照id,则将从暂存区域恢复指定文件到工作目录(git checkout README.md);

注意:之前命令中文件名前有两个横杠(--),这里又没有了。git提醒你写成“git checkout --README.md“,是为了预防你恰好有一个分支叫做 README.md,那么它就搞不懂你要恢复文件还是切换分支了,所以约定两个横杠(--)后面跟的是文件名。反过来说,如果你确保没有一个 README.md 的分支,你直接写 git checkout README.md 也是没有问题的。

2、切换分支

首先知道git的分支其实就是添加一个指向快照的指针,其次还知道切换分支除了修改 HEAD 指针的指向,还会改变暂存区域和工作目录的内容。


checkout 命令和 reset 命令

1、恢复文件

checkout 命令和 reset 命令都可以用于恢复指定快照的指定文件,并且他们都不会改变 HEAD 指针的指向。

它们的区别是:reset 命令只将指定文件恢复到暂存区域(--mixed),而checkout 命令是同时覆盖暂存区域和工作目录。

注意:也许你试图使用”git reset --hard HEAD~ README.md“ 命令让reset同时覆盖工作目录,但git会告诉你这是徒劳(此时reset不允许使用 --soft 或 --hard 选项)。

这样看来在恢复文件方面,reset 命令要比 checkout 命令更安全一些。

2、恢复快照

reset 命令是用来”回到过去“的,根据选项的不同,reset 命令将移动 HEAD 指针(--soft)->覆盖暂存区域(--mixed,默认)->覆盖工作目录(--hard)。

checkout 命令虽说用于切换分支,但事实上也是通过移动 HEAD 指针和覆盖暂存区域、工作目录来实现的。

3、两者的区别

【1】对于 reset --hard 命令来说,checkout 命令更安全。因为checkout 命令在切换分支前会先检查一下当前的工作状态,如果不是”clean“的话,git不允许你这样做;而 reset --hard 命令则是直接覆盖所有数据。

【2】如何更新 HEAD 指向,reset 命令会移动 HEAD 所在分支的指向,而 checkout 命令只会移动 HEAD 自身来指向另一个分支。

标签: checkout git
前端交流群: MVC前端网(menvscode.com)-qq交流群:551903636

邮箱快速注册

忘记密码