1、原理
Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
GIT 和SVN 对比,SVN 有中央仓库,集中式版本控制(cvs、svn)每次提交都是增量考虑,
Git 是分布式控制系统,没有中央仓库使用本地仓库代替中央仓库。Git 全量考虑,每一个版本都包含全量的数据,保证数据的完整性。Git GUI 主要是gui 、gitk、github desktop 三个。
Git本地仓库和远程仓库同步原理和命令如下:
git忽略文件:
空目录是默认忽虑
.gitignore 文件
通配符
1、* 代表所有字符 例如:*.txt
2、! 代表排除,及不忽虑 ,例如:!a.txt a文件不忽虑,继续提交。
3、dir/ 忽虑dir目录中的所有文件
例如: dir/*.txt 表示忽略dir目录下的所有txt文件
dir/*/*.txt 表示及下级所有目录的所有txt文件
2、Git下载地址
环境说明:
xuhan@xuhan-pc:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.1 LTS
Release: 20.04
Codename: focal
内核版本
xuhan@xuhan-pc:~$ uname -r
5.4.0-52-generic
Debian/Ubuntu
For the latest stable version for your release of Debian/Ubuntu
# apt-get install git
For Ubuntu, this PPA provides the latest stable upstream Git version
# add-apt-repository ppa:git-core/ppa # apt update; apt install git
3、配置
- 设置用户名和邮箱
git config --global user.name "*******"
git config --global user.email "**********@qqcom"
global 配置文件存储位置:
C:\Users\Administrator\.gitconfig
#查看系统config
git config --system --list
#查看当前用户(global)配置
git config --global --list
#查看当前仓库配置信息
git config --local --list
- 配置完成后,需要创建验证用的公钥,因为
git
是通过ssh
的方式访问资源库的,所以需要在本地创建验证用的文件。
使用命令ssh-keygen -C 'you email address@gmail.com' -t rsa
(注意ssh
与-keygen
之间没有空格)。
会在用户目录~/.ssh/
下建立相应的密钥文件。
root@xuhan-pc:~/git-study# ssh-keygen -C '769879295@qqcom' -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:vNSDzhsGvUau98FZbeaEeS6rPmmHfEZORbSUiEmxn4Q 769879295@qqcom
The key's randomart image is:
+---[RSA 2048]----+
| .o+ oo. |
| oo..o. |
| E ... |
| o o o =. |
| . S o *.* |
| B + +oB |
| X.+*. o |
| +.o*.=o |
| ...++*. |
+----[SHA256]-----+
- 创建完公钥后,需要上传到资源库。
使用命令cd ~/.ssh
进入~/.ssh
文件夹,输入gedit id_rsa.pub
打开id_rsa.pub
文件,复制其中所有内容。
接着访问http://git.oschina.net/profile网页,点击SSH公钥
,标题栏可以随意输入,公钥栏把你刚才复制的内容粘贴进去就OK了。
- 可以使用
ssh -T git@git.oschina.net
命令来测试连接是否畅通。
root@xuhan-pc:~/.ssh# ssh -T git@git.oschina.net
The authenticity of host 'git.oschina.net (212.64.62.183)' can't be established.
ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? y
Please type 'yes', 'no' or the fingerprint: yes
Warning: Permanently added 'git.oschina.net,212.64.62.183' (ECDSA) to the list of known hosts.
Hi 徐*! You've successfully authenticated, but GITEE.COM does not provide shell access.
4、常用场景和相关命令
- 第一次发布项目(本地仓库--->远程仓库)
首先:本地目录到本地仓库
先自己创建一个文件夹,把敲的代码拷贝进去(或者每次使用vim的时候直接切到该文件夹目录下进行编辑)。
先使用【git init
】指令初始化一个git仓库,接着输入【git add .
】添加文件,输入【git commit -m "注释"
】提交至本地仓库。
然后:本地仓库上传到远程仓库
输入【git push -u origin master
】提交至远程仓库,例如:采用码云作为远程仓库。
- 第一次下载项目(远程项目--->本地项目)
输入【git clone git@gitee.com:xu_huan/ubuntu-git-test.git】命令,从远程仓库拉取文件到本地
- 更新(远程仓库--->本地仓库)
输入【git pull】命令,从远程仓库更新文件到本地
- 提交(本地仓库--->项目仓库)
输入【git push origin master】命令,从本地仓库推送到远程仓库
设置远程git仓库
git remote add origin git@gitee.com:x*an/******21.git
5、常用命令
- 查看日志命令如下:
git log 查看提交日志
git log -2 查看最近两次提交日志
git log --graph 图形查看日志信息
git log --graph --pretty=oneline --abbrev-commit 简约查看日志
git reflog 查看所有的操作
blame 责任:
git blame filename 查看文件名称提交的文件每行的作者
- 查看git 状态命令如下:
git status 查看git当前目录的状态;
- 从暂存区到工作区文件还原命令如下:
git reset HEAD <file> 恢复文件,从暂存区到工作区,用于删除或者修改还原;
- git 删除命令如下:
1、git rm <file> 先删除文件,删除后放入暂存区;
后悔删除操作:git reset HEAD <file> 或 git checkout -- <file>
2、操作系统 rm <file> 先删除文件,删除后放入工作区;
- git修改文件名命令如下:
git mv <file> <newfile> 修改文件名称
- git注释重写命令如下:
git commit --amend - m "修正的注释内容" 修改最近一次注释修改
- git从工作区直接到本地分支命令如下:
git commit -am "" 合并增加和提交的操作 即:git commit -am "" = git add . + git commit -m "" (注意:第一次提交不能使用合并命令)
- git分支操作命令如下:
git branch 查看当前分支
git branch -a 查看所有分支
git branch -av 查看所有分支,以及时间点
git branch <branchname> 创建分支
Git branch -v 查看所有分支最近一次提交的。
git checkout -b <branchname> 创建分支并切换分支
如果在分支a,中进行了写操作,但是没有git add .之前,即只局限于工作区,master分支是可以看见的未add之前的文件,一旦git add . 之后,maste分支则看不见文件。
如果在分支a,中进行了写操作,没有git add .之前,删除分支是可以的,但是如果git add .或者git commit之后,就不能删除了,除非采用git branch -D <branchname> 强制删除分支。
git checkout <branchname> 切换分支
git branch -d <branchname> 删除分支(不能删除当前分支) 分支包含未合并的不能删除,所以删除分支之前建议先和合并
git branch -D <branchname> 强制删除分支
git branch -m master master2 把分支分支名称master改成master2
git branch mycommit sha1 回退之前某个版本并创建分支
- git分支合并命令如下:
git merge <branchname> 当前分支和 branchname分支合并
如果存在两个分支,一个分支靠前(dev),另外一个分支靠后(master),如果不冲突,master分支可以通过merge 直接赶上dev,称为fast forward.
fast forward 本质就是分支指针的移动,中间的commit版本,任然会保存。
fast forward 特点:
1、两个分支fast forward之后两个分支归于一个commit点,可以通过 git log 查看sha1值。
2、merge之后没有分支信息(丢失分支信息,可以通过git log --graph)
git 在merge时,默认使用fast forward ,也可以禁止使用。git merge --no --ff,其特点:两个分支merge 之后不会归于一个commit点,可以通过git log查看sha1值。
- git冲突解决如下
合并冲突
1、如果冲突,需要通过手动调整来解决冲突,解决冲突之后:git add XXXX ,git commit -m "";
在此过程中 解决冲突的同时会把另外的一个分支同步过来,一起提交。
2、如果一方是落后方,前进到另一方,则落后方可以直接通过merge 合并到前进一方.
- 版本回退
版本回退
回退到上两次commit: git reset -hard HEAD~~
回退到上n次commit : git reset -hard HEAD~n
回退到前任意次commit: git reset -hard sha1值
回退之后再回退
通过git reflog 查看所有的操作,在用git reset -hard sha1值 找回之前的操作
- checkout放弃与游离操作
1、git checkout filename ,工作区的内容,未提交之前可以放弃,也就是相对于暂存区和对象区。
2、git reset filename 将之前增加到暂存区的内容回退到工作区中
3、git checkout sha1值版本穿梭
git checkout 6c3f163
git checkout 997cd1647
提交记录: 84ee5d0---->6c3f16316b----->63e89535d------>997cd1647
git checkout 6c3f16316b 回到6c3f16316b版本
编辑文件再提交,git commit -am "修改提交" 此时会提交生成一个版本(d5d9228bfc),但是对后续的版本没有影响。
此时创建一个分支,可以继续走代码修改。
git checkout d5d9228bfc 回退这个版本,再创建分支,可以实现回到以前版本,继续再原来的版本修改代码走分支。
- stash :保存现场(不是穿梭之前版本)
stash :临时保存(保存现场)
1、建议(规范),在功能未开发完成之前,不要commit
2、规定(必须):
2.1、如果两个分支不在同一个版本上,在没有commit之前,不能切换分支。
commit之后才能切换到另外一个分支;临时保存一份(保存现场 git stash)。
适用于当前分支未开发完毕,需要切换分支其他分支修改内容,可以临时保存( git stash)一下。
2.2、如果两个分支在同一个版本上是可以修改之后不提交,直接切换分支。
- stash pop 还原现场
当前其他分支处理完成,需要切换到之前暂存的分支上继续处理。需要找回临时保存的内容。
通过 git stash list 查看临时文件离列表,再通过git stash pop(还原,但是会删除现场列表) 找回临时保存的内容
git stash drop 现场id 删除list中一个现场
git stash apply 现场id 指定恢复到某一个现场
- Tag标签:适用于整个项目,和分支没关系
1、创建标签:git tag v.1.0
2、创建标签:git tag -a XXX -m "XXXX"
3、查看标签: git tag
4、删除标签:git tag -d XXX
5、查看标签:git tag -l "XXX" git tag -l "V*"
- git diff比较内容
操作系统的diff(比较文件内容)
diff filenamA filenameB
diff -u filenamA filenameB
git diff git的比较(比较不同区的文件内容)
git diff 默认比较的暂存区和工作区的比较
git diff sha1 比较对象区和工作区比较
git diff --cached sha1 比较和对象区和暂存区比较
- 远程仓库
1、本地------push---->远程(github)
与远程仓库建立通讯SSL认证
ssh-keygen -C '769879295@qqcom' -t rsa -b 2048
下载远程仓库方式:
ssl可以免密码登录,如果https需要输入登录密码
git remote add origin git@gitee.com:xu_huan/git-demo-001.git
让本地git知道 origin就是git@gitee.com:xu_huan/git-demo-001.git 的别名 可以使用 git remote show origin 查看远程对应的路径 同时会比较本地的情况
git push -u origin master 将本地的master分支提交到远程,后续修改推送只需要git push即可
本地git连上远程仓库之后会在本地增加一个origin/master分支,通过该分支感知远程仓库的内容
一般分支命名和流转:
dev分支,用于开发
test分支,用于测试
master分支,用于发布生产
dev--->test(merge dev)---->master(merge test)
2、远程(github)------pull(拉取+合并)---->本地 ,其中pull = fetch + merge
从远程仓库第一次下载仓库内容 git clone git@gitee.com:xu_huan/git-demo-001.git resporityname
git status 查看本地的状态
git remote show origin 查看远程仓库的情况
本地多人和仓库发生冲突:
模拟两个用户连接到仓库,同时修改同一行文件模拟提交,第一个用户提交之后,第二个用户
需要先拉取合并,解决冲突再提交。pull = fetch + merge
****fetch 是不是到origin/master 看下文件内容
快捷方式,vi模式下 esc退出编辑模式变成只读模式,连续两次D键 会自动删除当前行
总结脚本:pull--->vi--->add---->commit---->push
- git 和远程仓库分支操作
本地---->远程
第一次推送 git push -u origin dev 把本地和远程dev分支关联
远程----->本地
1、pull 将远程的仓库拉到本地,此部仅仅只是从远程分支拉到本地远程分支(追踪分支),还需要从本地远程分支到本地分支。使用git branch -av 查看本地仓库情况
2、本地远程分支(追踪分支) ----》本地分支
方法一、git checkout -b dev origin/dev 创建分支并且和本地远程分支关联
方法二、git checkout -b dev --track origin/dev
删除本地/远程分支
git branch -d dev 是删除本地分支
git branch -D dev 是强制删除本地分支
git push origin dev:dev 把本地的推送到远程仓库
git push origin :dev 把本地空推送到远程仓库,达到删除远程的目的
git push origin --delete branchname