git介绍
分布式版本控制系统
SVN是集中式版本控制系统,版本库放在中央服务器,干活首先要从中央服务器得到最新的版本,然后干活,干完后把自己做的活推送到中央服务器。而且集中式版本控制系统是必须联网才能正常工作。
Git是分布式版本控制系统,没有所谓中央版本控制系统,每个人的电脑就是一个完整的版本库,工作的时候无需联网。
git安装配置
官网下载傻瓜安装, 安装完成后,需要在git bash中进行配置:
配置你的名字和Email地址
$ git config --global user.name "Your Name"
$ git config --global user.email "1042426695@qq.com"
之后我们可以查看一下用户名和邮箱(自己的用户名和邮箱)
$ git config user.name
$ git config user.email
是否报错,报错进行如下操作: 打开如下路径下的文件C:\Users\Administrator.git
打开config,进行修改: [user] email = 1042426695@qq.com name = Your name
Git本地仓库操作
创建版本库
版本库(repository)也叫做仓库,可以看作是一个目录,这个目录里的所有文件都由Git进行管理,每个文件的修改、删除、Git都能跟踪。
1、找一个合适的地方,创建一个空目录
$ mkdir learngit
$ cd learngit
$ pwd
2、通过git命令把这个目录变成Git可以管理的仓库
$ git init
Initialized empty Git repository in /Users/Administrator/learngit/.git/
这样git就把仓库建好了,在目录文件下多了一个.git的目录,这个目录是Git用来跟踪管理版本库的。
3、把文件添加到版本库
我们在learngit目录下编写一个readme.txt文件,内容如下:
Git is a version control system.
(1) git add命令,把文件添加到仓库:
$ git add readme.txt
执行以上代码,没有任何显示。 (2)git commit命令,把文件提交到仓库:
$ git commit -m "wrote a readme file"
(3)修改文件 修改readme.txt中的文件。 运行git status命令查看文件状态,add之后状态改变,commit之后清空。 git ls-files命令是用来查看暂存区中的文件信息
$ git status
可以看到readme.txt文件的状态为modified,意为被修改,但是没有提交。 如果我们想知道上次修改了什么地方,可以使用git diff readme.txt 接下来还是前两步: git add git commit (4)版本退回 如果我们继续对readme.txt进行修改,git仓库里已经有三个版本的readme,我们可以用git log命令进行查看: git log查看日志 可以加上–pretty=oneline参数 现在如果我们想把readme.txt文件退回到上一个版本,就可以用git reset命令:
$ git reset --hard HEAD^
版本退回之后用cat查看一下readme.txt的内容 我们这时又想让其回到刚刚那个最新的版本: 还是用git reset命令:
$ git reset --hard 1094a
这里就不能用HEAD了,要用commit id,下面为获取commit id的方法:
获取完整commit id: git rev-parse HEAD
获取短commit id: git rev-parse --short HEAD
工作区和暂存区
工作区(Working Directory)
learngit 文件夹就是一个工作区
版本库(repository)
工作区中的隐藏目录.git,这个不算工作区,而是Git的版本库。
版本库里面的index(stage)文件叫暂存区,还有Git自动为我们创建的第一个分支master,以及指向master的一个指针叫做HEAD。
结构如上图。 前面提到的如果我们要把文件添加到Git里面,需要两步:
第一步git add把文件添加进去,实际上就是把文件添加到暂存区。
第二部git commit提交更改,世界上就是把暂存区的所有内容提交到当前分支。(我们目前就只有唯一一个分支master,所以现在就是向master分支提交更改)
例如: 新建一个license文件,编写任意内容,再将原来的readme.txt文件内容进行修改。 查看git status就可以看到这两个文件一个状态为new file,一个状态为modified。 这是暂存区的状态就变为: 这时我们使用git commit将暂存区的文件进行提交到master分支。 提交后,再git status就可以看到暂存区就变成干净的。
修改管理
Git跟踪、管理的不是文件,而是修改。
例如我们对readme.txt文件进行修改,然后 git add readme.txt 将其加入缓存区 然后再修改readme.txt随后 git commit -m “git tracks changes”
这时通过git status查看状态,可以看到还是有一个modified:readme.txt 第二次修改并未提交,工作区的第一次修改被放入缓存区,准备提交,而工作区的第二次修改没有放入缓存区, 所以,git commit命令只是负责把缓存区的修改提交了。
提交后,我们可以用git diff HEAD – readme.txt 命令去查看工作区和版本库里面最新版本的区别。
撤销修改
假如我们刚刚对readme的修改有点错误,想删除最后一行:
(1)当我们没有git add放入缓存区时,可以手动删除; 也可以通过git checkout – readme.txt 该命令意为撤销在工作区的修改。 这里的checkout意为检出的意思,将HEAD指向某个分支最近的一次commit,然后从commit恢复index,最后index恢复工作区。 也可以理解为将暂存区/版本库的版本拉到工作区进行替换。
(2)当我们已经git add放入缓存区之后,但是没有git commit时, 可以使用git reset HEAD readme.txt将暂存区的修改撤销掉,重新放回工作区。 git reset不仅可以回退版本也可以将暂存区的修改回退到工作区。
删除文件
在learngit文件夹下创建一个test.txt,这时候用rm命令删除,rm test.txt 之后就分为两种情况: (1)确实要删除,用git rm删除,并且git commit -m 'remove test.txt’提交删除。 这时候文件就从版本库中被删除了。 (2)文件被删错了,因为暂存区/版本库里有文件,所以很好恢复:git checkout HEAD – test.txt用版本库里的替换工作区里的。
Git与远程仓库交互
以Github为例
首先,创建github账号,因为本地git仓库和github之间通过ssh加密传输,所以需要: (1)创建SSH key,在用户主目录下users/administrator/.ssh 下面,没有就在git bash中: 查看有无:~/.ssh 创建:ssh-keygen -t rsa -C ‘邮箱’ 默认生成id_rsa 和 id_rsa.pub两个密钥文件。 (2)登录Github,打开Account setting,点击Add SSH and GPG Keys,点击New SSH Key的创建,填上任意 Title,把id_rsa.pub中的内容复制到key文本框中确认。
添加远程库
目前我们本地已经有了一个Git仓库,需要在Github上创建一个远程仓库,用来备份和与他人协作开发。本地库和远程库远程同步。
首先,在github中’Create a new repository‘按钮,创建一个新仓库,命名为learngit
远程仓库创建好后,就可以在本地输入如下命令: git remote add origin git@github.com:ZDHWYL/ZDHWYL.git //这个地址可以在你仓库的右上角绿色CODE中找到 添加后,远程库的名字就是origin,这是Git默认的叫法 git remote用于操作远程库: git remote -v显示所有远程仓库 git remote add添加远程版本库 git remote rm name删除远程仓库 git remote rename old_name new_name修改仓库名 然后就可以把本地库的所有内容推送到远程库上: git push将当前分支master推送到远程仓库。 因为是第一次推,远程库是空的,所以要加上-u参数,Git不但会把本地的master分支内容推送到远程新的master分支, 还会把本地的master分支和远程的master分支关联起来。以后的推送和拉取就可以简化命令。 推送成功后,可以立刻看到Github中的远程库中内容和自己的本地库内容一样。
自此,我们才真正拥有了分布式版本库。
从远程库克隆
我们的学习过程是先有了本地库,后有了远程库,然后两者进行关联。 现实中大部分时候是先创建远程库,再从远程看看克隆。 git clone 仓库地址
创建、合并、删除分支
在之前的操作中,我们只有一条master分支,HEAD指向当前分支。 我们创建一个dev分支,然后切换到dev分支上: git checkout -b dev创建并切换分支 相当于以下两条:git branch dev****git checkout dev git branchname 查看分支
当我们在dev分支中进行修改文件,比如在test.txt文件末尾加上一行hello world add、commit之后切换到master分支进行查看,发现test.txt没变,因为不是一个分支。
合并分支: 在master分支上使用git merge dev合并dev分支内容。 继续查看test.txt内容,可以看到最后一行的hello world已经有了。
git merge用于将指定的分支合并到当前分支,可以注意到git bash中显示Fast-forward,意思是 这次合并是快速合并,HEAD直接指向了dev的最近一次的提交。
当我们弃用某一个分支的时候,可以删除:git branch -d dev 命令合集: 查看:git branch 创建:git branch dev 切换:git checkout dev 创建+切换:git checkout -b dev 合并指定分支到当前:git merge name 删除分支:git branch -d dev
克服冲突
还是上面dev的例子,dev中test.txt最后一行写hello world, master的test.txt最后一行写fuck world,然后再在master上merge dev分支 你就发现报冲突了,merge failed, conflicts等, git会用 <<<<< HEAD 主分支冲突内容 /========= 其他分支冲突内容
dev 显示冲突。需要手动更改后保存合并
git log可以查看分支合并情况。
分支管理策略
通常合并分支会用fast-forward模式,这种模式下,删除分支后会丢失分支信息,可以使用带参数的-no-off来禁用fast-forward模式。
bug分支
创建bug分支修复bug,如果所在分支有未提交的任务,可以使用git stash暂时隐藏未提交任务,等恢复现场后继续工作。git stash list查看任务,git stash apply恢复,git stash drop删除list中任务,git stash pop相当于执行前两条。
多人协作
当我们从github远程库中clone项目时,实际上Git已经自动把本地master繁殖和远程master分支对应起来了,并且远程库默认名称为origin。 git remote查看远程库信息 git remote -v查看远程库详细信息
(1)推送分支 推送分支就是将该分支上的所有本地提交提交到远程库中,推送时要指定本地分支,这样Git就会把该分支推送到远程库对应的远程分支上,使用命令:git push origin master (2)抓取分支 例如A同事git push origin dev推送dev分支到远程 B同事克隆库之后,创建远程origin的dev分支到本地来 git checkout –b dev origin/dev然后在dev分支进行开发, 开发完成后将dev分支推送到远程库。git push origin dev 这时我也像B同事一样,对同一个文件同一个位置进行了修改,在我提交时报错。 推送失败,因为我的小伙伴最新提交的和我试图推送的有冲突,解决的办法也很简单,上面已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后在本地合并,解决冲突,再推送。 git pull意为从远程获取代码并合并本地的版本。 先指定本地dev分支与远程origin/dev分支的链接,设置dev和origin/dev的链接,如下: git branch --set-upstream dev origin/dev关联 git pull因为上面关联了,不用指定远程的分支。 pull完显示有冲突,解决冲突后再pull,再push。 参考链接: https://blog.csdn.net/doublepg13/article/details/119149211 一般的提交流程:先用git push origin branch-name推送自己的修改. 如果推送失败,则因为远程分支比你的本地更新早,需要先用git pull试图合并。 如果合并有冲突,则需要解决冲突,并在本地提交。再用git push origin branch-name推送
工作使用Git
待续…
|