Git
前言:知道的越多,不知道的就越多
Git 与 SVN 区别
Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
如果你是一个具有使用 SVN 背景的人,你需要做一定的思想转换,来适应 Git 提供的一些概念和特征。
Git 与 SVN 区别点:
- 1、Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。
- **2、Git 把内容按元数据方式存储,而 SVN 是按文件:**所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
- **3、Git 分支和 SVN 的分支不同:**分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
- **4、Git 没有一个全局的版本号,而 SVN 有:**目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
- **5、Git 的内容完整性要优于 SVN:**Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
下载
官网下载太慢了,用这个:https://npm.taobao.org/mirrors/git-for-windows/
安装
#进行全局配置
#用户名
git config --global user.name "cbbgs"
#邮箱
git config --global user.email "cbbgs@qq.com"
#查看信息
git config -l
仓库
对应一个目录,这个目录的所有文件夹被 git管理起来。
仓库中的每一个文件的修改删除都会被git跟踪。
状态 | 描述 |
---|---|
已提交(commited) | 已提交表示数据以安全的保存在本地的数据库中 |
已修改(modified) | 已修改表示修改了文件,但还没有保存到数据库 |
已暂存(staged) | 已暂存表示已修改的文件当前版本做了标记。 |
基本命令
本地仓库
初始化仓库
# 初始化本地仓库,创建成功了会在目录下生成一个隐藏.git文件
git init
添加在暂存区
#添加所有文件到暂存区。
git add .
提交到数据库
#提交所有到本地仓库,留取一个备份
# -m message,信息
git commit -m "add a hello.java"
#将添加和提交一起执行
git commit -a -m "两步融为一步"
查看状态
#查看状态
git status
比较文件差异
# 比较文件差异
git diff -- git1.java
E:\git>git diff -- git1.java
diff --git a/git1.java b/git1.java
index c2d4b26..63d0a4d 100644
--- a/git1.java
+++ b/git1.java
@@ -1 +1,2 @@
-git 第二次提交
\ No newline at end of file
+git 第二次提交
+git 第三次提交
\ No newline at end of file
添加暂存区和撤销
# 添加暂存区
git add . #添加全部文件
git add hello.java #添加指定文件
#撤销
git reset HEAD hello.java
E:\git>git reset HEAD git1.java
Unstaged changes after reset:
M git1.java
查看日志
#查看日志
git log
#当版本太多的时候查看
git log --pretty=oneline
E:\git>git log --pretty=oneline
521dd712c8c4b73c62b6ca9d71dcf0b031a0718f (HEAD -> master) ddd"
b67367b2bdaa904b1b06c978ffcb6d5c4a4baec6 版本腿甲片
5af2a3acfe33705763e8f255b439af4bad2bc1e0 第三次提交
adde35935bf87f88e04a380324a50dedae754c91 'dierci'
503269f1a8143425de1589ea4e3d4edce5c2c03b '提交所有的文件'
8a08d8ce25fda3cfa33ddf3bc509ebd808ed3681 add a hello.java
版本回退
#回到上一个版本
git reset --hard HEAD~1 #1 就是回退几个版本
#查看版本字符串
git reflog
#实例
E:\git>git reflog
5af2a3a (HEAD -> master) HEAD@{0}: reset: moving to HEAD~1
b67367b HEAD@{1}: reset: moving to HEAD~1
521dd71 HEAD@{2}: reset: moving to HEAD~1
626c8f2 HEAD@{3}: commit: banbences
521dd71 HEAD@{4}: commit: ddd"
b67367b HEAD@{5}: commit: 版本腿甲片
5af2a3a (HEAD -> master) HEAD@{6}: commit: 第三次提交
adde359 HEAD@{7}: commit: 'dierci'
503269f HEAD@{8}: commit: '提交所有的文件'
8a08d8c HEAD@{9}: commit (initial): add a hello.java
#回退到指定的版本
git reset --hard 521dd71
本地恢复
#如果本地文件不小心被删除了,我们可以通过 git status查看状态
E:\git>git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: git1.java #被删除的文件
no changes added to commit (use "git add" and/or "git commit -a")
#方式一
#然后通过restore恢复 resrtore 是把工作区恢复
git restore git1.java
#方式二
#可以通过checkout恢复 checkout 是从版本库拉取文件
git checkout git1.java
删除版本库
# 只需要在本地删除一些文件,然后提交修改,版本库也会做相应的修改
git add .
#第二种方式就是用rm
git rm git1.java
E:\git>git rm git1.java
rm 'git1.java'
#删除的版本可以通过版本回退恢复
git reset --hard HEAD~1 #1 就是回退几个版本
远程仓库
从gitee上拉取代码
#拉取gitee的 代码或者gitgub
# 以github为例 用 clone 跟上github地址 gitee一样的道理
git clone https://github.com/winterbe/java8-tutorial.git
#直接拉取远程仓库的最新状态
git pull
将本地仓库的代码上传到gitee仓库
# 将本地代码上传到gitee上 第一次上传是需要输入用户名和密码
# remote 远程仓库
# origin 远程仓库别名
#绑定远程仓库的地址
git https://gitee.com/cbbgs/test1.git #https 绑定
#拉取仓库
# git pull <远程主机名> <远程分支名>:<本地分支名>
# 只有 git push 默认推主干,pull也一样
git push -u origin master
将本地仓库的代码上传到github仓库
git remote add origin git@github.com:cbbgs/test1.git
git push -u origin main
#
cd existing_git_repo
git remote add origin git@gitee.com:cbbgs/cloud-bookstore.git
git push -u origin master
配置 SSH
#配置秘钥
ssh-keygen -t rsa -C 'cbbgs@qq.com'
E:\git>ssh-keygen -t rsa -C 'cbbgs@qq.com'
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\cbbgs/.ssh/id_rsa):
Created directory 'C:\Users\cbbgs/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\cbbgs/.ssh/id_rsa. #秘钥存放位置
Your public key has been saved in C:\Users\cbbgs/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:bbufYYjK6yw57DW9Qy8wxBzz3u0o6V9XJXESHf+aryE 'cbbgs@qq.com'
The key's randomart image is:
+---[RSA 2048]----+
| ++o|
| o +o|
| o + . o|
| + .. .o|
| . .S.o. o|
| o.oo.o. + |
| . .o+ooooE = |
| =+ o=.o+.= o |
| ..+*oo=o.o ...|
+----[SHA256]-----+
E:\git>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
配置公钥
检查连接
#检查连接 ssh -T git@github.com
ssh -T git@gitee.com
ssh上传
git remote add origin git@gitee.com:cbbgs/test2.git
git push -u origin master
Git分支操作
查看所有分支
#查看所有分支
git branch
创建一个分支
#新建一个 分支并切换到新分支 带 * 是当前分支
git checkout -b cbbgs
E:\git>git checkout -b cbbgs
Switched to a new branch 'cbbgs'
E:\git>git branch
* cbbgs
master
切换分支
#切换分支 切换到主分支中
git checkout master
分支重命名
#分支重命名 b把cbbgs改成cbbgs1
git branch -m cbbgs cbbgs1
合并到主干
# 切回主干,在主干合并分支
git merge cbbgs1
E:\git>git branch
cbbgs1
* master
E:\git>git merge cbbgs1
Updating 055edb7..e9464d8
Fast-forward
git3.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 git3.txt
删除分支
#删除分支
git branch -d cbbgs1
总结:
git branch #查看分支
git checkout #切换分支
git checkout -b name #新建分支并切换到新分支
git branch -d name #删除分支
git checkout -m newname #修改 分支
git merge branch name #合并分支
分支的远程操作
查看本地与远程分支
#查看本地与远程分支
git branch -a
推送本地分支的内容到远程仓库
#推送本地分支的内容到远程仓库
git push origin cbbgs1
# 查看远程仓库文件
git ls-files
创建其他本地分支并且拉取远程分支的内容
#删除本地的分支
git branch -d cbbgs1
#此刻本地的分支只有master ,而远程的分支有两个
#查看远程的分支
git branch -a
$ git branch -a
* master
remotes/origin/cbbgs1
remotes/origin/master
#创建本地分支并且拉取远程分支的内容
# origin 远程
#git checkout -b 本地分支 origin/远程分支
git checkout -b cbbgs origin/cbbgs1
$ git checkout -b cbbgs origin/cbbgs1
Switched to a new branch 'cbbgs'
Branch 'cbbgs' set up to track remote branch 'cbbgs1' from 'origin'.
删除远程分支
#删除远程分支,但是本地分支还在 cbbgs1 远程分支名
#删除远程分支和推送本地分支到远程仓库只有一个冒号的区别 # #推送本地分支到远程仓库 git push orgin cbbgs1
git push origin :cbbgs1
$ git push origin :cbbgs1
Warning: Permanently added the ECDSA host key for IP address '180.97.125.228' to the list of known hosts.
remote: Powered by GITEE.COM [GNK-5.0]
To gitee.com:cbbgs/test2.git
- [deleted] cbbgs1
分支冲突操作与解决
本地分支操作冲突
描述:当分支修改的本地文件地方与主分支修改的地方一摸一样,但是修改的内容不一样
(比如分支修改git1.java的第五行,主分支也是修改分支修改git1.java的第五行,)
这个时候在主分支合并的分支的 时候会发生冲突。
#在分支本地已经修改了文件
#分支提交到暂存区
cbbgs@cbbgs MINGW64 /e/git (cbbgs)
$ git add git1.java
#分支提交到本地仓库
cbbgs@cbbgs MINGW64 /e/git (cbbgs)
$ git commit -m "分支操作"
[cbbgs 0447b53] 分支操作
1 file changed, 2 insertions(+), 1 deletion(-)
#切换到主分支
cbbgs@cbbgs MINGW64 /e/git (cbbgs)
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
#主分支本地修改文件,提交到仓库
cbbgs@cbbgs MINGW64 /e/git (master)
$ git commit -a -m "主干操作"
[master 9b714d3] 主干操作
1 file changed, 2 insertions(+), 1 deletion(-)
#合并分支
cbbgs@cbbgs MINGW64 /e/git (master)
$ git merge cbbgs
Auto-merging git1.java
CONFLICT (content): Merge conflict in git1.java
Automatic merge failed; fix conflicts and then commit the result. #产生了冲突
怎么解决?
人工解决!看具体的业务需求来修改本地的文件!
修改之后再进行提交。
#提交修改之后的主分支 分支没有改变
cbbgs@cbbgs MINGW64 /e/git (master|MERGING)
$ git commit -a -m "合并分支"
[master d71b4ed] 合并分支
查看分支合并图
查看分支合并图
git log --graph --pretty=online
cbbgs@cbbgs MINGW64 /e/git (master)
$ git log --graph --pretty=oneline
* d71b4ed4c2429b8ed6fd8b32cf10da09e9869df3 (HEAD -> master) 合并分支
|\
| * 0447b53c711e983bb24eef143e5eaf00c0530097 (cbbgs) 分支操作
* | 9b714d3336f3531ac0359321d25b015043c04b29 主干操作
|/
* e9464d8a86eccdb50ed5ed684234e667ac6ef727 cbbgs提交
* 055edb7879008f77c682ca1748277112b501c57c (origin/master) add new
多人协同操作冲突
描述:一个新同事拉取远程项目,对项目进行修改,另一个同事也对项目进行修改,他两修改的地方和行数一模一样。向远程推送。
(比如分支修改git1.java的第五行,主分支也是修改分支修改git1.java的第五行,)
#c1 的操作
cbbgs@cbbgs MINGW64 /e/git (master)
$ git commit -a -m "c1提交"
[master dc34a8a] c1提交
1 file changed, 1 insertion(+), 2 deletions(-)
cbbgs@cbbgs MINGW64 /e/git (master)
$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 353 bytes | 353.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-5.0]
To gitee.com:cbbgs/test2.git
d71b4ed..dc34a8a master -> master
# c2的操作
cbbgs@cbbgs MINGW64 /e/gittest/test2 (master)
$ git commit -a -m "c2操作"
[master ad1c15b] c2操作
1 file changed, 1 insertion(+), 2 deletions(-)
cbbgs@cbbgs MINGW64 /e/gittest/test2 (master)
$ git push
To gitee.com:cbbgs/test2.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'gitee.com:cbbgs/test2.git' # 可以很明显看到c2推送失败了
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
怎么解决?
每次推送的时候要保证先拉取再推送一下
#c2先拉取
$ git pull
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 333 bytes | 17.00 KiB/s, done.
From gitee.com:cbbgs/test2
d71b4ed..dc34a8a master -> origin/master
Auto-merging git1.java
CONFLICT (content): Merge conflict in git1.java
Automatic merge failed; fix conflicts and then commit the result. #拉取也报冲突
现在c2的文件变成了这样,现在我们手动修改一下
#修改之后c2再推送
cbbgs@cbbgs MINGW64 /e/gittest/test2 (master|MERGING)
$ git commit -a -m "c2操作"
[master 8aac46e] c2操作
cbbgs@cbbgs MINGW64 /e/gittest/test2 (master)
$ git push
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 653 bytes | 653.00 KiB/s, done.
Total 6 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-5.0]
To gitee.com:cbbgs/test2.git
dc34a8a..8aac46e master -> master # 推送成功
标签管理
查看标签
#查看标签
git tag
新建标签
#新建标签
git tag v1.0
#新建标签并添加说明
git tag -a v2.0 -m "发布2.0版本"
将标签推到远程
#将标签推到远程
git push origin v1.0
cbbgs@cbbgs MINGW64 /e/git (master)
$ git push origin v1.0
Enumerating objects: 19, done.
Counting objects: 100% (19/19), done.
Delta compression using up to 8 threads
Compressing objects: 100% (17/17), done.
Writing objects: 100% (19/19), 1.83 KiB | 374.00 KiB/s, done.
Total 19 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-5.0]
To gitee.com:cbbgs/test2.git
* [new tag] v1.0 -> v1.0
#推送本地所有标签
git push origin --tag
cbbgs@cbbgs MINGW64 /e/git (master)
$ git push origin --tag
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 166 bytes | 166.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-5.0]
To gitee.com:cbbgs/test2.git
* [new tag] v2.0 -> v2.0
删除标签
#删除远程标 但是本地标签还在
git push origin :refs/tags/v1.0
cbbgs@cbbgs MINGW64 /e/git (master)
$ git push origin :refs/tags/v1.0
remote: Powered by GITEE.COM [GNK-5.0]
To gitee.com:cbbgs/test2.git
- [deleted] v1.0
#删除本地标签
git tag -d v1.0
cbbgs@cbbgs MINGW64 /e/git (master)
$ git tag -d v1.0
Deleted tag 'v1.0' (was dc34a8a)
Idea 下的git操作
1、配置git
2、拉取项目
3、把一个普通项目添加成git管理
添加之后这个项目就有了
添加暂存区
添加到本地仓库
4、推送到远程
5、分支操作
提交分支一样
拉取远程的分支
先拉取项目最新状态
6、合并分支
先切换到主干
合并了cbbgs2的内容
7、删除。简单
8、忽略配置文件.idea
上传的时候不勾选就可以了
安装插件 .ignore
9、冲突的出现和解决
本地仓库分支合并冲突,手动解决
远程的冲突解决
一样的