git

1.什么是git

Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理

更多的内容可以参考官网的文档:https://git-scm.com/doc
下载地址:官网自行下载

2.git与svn的区别

image.png

这里面可以看到svn版本发生变化的时候,比如version1的版本有文件A,B,C,但是version2的时候修改了文件A,svn存储的是A文件的变化值,而git存储的时候是不变的对象的引用以及变化的对象会重新创建一个新的对象

这里面简单说明几点不同:
1)最核心的区别Git是分布式的,而Svn不是分布的。能理解这点,上手会很容易,声明一点Git并不是目前唯一的分布式版本控制系统,Git跟Svn一样有自己的集中式版本库和Server端,但Git更倾向于分布式开发,因为每一个开发人员的电脑上都有一个Local Repository,所以即使没有网络也一样可以Commit,查看历史版本记录,创建项 目分支等操作,等网络再次连接上Push到Server端。

2)Git把内容按元数据方式存储,而SVN是按文件:因为,.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。.git目录的体积大小跟.svn比较,你会发现它们差距很大。

3.git的三种状态和三种阶段

参考地址:三种状态
Git 有三种状态,你的文件可能处于其中之一: 已提交(committed)已修改(modified)已暂存(staged)

  • 已修改表示修改了文件,但还没保存到数据库中。
  • 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
  • 已提交表示数据已经安全地保存在本地数据库中。

这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录。


工作区、暂存区以及 Git 目录。

4.获取git仓库

通常有两种获取 Git 项目仓库的方式:

  • 将尚未进行版本控制的本地目录转换为 Git 仓库;

cd 工作目录
git init

  • 从其它服务器 克隆 一个已存在的 Git 仓库。

克隆仓库的命令是 git clone
git clone https://github.com/libgit2/libgit2

5.git基本操作

在下载git后需要配置邮箱和姓名

git config --global user.eamil
git config --global user.name

查看git工作区(仓库)中的一个状态,用git status

git status

当新建一个文件后,或者修改一个文件后,需要把文件推到暂存区,用git add

添加所有的文件

git add .

添加指定的文件到暂存区

git add 指定文件

把暂存区的文件进行融入到git目录管理,用git commit

git commit -m "修改的内容的评论"

6.查看历史和版本切换

大家都知道git可以进行版本控制与管理。

如果你想要进行版本的切换的话,你需要知道的就是这个commitid,也就是说你要知道每一次提交的信息才可以。
就要去查看这个每次的commitid是什么

Git log 日志,也就是说查看git的日志信息

$ git log
commit f0c0bea4c2fa1d93aba60b6729a9157e19ad43c5 (HEAD -> master, origin/master, origin/HEAD)
Author: sunkang [email protected]
Date: Sun Nov 18 15:18:35 2018 +0800
提交jdk的代码

简化日志,只需要显示commitid的信息

$ git log --pretty=oneline
f0c0bea4c2fa1d93aba60b6729a9157e19ad43c5 (HEAD -> master, origin/master, origin/HEAD) 提交jdk的代码
ecd3beb68ba5984b5d57bc1dac1f8c50178e1bb7 Initial commit

回退到上个版本

git reset --hard HEAD^

回退到上上个版本

git reset --hard HEAD^^

切换到某个commitid的版本

git reset --hard commitid

当回退到之前的版本之后,找不到最新的commitid,此时可以用git reflog 查看历史记录

git reflog

补充说明 reset --hard & reset --soft & reset

git reset --hard :丢弃最新的提交,简单来说就是会移动HEAD的指针指向对应的commitid
git reset --hard :重置位置的同时,清空工作目录的所有改动;
git reset soft :重置位置的同时,保留工作目录和暂存区的内容,并把重置 HEAD 的位置所导致的新的文件差异放进暂存区。
git reset --mixed (默认):重置位置的同时,保留工作目录的内容,并清空暂存区。

7.暂存区和git目录的回退

对工作区的文件进行了修改,想要撤销对文件的修改

git checkout -- 指定文件名称

此时查看文件的状态

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: 123.txt

已经执行了git add,此时文件到了暂存区,要撤销,此时可以执行git reset HEAD 拉取最近一次提交到版本库的文件到暂存区,改操作不影响工作区,然后执行git checkout -- ,把拉取暂存区文件,并将其替换成工作区文件

暂存区的文件的撤销

git reset HEAD
git checkout --

8.分支

Master分支是主分支,也是git为你默认创建的分支,一定就有其他分支


image.png

Master分支指向的是最新的提交commitid,头指向指向的是我们的master分支。
但是git的强大之处远不止如此,而是有一个多人协作开发的概念。
不仅是一个单人开发进行版本控制,同时可以多人协作开发进行一个版本控制。 就是通过git的分支进行的。

HEAD的一个补充:HEAD头指针指向的是当前分支最新的commitid

创建并切换分支

git checkout -b <分支名>

上面的命令相当于

git branch <分支名>
git checkout <分支名>

可以查看当前所有的分支情况,并且可以看到目前所处的分支(*)

git branch

删除分支

git branch -d <分支名>

需要说明的有两点:

  1. HEAD 指向的 branch 不能删除。如果要删除 HEAD 指向的 branch,需要先用 checkout 把 HEAD 指向其他地方。
  2. 由于 Git 中的 branch 只是一个引用,所以删除 branch 的操作也只会删掉这个引用,并不会删除任何的 commit。(不过如果一个 commit 不在任何一个 branch 的「路径」上,或者换句话说,如果没有任何一个 branch 可以回溯到这条 commit(也许可以称为野生 commit?),那么在一定时间后,它会被 Git 的回收机制删除掉。)
  3. 出于安全考虑,没有被合并到 master 过的 branch 在删除时会失败(因为怕你误删掉「未完成」的 branch 啊):
强制删除分支

git branch -D <分支名>

分支的合并

git merge <分支名>

现有一个场景,看到开发任务分叉到两个不同分支,又各自提交了更新,需要把expriment合并到master分支上


image.png

先切换到master分支,然后执行git merge experiment,整合分支最容易的方法是 merge 命令。 它会把两个分支的最新快照(C3 和 C4)以及二者最近的共同祖先(C2)进行三方合并,合并的结果是生成一个新的快照(并提交)。


image.png

merge 有什么用

  1. 合并分支
    当一个 branch 的开发已经完成,需要把内容合并回去时,用 merge 来进行合并。
  2. pull 的内部操作
    之前说过,pull 的实际操作其实是把远端仓库的内容用 fetch 取下来之后,用 merge 来合并。
分支的变基

可以参考 : Git 分支 - 变基

git rebase <分支名>

你可以提取在 C4 中引入的补丁和修改,然后在 C3 的基础上应用一次。 在 Git 中,这种操作就叫做 变基(rebase)。 你可以使用 rebase 命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。

在这个例子中,你可以检出 experiment 分支,然后将它变基到 master 分支上:

git checkout experiment
git rebase master

image.png
冲突
  1. 解决掉冲突
  2. 手动 commit 一下

9.git config 和配置别名

查看所有的配置信息

git config -l

$ git config -l 
core.symlinks=false
core.autocrlf=true
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
rebase.autosquash=true
http.sslcainfo=D:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
http.sslbackend=openssl
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
credential.helper=manager
user.name=sunkang
[email protected]
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
[email protected]:sunkang123/jdk.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master

这里所有的信息实际上都是整合出来的,整合哪边的呢?
仓库级别,全局级别,系统级别
仓库级别的配置:当前仓库级别下的.git>config文件
全局级别的:当前用户之下表示的是全局级别的
系统级别:在我们的git安装目录下etc

查看仓库级别的配置

git config --local -l

查看全局级别的

git config --global -l

查看系统级别

git config --system -l

增加系统级别的配置和删除

git config --global --add user.name sunkang
git config --global --uset user.name

别名配置,推荐使用,一般我会配置别名使用,缩短命令敲击时间

git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status

10.打标签和忽略文件

commitid不容易记住,能不能用一种比较独特的方式去记住每个版本

git tag 标签名 commitid

忽略文件,希望某类文件t标注为 Untracked file (未被追踪)的文件,不能被git管理起来

仓库的根目录下创建一个.gitignore 文件
例如,文件内容为 : *.class 表示忽略class文件的管理

11.操作远程和本地库

需要把本地的仓库的内容推送到远程

要让两者有关联
git remote add origin 远程仓库的地址
将本地仓库的内容推送到远程仓库
git push -u origin master

当push远程仓库失败的时候,需要添加ssh-key

需要在本地中生成一个ssh key
ssh-keygen -t rsa -C [email protected]
需要把公钥放到github/码云/gitlab的ssh-key的配置中
公钥的地址可以在用户的.ssh的目录下的id_rsa.pub可以看到

查看远程仓库的地址

git remote -v

12.gitlab的安装

有兴趣可以自己安装试试,自行百度
可以参考:https://www.jianshu.com/p/8c02c3887889

你可能感兴趣的:(git)