需要明确的专业术语:工作区、暂存区、版本库、远程库
工作区:开发人员本地机器中的代码文件存放的位置(本地可见)
暂存区:是开发人员可以随意修改的一个区域,相当于在真正提交前的一个整理的空间
版本库:git为我们创建的一个分支,一般是master
远程库:多个开发人员的一个中央控制机
git版本管理的整体流程:
git的相关命令及使用情景:
1.建议选择一个空的文件夹作为工作空间,执行命令初始化工作空间
git init
执行git init后,工作空间会出现一个.git的隐藏文件,这个文件就是git仓库
2.提交代码命令,提交代码分为两个步骤,首先将代码提交到暂存区,然后才能上传到master
第一步,将工作区的代码提交到暂存区
git add 文件名
第二步,将暂存区的代码提交到仓库
git commit -m “文字描述”
第三步,将仓库中的文件提交到主干
git push -all
以上命令的参数记不住的话,可以输入git + 关键字,就会出现提示,根据提示选择参数,git shell还是很人性化的。
3.假如不知道仓库中是否是最新代码,或者想知道仓库和暂存区的相关信息,可以使用命令来查询当前状态
git status
4.当工作区和暂存区、暂存区与仓库之间的代码冲突可以使用命令查看修改
git diff 文件名称
5.查看提交的历史记录命令
git log
6.版本回退
git reset --hard HEAD^(此处的肩括号有几个就表示回退到第几次提交,这个方法不够优秀
git reset --hard 版本号(版本号写前六位即可,git会自动查询)
7.版本前进
如果回退后,再想前进,使用会退命令加上想要前进的版本号即可,也就是说想跳到那个版本,只要指定版本号即可
如果忘记版本号也不要怕,git为我们提供这样的人性化的命令可以查询到前进的版本号
git reflog
远程仓库
1.创建ssh-key命令
ssh-keygen -t rsa -C "youremail@example.com"
执行完命令,会在当前文件夹生成两个文件id_rsa(秘钥)和id_rsa.pub(公钥),秘钥保留在本地,只能自己知道,公钥填写到gitlab上,这样就形成远程仓库和本地的关联
2.创建一个远程仓库
通过gitlab添加一个仓库,可以添加一个readme文件,用来测试能否成功下载到本地,执行命令,将gitlab中的仓库下载到本地
git remote add origin git@github.com:michaelliao/learngit.git
3.把远程仓库跟新到本地工作空间
git clone git@github.com:michaelliao/gitskills.git
4.本地库推送到远程库
在当前库中运行cmd,执行以下命令(第一次推送添加参数“-u”,以后推送不用添加)
git push -u origin master
5.分支---分支就是一条时间线
为了保证仓库的安全性,git的提交过程为(本地工作空间-->暂存区-->仓库-->分支-->远程仓库)
6.创建分支
创建一个名称为dev的分支
git branch dev
切换到新建的分支
git checkout dev
以上两条命令合并执行
git checkout -b dev
查询本地分支
git branch
查询远程仓库的分支
git branch -a
7.合并分支
切换会master分支,执行合并命令
git merge dev
8.删除分支
git branch -d dev
9.解决冲突
当两个分支上的内容不同,并且合并这两个分支的时候出现的问题,此时需要我们手动的解决冲突,然后再提交
使用命令查看分支进行图
git log --graph
实例:git log --graph --pretty=oneline --abbrev-commit
10.合并策略
合并dev到master上
git merge --no-ff -m "merge with no-ff" dev
合并分支时,加上
--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而
fast forward
合并就看不出来曾经做过合并。
11.隐藏、恢复当前分支
隐藏命令
git stash
查看隐藏列表
git stash list
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;
另一种方式是用
git stash pop
,恢复的同时把stash内容也删了
12.强行删除分支命令
git branch -D feature_name
13.查询远程库信息
查询远程库信息
git remote
查询远程库详细信息
git remote -v
14.协作开发
当多人协作开发时,别人克隆代码只有master分支,无法看到你的dev分支,这是执行命令,克隆指定的分支
git checkout -b dev origin/dev
15.两人同时推送时,后推送的那个人和远程仓库不同,先用git pull
把最新的提交从origin/dev
抓下来,然后,在本地合并,解决冲突,再推送;git pull
也失败了,原因是没有指定本地dev
分支与远程origin/dev
分支的链接,根据提示,设置dev
和origin/dev
的链接
git branch --set-upstream dev origin/dev
16.多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin branch-name
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin branch-name
推送就能成功!
如果git pull
提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
17.创建标签
git tag 【tag_name】
补写标签
git tag 【tag name】 【commit id】
查看标签
git show 【tag name】
- 命令
git tag <name>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id; git tag -a <tagname> -m "blablabla..."
可以指定标签信息;git tag -s <tagname> -m "blablabla..."
可以用PGP签名标签;- 命令
git tag
可以查看所有标签
18.删除标签
git tag -d 【tag name】
19.推送标签
git push origin 【tag name】
20.一次性推送全部尚未推送到远程的本地标签
git push origin --tags
21.查询当前tag列表
git tag
22.删除远程标签
先删除本地标签
git tag -d 【tag name】
再删除远程标签
git push origin :refs/tags/【tag name】
23.关联码云
注册码云后,添加公钥,将本地和码云关联起来
git remote add origin git@gitee.com:liaoxuefeng/learngit.git
24.git关联远程库同时关联码云
仍然以learngit
本地库为例,我们先删除已关联的名为origin
的远程库:
git remote rm origin
然后,先关联GitHub的远程库:
git remote add github git@github.com:michaelliao/learngit.git
接着,再关联码云的远程库:
git remote add gitee git@gitee.com:liaoxuefeng/learngit.git
现在,我们用
git remote -v
查看远程库信息,可以看到两个远程库:
git remote -v
gitee git@gitee.com:liaoxuefeng/learngit.git (fetch)
gitee git@gitee.com:liaoxuefeng/learngit.git (push)
github git@github.com:michaelliao/learngit.git (fetch)
github git@github.com:michaelliao/learngit.git (push)
25.Git显示颜色
git config --global color.ui true
26.忽略文件
推送时会有不想推送到git的文件,我们可以编写.gitignore
文件,将文件名填写到配置文件,这样推送时就会忽略这些文件。
27.配置别名
当我们执行命令git status,输入的长且容易错,所以我们可以设置命令,执行
git config --global alias.st status
设置后,执行git st和git status是相同的
每个仓库的Git配置文件都放在.git/config
文件中
28.搭建自己的git服务器
搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt
命令就可以完成安装。
假设你已经有sudo
权限的用户账号,下面,正式开始安装。
第一步,安装git
:
$ sudo apt-get install git
第二步,创建一个git
用户,用来运行git
服务:
$ sudo adduser git
第三步,创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub
文件,把所有公钥导入到/home/git/.ssh/authorized_keys
文件里,一行一个。
第四步,初始化Git仓库:
先选定一个目录作为Git仓库,假定是/srv/sample.git
,在/srv
目录下输入命令:
$ sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git
结尾。然后,把owner改为git
:
$ sudo chown -R git:git sample.git
第五步,禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd
文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git
用户可以正常通过ssh使用git,但无法登录shell,因为我们为git
用户指定的git-shell
每次一登录就自动退出。
第六步,克隆远程仓库:
现在,可以通过git clone
命令克隆远程仓库了,在各自的电脑上运行:
$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就简单了。