分布式版本管理工具-git

111 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

git理解

git是一个分布式的版本管理工具.

git的好处:

分支

分布式

离线工作

缺点:

没有权限控制 (这里的权限控制指的是精确到目录) gitlite gitosis

命令多

一.安装

windwos:官网下载,一路下一步

linux:

两种方法:

1.使用yum 命令安装 但是yum上git的版本比较低 1.8

yum install git

2.官网下载tar包

解压

tar -zxvf git-2.18.0.tar.gz

设置安装路径

./configure prefix=/usr/local/git/

编译

make

安装

make install

修改环境变量,配置git命令

进入/etc/profile 最后一行加上

export PATH=$PATH:/usr/local/git/bin

后面的是你的安装路径

配置文件生效

source /etc/profile

二.ssh key

使用ssh key可以不使用用户名密码就连接github(或者自己搭建的gitlab私服)

检查本地是否已经存在key

方法1:

打开git bash

ls -al ~/.ssh

查看列出来的文件是否有一下几个中的某一个

  • id_rsa.pub
  • id_ecdsa.pub
  • id_ed25519.pub

如果有,说明本地已经存在key了

方法2:

windows 打开C:\Users\zy963下的.ssh文件夹 看是否存在上述文件夹

生成key

打开git bash命令行 或者windows cmd命令行 执行一下命令

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

image-20191204100630771

之后会询问三次,直接Enter,会使用默认的文件名字

再次执行

ls -al ~/.ssh

image-20191204100925063

可以看到生成了两个文件 id-rsa id_rsa.pub

一个是公钥 一个是密钥

github上添加key

image-20191204104316175

image-20191204104335860

git bash 复制公钥

$ clip < ~/.ssh/id_rsa.pub

在github 上添加new ssh key

把公钥复制上去就行了

三.简单使用

拉取代码

git clone <url>

这里的url 填写github上的项目url,如下图

image-20191204141800542

url有两种:

一种是https

一种是ssh ssh的url必须配置 sshkey 之后才能使用

提交代码

git 的提交分为两步,首先要加入暂存区,再提交到版本库,这里的版本库指的是本地版本库

图示

image-20191204151002516

添加到暂存区 图示(index)

git add <文件名>

提交到版本库

git commit -m "提交信息"

推送远端版本库

git push

拉取远端版本库代码(更新)

git pull

查看文件状态

git status

查看提交日志

git log

例子:

1.在learn_git文件夹中新建文件firstLearn.txt

2.使用 git status 查看git管理文件夹状态

image-20191204151438819

提示有一个未跟踪的文件,需要添加

3.使用git add 命令添加到暂存区

image-20191204151615280

再次使用 git status 查看文件状态 发现提示一个未提交的文件

4.使用git commit -m "第一次提交" 提交文件

image-20191204151806793

提示请输入邮箱和用户名,告诉git是谁提交的文件

5.使用下列命令设置邮箱和用户名

$ git config --global user.email "zy963613606@aliyun.com"
$ git config --global user.name "zhangyao"

6.再次commit

image-20191204152013070

提交成功

7.再次使用git status 查看文件状态image-20191204152134536

提示master分支有一个提交

8.使用git push 推送到远程仓库

image-20191204152241880

提示从本地master分支推送到远程master分支

9.git stutus查看文件状态

image-20191204152433433

已经不提示有一个commit了

10.登陆github查看文件状态

image-20191204152503703

已经有两次提交了

11. git log 查看本地提交历史

image-20191204152554578

可以看到提交的日志

四.冲突解决

场景: 两个人同时开发一个功能,操作一个文件时,当A先提交并推送到远端仓库后,B再次提交会怎么样

image-20191204161042806

当第二个人推送远端时会提示如上错误

提示你需要先更新

执行git pull 命令后

image-20191204161131777

提示有冲突,已经自动合并,这个时候打开冲突的文件就能看到冲突的内容,处理后重新提交就行了

五.分支

创建分支

git branch branch1

切换分支

git checkout <分支名>

远端创建分支

git push --set-upstream origin <分支名>

合并分支

git merge <分支名>

合并分支需要先切换到要合并其他分支的分支上

比如: master 要合并 branch01 分支,需要先切换到 master分支 在执行合并分支命令

分支合并后需要再次推送到远端版本库

六.git 搭建本地服务器

windows需要安装 openssh ,以centos为例

添加用户

adduser git

添加公钥(把需要登陆的公钥都放到~/.ssh的authorized_keys文件里)

vim ~/.ssh //再粘贴公钥

初始化仓库 --bare意思是初始化一个裸仓库 也就是没有.git文件的仓库

git init --bare init.git

指定仓库用户(linux用户控制权限)

chown -R git:git init.git

修改git用户登陆 /etc/passwd文件(控制权限) git用户不能使用shell登陆

git:x:1000:1000::/home/git:/usr/local/git/bin/git-shell

因为我是自定义的安装目录,需要定义软连接指向usr/bin/git下的git-archeve-pack 和git-upload-pack

ln -s /usr/local/git/bin/git-receive-pack /usr/bin/git-receive-pack
ln -s /usr/local/git/bin/git-upload-pack /usr/bin/git-upload-pack

连接远程仓库

git clone git@shangxirui.com:/myProject_zy/git_test/git_respository/init.git

需要输入密码

七.git remote命令

关联远程仓库

origin是仓库名称 可以修改 默认是origin

url可以是https 也可以是ssh

git remote add origin <url>

查看远程仓库是关联成功

git remote -v

关联成功后push代码或者pull代码都会有问题

提示

fatal: refusing to merge unrelated histories

原因: 使用remote关联仓库后,本地仓库和远程仓库还是没有关联的两个仓库

这个错误的意思是不允许合并不相关的历史文件

解决办法:

允许合并不相关的历史

$git pull origin master --allow-unrelated-histories

或者

强制覆盖代码

git push -f

八 git pull 和 git fetch

git pull = git fetch + git merge

原理理解:

git fetch 从 远程拉取代码,但是不会更新本地仓库的代码 只是修改了本地 .git/refs/head/master 里的最新的commitId

git merge origin master 才会合并

合并前可以使用 git diff 查看不同

git pull 拉取代码后会自动合并

九 .git 目录

git inti 命令会初始化一个仓库,在目录下有 .git文件

hooks 存放shell脚本 git命令使用

info

logs 日志

objects 每次commit的对象

refs 分支&标签

​ heads 存放本地分支信息

​ remotes 存放远程仓库分支信息

​ tags 标签信息

COMMIT_EDITMSG 最近一次提交的commit id

config 配置信息

describetion 仓库的描述

FETCH_HEAD 存放最后一次fetch的commit id

HEAD 指针 存放当前指针指向的分支

index 暂存区 二进制文件

ORIG_HEAD 存放最近一次操作的commit id

packed-refs 如果在refs/heads下找不到对应的分支信息 就会到这个文件查找

十. git revert reset rebase

这三者都可以达到回滚的效果

revert 反转提交

​ 增加一次回滚提交 把回滚这个操作当成一次提交 修改的内容不会丢失

reset 复位

​ --soft 只修改仓库的状态

​ --mixed(默认) 工作区的内容不会改变,只改变暂存区的状态

​ --hard 相当于svn的还原 工作区,暂存区,仓库全部还原

rebase 合并 merge

​ 如果在pull的时候发现有冲突,当解决完冲突之后发现冲突也会被当成一次提交,如果想把冲突的

git checkout 使用暂存区的内容覆盖

十一 git stash

储藏区 类似分支 但是储藏区只是在本地的,不会提交到远端

常用命令

保存至储藏区

git stash save "说明"  

查看已有的stash

git stash list

应用某个stash 默认使用第一个

git stash apply <stashid> 只应用 不删除该存储
git stash pop 应用stash 并删除该存储

删除stash

git stash drop <stashid>

清除所有stash

git stash clear

十二 本地已有项目与远程仓库进行合并

git init 
git remote add origin <url>
git pull origin(远程仓库名) dev:dev(远程分支名:本地分支名)

十三 忽略文件,使文件修改不被版本库管理

git update-index --assume-unchanged <文件名                 >