《21世纪C》翻译网站
第4章 版本控制为了更好的理解git, 以下有几句话是非常重要的。一旦你能理解这几句话,你就可以从git纷繁复杂的命令中看到本质,否则很容易迷失。
- HEAD和master都是引用,master指向一个提交,而HEAD指向一个分支,如master。
- checkout 后接路径和文件的时候,不会改变HEAD指针,否者会改变HEAD指针,这个时候原理上来说,应该后接一个branchname, 否者处于头分离的状态。
- reset 后接路径只会替换index, 但是如果不接路径,那么就会重置引用。这个时候分别有--hard, --soft和--mixed选项。也就是说,如果你处于master分支,那么他把master引用改变到你指定的commit,后面的commit将丢失,除非你使用git reflog show master来重新查看master指向的历史记录。
- HEAD必须指向一个分支,如果它不指向分支,那么它就处以一种头分离的状态。这种状态下的提交,或者你可以通过git checkout master, 把HEAD重新置回master分支,这个时候如果你想保存头分类状态下的提交,你可以先用git reflog得到过去的那个最后的提交,如acc123,然后使用git merge命令来进行融合。
- 如果你处于头分离状态,使用reset不会改变分支指向的位置,这很显然,如果你有多个分支,reset不知道你要改变那一个。这个时候,你必须要用checkout branchname来切换到一个分支。checkout 把HEAD指向了branchname,结束了头分离(无分支状态)。然后用reset命令把branchname分支切换到特定的提交,这个以后,HEAD始终指向的就是branchname。
- reflog 语法中的HEAD@{1}是非常有用的,尤其是在处理头分离问题中HEAD的变换过程中,我想知道上一个HEAD指向哪里。