总概
首先,我理解的git其实就是为了让团队协作非常方便的一个分布式版本控制系统。使用git来进行团队协作可以方便很多,可以理解为不同的人可以在不同的时间线上去整理一份档案。git还可以用来先暂时保存我们的进度,以及可以看到是谁做了一些改变等等,功能可以说非常强大。
一些命令可以点击下面连接来查看。
https://gitee.com/liaoxuefeng/learn-java/raw/master/teach/git-cheatsheet.pdf
一个本地仓库一个远程仓库。
初始化一个本地仓库的命令就是git init。
新建一个远程仓库就是在GitHub中创建一个仓库。
我们要连接一个远程仓库,一般在我们新建一个远程仓库之后就可以看到一些提示:再Gitbash敲这个命令就可以跟远程仓库关联起来,就可以往远程仓库上推送啦。
git安装
在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。安装完成后,点击鼠标右键,如果出现图中所示,就表明说安装成功。
创建并初始化一个版本库
要知道几个概念:一个工作区,一个暂存区,还有一个版本库。
- 工作区:就是电脑里能看到的目录。
- 暂存区:英文名叫stage或者index,一般存在.git目录下的index文件中。
- 版本库:工作区有一个隐藏目录.git,就是Git的版本库。
暂存区就是还没有保存,工作区就是可以推到服务器了。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
就是说我们每次git add其实是将文件修改添加到暂存区,git commit是把暂存区的所有内容提交到当前分支。
(一般都是需要提交的文件一次性放到暂存区,然后,一次性提交暂存区的所有修改)
通过git init命令把这个目录变成Git可以管理的仓库:
用命令git add告诉Git,把文件添加到仓库:
用命令git commit告诉Git,把文件提交到仓库:
创建一个远程仓库
登录GitHub
一个新仓库就创建成功了。可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后把内容推送到GitHub仓库中。先创建远程仓库,然后远程仓库克隆。
克隆仓库
克隆仓库其实就是可以理解为把远程端整体拉到本地的一个过程。使用git clone 克隆一个本地库。如果多人协作开发,那么每个人就可以各自从远程克隆一份。添加远程仓库(GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,非常方便)
本地仓库和github仓库之间的传输是通过ssh加密的。
在.ssh中可以看到id_rsa(私钥)和id_rsa.pub(公钥)
.ssh文件下面有两个文件id_rsa和id_rsa.pub
id_rsa是私钥 id_rsa.pub是公钥
- 第一步:创建ssh key
(若没有,打开Gitbash,输入下面命令创建ssh key)一路回车
ssh-keygen -t rsa -C “your email@qq.com”
- 第二步:登录Github
这样就添加成功了。
为什么必须是SSH key呢?因为Git Hub需要识别出你推送的提交是你推送的,而不是别人冒充的,就是为了更安全。
现在就可以克隆一个远程仓库:在gitbash中输入命令:
git clone git@github.com:lss-33/test2.git
克隆成功啦!
我们就可以通过这个命令来查看以下自己的远程仓库信息
提交到仓库
点开test2可以看到一个隐藏文件.git,git版本库里存放了许多东西。代表一个git工作区。这些信息就决定了当前工作区什么状态等等。
现在比如我们在test2中添加一个文本
我们通过git status命令来查看当前工作区的状态:
可以看到它显示有一个test2.txt还没有被提交到暂存区
现在使用git add 文件名 命令把文件放到暂存区
在重新查看工作区的状态,已经发生改变了,但是还没有提交。
通过git commit -m ‘内容’把文件提交到版本库,这样才能到git仓库去管理它
此时,再重新git status
此时就可以提交到远程仓库中
使用git push origin master
当第一次推送的时候需要加上-u,只有第一次需要加,往后-u就可以去掉啦。
然后切换到远程仓库上,就可以看到了我们提交的信息
撤销
假如现在我们对文件进行了一个错误的修改,并且commit了。现在我们要修改。
可以通过git diff 文件名 查看文件修改了什么内容
首先,我们可以通过git log来查看提交历史,可以看到commit id
git reset --hard commit id 回退到某一个版本(只输入commit id前几个就好)
现在可以看到这个操作被撤回啦!
也可以通过git checkout – 文件名,把文件在工作区的修改全部撤销。让这个文件回到最近一次git commit 或者git add的状态。
总结:
乱改了工作区某个文件的内容,想直接丢弃掉工作区的修改。
git checkout – 文件名
乱改了工作区的某个文件,并添加到暂存区,提交到了版本库。
git reset --hard 文件名
在git中删除文件 rm 文件名。
确定从版本库中删除文件。
rm 文件名
文件就从版本库中被删除了。
如果删除错了,因为版本库里还有呢,所以可以很轻松的恢复误删的文件到最新的版本(从来没有被添加到版本库就被删除的文件,是无法被恢复的)。
分支
在一个本地仓库中可以有不同的分支,git默认会给我们创建一个主分支就是master,一般情况下我们可以新建一个分支来进行操作,然后提交到暂存区,在合并到主分支上,然后把新建的分支删除掉即可。这样操作是更安全的,然后再进行推送即可。
主分支:master分支
HEAD指向master,master指向提交
创建并切换:(以下两个命令都可以)
git checkout -b 分支名
git switch -c 分支名
这一个命令其实相当于下面两步:
git branch 分支名 (创建分支)
git checkout 分支名 (切换分支)
git switch 分支名 (切换分支)
git branck可以查看当前分支(在当前分支前面会有一个*)
其实这里也可以看到
我们在分支上进行的操作,切换到主分支上是看不见的。
比如我们在dev分支上创建一个dev文本。
切换到master是看不见的。
当我们在dev分支上提交完成后,我们可以合并分支
git merge 要合并的分支
这样切换到主分支,我们就可以看到了
在这里Fast-forward是快进模式,合并速度非常快,这种模式下,删除分支后,会丢掉分支信息,合并分支时,加上–no-ff参数就可以用普通模式进行合并,合并后的历史有分支,能看出来曾经做过合并,而fast-forward合并就看不出来曾经做过合并。
然后我们就可以把分支删除啦!
使用git branch -d 分支名
现在我们在新建的分支上对文件进行了修改,切换到主分支上对文件也进行了修改,再次合并分支,就会出现冲突。
我们查看git status
上面的是主分支master修改,下面的是dev分支的修改
此时我们需要手动变基为我们希望的内容,然后再次提交,可以通过git log --graph 看到合并分支图
现在在删除分支就可以了。
当从另一台电脑的另一个目录克隆,从远程克隆时,默认情况下,只能看到本地的master分支,如果需要在dev分支上开发,就必须创建远程origin的dev分支到本地:
git checkout -n dev origin/dev
当你和同事同时修改并尝试推送时,就会推送失败,因为同事和你的最新提交有冲突。此时就需要解决冲突,大概步骤如下:
多人协作的工作模式通常是:
- 首先,可以试图用git push origin branch-name 推送自己的修改
- 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull尝试合并
- 如果合并有冲突,则解决冲突,并在本地提交
- 如果没有冲突或者解决掉冲突了,再用git push origin branch-name 推送就能成功了
- 先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送
如果git pull提示no tracking information,则说明本地分支和远程分支的连接关系没有创建,用命令
git branch --set-upstream-to branch-name origin/branch-name
Git有一种称为rebase的操作,有人把它翻译成“变基”。
- rebase操作可以把本地未push的分叉提交历史整理成直线。
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
标签
标签管理(发布一个版本时,通常现在版本库中打一个标签tag)
Git的标签是版本库的快照,就是指向某个commit的指针
git tag name 默认是HEAD ,可以指定为一个commit id
git tag 可以查看所有标签
假如本该打标签的,但是忘记了应该怎么办呢?
找到历史提交的commit id,然后打上去就可以了。
比如commit id是ae6f94aa35
git tag v0.9 f52c633
这样就打上标签了。
标签不是按时间顺序列出,而是按字母排序的
git show tagname 可以查看标签信息
可以创建带有说明的标签,用-a指定标签名,-m指定说明书
git tag -a v0.1 -m ”version 0.1 released’ 1094adb
标签总是和某个commit挂钩,如果这个commit再两个分支上都出现了,那么这两个分支上都可以看到这个标签。
操作标签
如果标签打错了,可以删除
git tag -d v0.1
如果要推送某个标签到远程,可以使用如下命令
git push origin tarname
也可以一次性推送全部尚未推送的本地标签
git push origin --tags
如果标签已经推送到远程,要删除远程标签,
先从本地删除
git tag -d v0.9
从远程删除,删除命令也是push
git push origin :refs/tags/v0.9
要想检验是否删除成功,可以登录github查看
以上就是本人对Git在工作当中基本的操作和理解,若有不对,望指出。同时可以点击我的另一篇文章,查看Git图形界面Source Tree的基本使用。SourceTree