git命令使用

什么是git

Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

GIT的使用

msysgit是Windows版的Git,从http://msysgit.github.io/下载,然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功


安装完成后,还需要最后一步设置,在命令行输入:

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。
注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

了解基本命令

git clone 从远端拉取仓库
git init 初始化一个仓库
git add 添加到缓存区
git commit -m 修改 添加到仓库
git diff 查看修改的具体内容
git reset --hard 版本号 跳转到指定版本号
git log 查看所有的修改的版本号
git status 查看文件状态

您不必现在就了解这些命令的使用,后文会初步解释每个命令的使用。

理解概念:工作区,暂存区,仓库


add的操作是把所有的更改暂时放在暂存区,commit操作就是真正的提交我们的代码


如果你试图修改,绕过了add部分的话,你提交的代码是无法真正进入仓库的,这是因为commit 的是暂存区内的内容,而你必须将你所做的修改add到暂存区才能commit成功。

创建GIT仓库
  1. 创建存放git的文档目录(新建一个文件夹)mkdir mycode
  2. 进入这个文件夹的目录 cd mycode
  3. 在这个文件夹下执行git init 命令,创建一个仓库
  4. 告诉git ,我们要跟踪哪些文件的修改,默认git只能跟踪文本类的文件修改,不包括图片、视频等。Git add * 或者具体的某个文件git add 文件名
  5. 把我们的文件正式提交到仓库中去git commit -m 备注的信息,最好备注下;
查看状态

git status 查看我们跟踪文件的状态,时刻掌握我们的仓库状态
git diff 查看具体哪儿被修改了,新增的内容又是哪些
如果我们修改了我们的文件,那么我们就需要继续的add commit 提交最新的修改。
注意:git commit -a合并了add commit 两个操作,只不过它只适用于旧文件的修改,新文件依然要添加add commit

如果出现被锁的情况,只需要删除.git 下面的index.lock 文件即可 rm .git/index.lock 具体原因不明

Git commit -a 后会出现 vim编辑器,这个编辑器的简单使用掌握下就OK了
要随时掌握工作区的状态,使用git status命令。
如果git status告诉你有文件被修改过,用git diff可以查看修改内容。

查看我们的记录log

我们不停的修改,提交,修改,提交!
git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
对的,我们所有的修改提交都有记录在这里,并且可以通过命令来还原原来的版本
git log 查看当前的操作记录
git reset --hard 版本编号ID 或者是HEAD ^ 回到上一个版本中去
当你从新版本回到老版本的时候,我们的新版本自然就消失了,所以,如果你想回复到新版本的状态,你可以使用git reflog 查看下你每次的操作命令,并记录下版本ID编号,再次使用 git reset --hard 版本编号ID 回到新版本中去。
现在总结一下:

HEAD指向的版本就是当前版本,因此,git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

也就是说:
现在有3个版本
版本号:333
版本号:222
版本号:111
我现在用git reset —hard 222 退回到222版本,
git log 后 就看不到333版本了
必须要用git relog才能看到222之前的333版本号
然后在通过git reset —hard 333 恢复到333

撤销你的修改

我们有时候会希望撤销我们的更改,这时一般可以分为三种情况:

  1. 当你只是在源文件中修改了,而并没有add到暂存区的情况;
  2. 当你不仅在源文件中修改了,并且还add了到了暂存区,索性的是你并没有commit 的时候;
  3. 当你已经commit提交到仓库的时候。

下面,分别尝试着解决这三种情况

  1. git checkout -- 修改的文件名

感觉更像把暂存区退回到了工作区

  1. git reset HEAD readme.txt (文件名) 把暂存区的修改回退到工作区,也就是退回add之前的状态,最后再次git checkout readme.txt结束;

感觉更像是从仓库一路退回到了暂存区,然后又退回到了工作区

  1. 如果你已经commit 了,就直接用版本回溯到之前的版本就OK了(git reset —hard 版本号)。

感觉reset命令就是为了在不同的仓库版本中切换

删除文件

尽量用git rm 文件名删除(暂存区中删除),然后git commit 提交到版本库。
如果误删的情况下,也就是说你只是在工作区误删了文件的话,可以用git checkout -- 文件名恢复(从暂存区恢复)

小结

第一步 : 在需要git 管理的文件夹下打开git base here
第二步:在git中进行项目管理的初始化 git init
第三步:在git中创建自己的项目文件;
第四步:通过git add * 将所有的项目文件添加进去临时区域内;
第五步:通过git commit -m 操作说明 将临时区域内的项目推送到本地的仓库上去;
第六步:对项目进行修改之后,可以先看看修改了哪些东西,使用git diff
第七步:确认完修改之后,可以通过git commit -a -m 操作说明 来进行上传了;
第八步:如果需要切换版本,只需要通过git reflog 查看下自己的操作历史,然后通过git reset --hard 版本号 就可以自由的切换不同的状态了。
第九步: 如需删除文件,使用git rm 文件名 来进行删除,然后通过git commit -a -m 提交
第十步:如果发生在本地误删的情况,可以直接使用git checkout把临时区域的内容拉到本地

以上的知识只是个人在用的时候本地代码的一个管理而已,并不涉及远程多人共同协作,如果你只是在本地管理代码的话,上面的命令足够你使用了,因为毕竟你知道了如何让自己的代码库添加、删除、和回溯。代码的每一次修改也都会做记录,你可以随时恢复最新的版本和退回老的版本,并且比较每次代码的不同之处,找到原因。

连接远程仓库
$ ssh-keygen -t rsa -C "[email protected]"

创建自己的ssh密钥,用于跟远程的服务器进行通信,它毕竟得知道这个是你亲自推送的代码才行。
要关联一个远程库,使用命令

git remote add origin git@server-name:path/repo-name.git

将我们本地的仓库与远程的github 上的仓库连接起来
下一步,我们开始推送我们本地仓库上的内容
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:

git push -u origin master

此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

上面是从本地上传到远程库上去
如果想要从远程库中克隆一份,那么就使用git clone git 地址就可以了
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
说白了,克隆和推送都是为了创建本地和远程的一个连接,只要第一步连接好了,我们就可以进行下一步的操作了;

分支管理

我们可以使用git的分支管理功能,把项目分为开发版本、测试版本、生产版本,方便我们在工作中对代码进行管理。

git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>

结合版本回溯,master是主分支,各个分支点都是历史版本,目前指向最新的版本上

创建一个新的分支,叫做dev

目前我们的操作是在dev 分支上的,自然,我们现在就指向了dev,它跟master没什么关系了。

dev分支合并到主分支上去,分支其实就是为了在不影响主代码的情况下进行代码修改,根据实际情况跟最后的版本进行合并。
这里,我们要考虑一种情况,就是如果我在分支dev中修改了内容,同时,我又在主分支master中修改了内容,那么它们合并的时候一定会出现问题!!!

这里,不去考虑复杂的合并分支情况,一般我们开发的话,都会在分支上进行开发,确定没问题之后,合并到主分支中去。

实际情况的考虑

远程分支和本地分支
两条分支最好是一一对应的, master分支和dev分支在本地和远程都有两条;
创建分支确实挺容易的,也不复杂,这里就不考虑创建分支的成本性了。你可以理解为创建分支就是又创建一个工作区-暂存区-仓库这样的仓库2,现在你就拥有了仓库1仓库2了。
目前感觉分支的操作都是在本地操作的,也就是针对本地分支的合并啊,在本地合并之后,再往同名的远程分支中push,那远程分支怎么完成合并呢?


一般我们git clone下网站源码的时候,默认情况下是主分支是有的,但其余的分支是没有的,这时候我们就需要在本地创建新的分支,这些分支对应着远程中的分支,然后将分支中的代码pull到本地去,比如远程的dev 分支要这么操作:

git clone SSH地址 //克隆整个项目(默认得到的就是主分支,其他分支并没有)
git checkout -b dev  //在本地创建分支
git pull origin dev //从远程的DEV分支拉到本地的dev分支
git add ...
git commit ...
git push origin dev //修改完毕后传递到远程的dev分支上去

假设远程公共仓库,有一个master和一个dev分支,进行多人协作开发时候(每个人的公钥必须加入到远程账号下,否则无法push), 每个人都应该clone一份到本地。 但是clone的只是master,如果远程的masterdev一样,没关系;如果不一致,则需要clonedev分支 git checkout -b dev origin/dev 之后每个人在本地的dev分支上独自开发(最好不要在master上开发), 开发完成之后push到远程dev git push origin dev。 之后审核人再确定是否合并devmaster

在进行任何的push 操作之前,一定要先 pull 一下远程的分支代码,毕竟这个分支代码是被很多人修改的,你只有最新的版本才能和自己的修改合并才行。

结语

到此,关于git的日常基本操作就基本完成了,更多的git语法请移步git官网

感谢李致远老师(https://github.com/aylizhiyuan)提供学习资料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章