需要明确的专业术语:工作区、暂存区、版本库、远程库

工作区:开发人员本地机器中的代码文件存放的位置(本地可见)

暂存区:是开发人员可以随意修改的一个区域,相当于在真正提交前的一个整理的空间

版本库: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分支的链接,根据提示,设置devorigin/dev的链接

git branch --set-upstream dev origin/dev


16.多人协作的工作模式通常是这样:

  1. 首先,可以试图用git push origin branch-name推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用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.

剩下的推送就简单了。