Git 使用:
基本概念
[此图源于互联网]
使用Git之前需要有几个基本概念
三棵树, 也就是根据时间线串起来的三个标签区.
- history 是我们保存一个完整的一些列修改的地方,可以认为是最终的仓库.
- index 暂存区,
- workspace 实际工作路径
一个关键的操作:
我的理解, 工作区中的文件如果不add(添加到index) 或者commit (从index 添加到history) ,那么这个文件与git关系不大.也不会被版本控制管理.
Git reset
用来重置, 三种模式.
--soft
将指定 commit ID 之后的修改同时放到index和workspace中
--mixed 默认模式,
将指定commit ID之后的修改直接放到workspace中
--heard
将指定commit ID 之后的修改直接全部丢弃,在 history index 和workspace 都清空
关于用到git reset 命令的情景
1. 远程与本地冲突
error: Your local changes to the following files would be overwritten by merge:
scripts/convert_gtf_2_genefuse.py
Please, commit your changes or stash them before you can merge.
Aborting
如下问题的时候,表明其他人和我们同时修改了一个文件,并且人家先提交到了github, 我们此时有两种方法来解决.:
1. 保留我们自己本地的文件
git stash (将未commit的文件(其实也就是同时修改的文件)进行暂存
git pull 将远程commit 拉倒自己的本地
git stash pop 从暂存区恢复暂存的文件
2. 保留远程文件:
直接使用git reset --hard
git stash
git stash 是一个commit 的替代品, 一般commit 的都是一个比较完善的修改, 而stash 可以暂存而不是commit. 暂存后可以切换分支.
一般认为 git stash 的使用情景是:
但是假设你在dev分支修改了某些文件,但这时候你不想提交(因为你还没改完)。注意:
如果你不先提交的话,git 切换分支时会把你未commit的文件(包括未track和已track但未放入暂存区及已放入暂存区但未commit的文件)带到另一个分支,这时候怎么办呢?- 发现有一个类是多余的,想删掉它又担心以后需要查看它的代码,想保存它但又不想增加一个脏的提交。这时就可以考虑
git stash
。- 使用git的时候,我们往往使用分支(branch)解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码, 如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码
commit
提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必要的记录。其实如果我们不想提交完成一半或者不完善的代码,但是却不得不去修改一个紧急Bug,那么使用git stash
就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修Bug,等到修完Bug,提交到服务器上后,再使用git stash apply
将以前一半的工作应用回来。- 经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是
git stash
命令。储藏(stash)可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。
Git checkout
Git checkout 有两种用途,
1. 恢复工作区(主要是用来从index来恢复)
通过这六步操作 我觉得git checkout -- <file>指令应该是从先从缓存区中拉取版本还原,如果没有再到版本库中拉取还原。在之后重新翻看廖神博客时,发现廖神在这句话的前一章对这句指令的解释是
命令格式: git checkout -- file
2 .切换分支
命令格式: git checkout branch_name