本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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"

之后会询问三次,直接Enter,会使用默认的文件名字
再次执行
ls -al ~/.ssh
可以看到生成了两个文件 id-rsa id_rsa.pub
一个是公钥 一个是密钥
github上添加key
git bash 复制公钥
$ clip < ~/.ssh/id_rsa.pub
在github 上添加new ssh key
把公钥复制上去就行了
三.简单使用
拉取代码
git clone <url>
这里的url 填写github上的项目url,如下图
url有两种:
一种是https
一种是ssh ssh的url必须配置 sshkey 之后才能使用
提交代码
git 的提交分为两步,首先要加入暂存区,再提交到版本库,这里的版本库指的是本地版本库
图示
添加到暂存区 图示(index)
git add <文件名>
提交到版本库
git commit -m "提交信息"
推送远端版本库
git push
拉取远端版本库代码(更新)
git pull
查看文件状态
git status
查看提交日志
git log
例子:
1.在learn_git文件夹中新建文件firstLearn.txt
2.使用 git status 查看git管理文件夹状态
提示有一个未跟踪的文件,需要添加
3.使用git add 命令添加到暂存区
再次使用 git status 查看文件状态 发现提示一个未提交的文件
4.使用git commit -m "第一次提交" 提交文件
提示请输入邮箱和用户名,告诉git是谁提交的文件
5.使用下列命令设置邮箱和用户名
$ git config --global user.email "zy963613606@aliyun.com"
$ git config --global user.name "zhangyao"
6.再次commit
提交成功
7.再次使用git status 查看文件状态
提示master分支有一个提交
8.使用git push 推送到远程仓库
提示从本地master分支推送到远程master分支
9.git stutus查看文件状态
已经不提示有一个commit了
10.登陆github查看文件状态
已经有两次提交了
11. git log 查看本地提交历史
可以看到提交的日志
四.冲突解决
场景: 两个人同时开发一个功能,操作一个文件时,当A先提交并推送到远端仓库后,B再次提交会怎么样
当第二个人推送远端时会提示如上错误
提示你需要先更新
执行git pull 命令后
提示有冲突,已经自动合并,这个时候打开冲突的文件就能看到冲突的内容,处理后重新提交就行了
五.分支
创建分支
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 <文件名 >