git checkout 和 git reset 区别
首先需要知道工作区(working diretory)和暂存区(Stage)这两个概念。工作区的该概念不仅包含你实际操作、更改的文件还应当包括当前修改但未add存入暂存区的文件变化信息,暂存区的作用则是临时存储文件的变化信息,在git add file操作之后,暂存区中将记录file文件上的修改信息。暂存区的存在更细化了时间节点,要知道commit的往往是有重大改变的版本或者是在一次修改工作整体完成之后才使用commit。而在这之间需要保存的修改,自然需要一个缓存区暂时存放。
廖雪峰的git教程中在“撤销修改”部分中,提到了几种情景和相应的git checkout与git reset命令。通过我的分析,在这个更直接地分析这两个命令的含义。
git checkout -- file;撤销对工作区修改;这个命令是以最新的存储时间节点(add和commit)为参照,覆盖工作区对应文件file;这个命令改变的是工作区
git reset HEAD -- file;清空add命令向暂存区提交的关于file文件的修改(Ustage);这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化
git push 与pull的默认行为和-u参数的意义
https://www.zhihu.com/question/20019419
https://segmentfault.com/a/1190000002783245
git checkout 与 git reset 进阶
http://www.tuicool.com/articles/A3Mn6f
报错信息
1.git checkout时 <> 字符串引起错误
省略<>即可
2.本地向远处push时出现 failed to push some refs to...
可能由于远程版本库与本地冲突导致。解决办法:
git pull --rebase origin master 合并代码
git push -u origin master 上传代码到github
3.显示乱码
git config --global core.quetepath false
4.Pull is not possible because you have unmerged files.
应该是因为local文件冲突了
解决方法:
以下方法引用自网络――
1.pull会使用git merge导致冲突,需要将冲突的文件resolve掉 git add -u, git commit之后才能成功pull.
2.如果想放弃本地的文件修改,可以使用git reset --hard FETCH_HEAD,FETCH_HEAD表示上一次成功git pull之后形成的commit点。然后git pull.
注意:
git merge会形成MERGE-HEAD(FETCH-HEAD) 。git push会形成HEAD这样的引用。HEAD代表本地最近成功push后形成的引用。
就我的经验,有时候会莫名其妙地出现这种状况,而且Untracked files 还特别多(实际上自己可能只改了一两个文件),所以只好先保存好自己确定做出的local的修改,然后用git reset --hard FETCH_HEAD回到上次成功pull之后的点,然后再pull就没有问题了
5.You are not currently on a branch.
症状:有一次pull的时候又出现冲突,这回用“git reset --hard FETCH_HEAD”方法都不行了,出现:
$ git pull
You are not currently on a branch, so I cannot use any
'branch..merge' in your configuration file.
Please specify which remote branch you want to use on the command
line and try again (e.g. 'git pull ').
See git-pull(1) for details.
解决方法:
首先git checkout -b temp
其次git checkout master
即可恢复到master repository的状态,然后就可以pull了