git使用介绍
1、安装
首先下载git软件安装,点此下载。
在安装完git之后,打开Git Bash的快捷方式,进入命令行模式。
2、配置
首先我们需要创建一个git仓库的文件夹。
mkdir git
接着创建一个你的工程文件夹,例如是project.
cd git && mkdir project
然后我们进入git文件夹,进行初始化操作。
cd git
git init
git config --global user.name "yourname"
git config --global user.email "youremail"
此时将会在你的git文件夹下生成.git文件,该文件的作用是将会对你上传的代码文件进行取舍,将一些调试用的文件排除。
3、下载
此后,可以进入你的project文件夹,根据远程git仓库的地址,clone一组代码回来。
git clone https://git.oschina.net/.../...git
或者你可以把你的文件放在project文件夹下,然后,和远端git仓库中的代码进行合并。
git pull https://git.oschina.net/.../...git
4、上传
当你修改完你project中的文件后,你需要首先将你的改动提交到你的本地的仓库中。
git add .
git commit -m "your comments"
然后就可以push到你的远程的仓库中(在这之前,首先需要增加一个远程仓库的位置)。
git remote add origin https://git.oschina.net/.../...git
git push -u origin master
此后,会让你填写你的 git@osc
的用户名和密码。
5、版本恢复
使用git最重要的就是版本的恢复了。使用的命令主要有reset和revert。
使用之前使用需要了解一下git内部的实现过程。git主要分为三个部分,工作区,缓存区和本地仓库,这使得git区别于一般的版本控制软件。
当前用户的更改处于工作区内,而当用户使用 git add 命令后则表示用户将当前工作区的更改提交给了缓存区,此时,更改的文件并不是最终的版本,缓存区中的文件依然可以进行操作和增减。而当用户使用 git commit命令时,才真正地将文件的更改提交了一个版本,进入了本地仓库。以后有空的话可以画个图说明。
这就使得有三个空间可以让我们在文件出错的情况下,进行文件版本的恢复。
首先 本地仓库--> 工作区和缓存区
这是比较常用到的一个功能,情况:对当前的文件进行了编辑和存入了缓存区,但是由于谁把你代码改了,或者不知道哪里出现了问题,编译不通过了,可以使用这种方法直接将代码的版本恢复到上一次,或者之前的提交的版本上,使用的命令是 git reset。命令运行的格式如下,其中主要参数有hard,soft,mix三种。下面分别分析。
git reset --参数 HEAD(or 提交版本的hash值)
对于git reset --hard这个命令将会直接改变你的工作区和缓存区,将里面的文件内容变成和之前的版本一样的内容。正是所谓一删到底,彻底地把文件恢复了。
对于git reset --soft这个命令将会将版本库中的内容退回到你想到的版本状态,将缓存区中从你想要的版本状态后的所有文件改动标记为changes to be committed
,将工作区中比缓存区中多出的文件的改动变为untracked files
;
对于git reset --mix这个命令则是系统的默认参数,它的作用是将版本库中的内容退回到你想要的版本状态,将缓存区的内容也退回到你想要的版本状态,将工作区中的内容从你想要的版本后的所有的文件更改标记为untracked files
;
看着有混乱,但是总的来说,git reset使得版本库直接回到你想要的版本状态,但hard将使得工作区和缓存区也同样回去了,而soft使得缓存区没有直接回去,而是将之后的状态标记为未提交,并将工作区中未保存的状态表示为未存储,同理,
mix命令则将缓存区也清空到了原版本状态,而将之后的更改在工作区内表示为为存储状态。
这里,还得说下上面提到的HEAD,HEAD指针始终指向版本库中的最新版本,所以HEAD则表示当前版本库的最新版,HEAD表示上一版本,HEAD^表示上上一版本。如果你想回到一个具体的版本,你可以使用
git reflog
命令,来查看HEAD之前的更新,进而确定要恢复到的版本。
使用git revert就更有意思了,这个命令不是将原来的commit丢弃掉,而是接着你的commit继续往上加,如果你revert到一个版本,那么git将会从当前状态一直将你之前的更改反向地操作一遍,直到到你要回到的版本状态,并提交产生一个新的版本,该版本在形式上是和原来的版本是一样的,但是其实际上经过反向操作而形成的版本。
所以有人很奇怪,为什么有了reset还需要revert呢,这是因为使用的场合不同,reset只是将本地的版本进行更改,如果版本没有上传到远端,可以随意修改,但是revert则是继续增加新的版本,这样就算是文件上传到了远端,revert后进行push也还是没有问题的。
其次 缓存区--> 工作区
这里的意思是,文件修改后,add到缓存区了,还没有提交,现在对于缓存区的文件不想要了,或者当前文件改变后不正常,想从缓存区中搞点文件下来,这里需要进行一些操作。
对缓存区的文件的操作有一些命令,删除:
git rm --cached files
同时,如果想把文件从缓存区内拿出来,则可以使用命令:
git checkout files
最后 工作区清空
做了半天,发现没必要,同时git也没有存入缓存区,于是,使用一个命令解决掉你痛苦的一天吧:
git clear -df
一切恢复平静。
另外,还需要注意的git建立分支,使用ssh的操作等以后更新吧。
6、注意及其他
5.1 需要更改你的分支名
一般你的文件夹下你的分支名是master,而如果你要更改分支名的话。使用以下命令。
git branch /* 查看当前的分支 */
git branch hello /* 创建一个名为hello的分支 */
git checkout hello /* 将当前的分支改为hello分支 */
5.2 git 报错
(错误1) Updates were rejected because the tip of your current branch is behind its remote counterpart. Merge the remote changes (e.g. ""git pull"") before pushing again.
解决方法: 首先在当前的project下,进行一次
git pull https://git.oschina.net/.../...git
然后再进行commit以及push操作。
(错误2) warning: LF will be replaced by CRLF
解决方法: 这是由于Windows和Linux的文件结束符不一致导致的。需要删除.git,并重新配置。
rm -rf .git
git config --gobal core.autocrlf false
接着就可以重新 init 了。