git-使用

什么是Git仓库

可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

把想让git管理的文件放入此仓库下,放到其他地方Git再厉害也找不到你想管理的文件。

初始化git仓库

git init
git add .
git commit -m '初始化'
git remote add origin http://gitlab.sanleny.com/web/invoicing.git
git push -u origin master
从一个服务器克隆一个现有的 Git 仓库

git clone https://github.com/test/test

在当前目录下创建一个名为“test”的目录,并在这个目录下初始化一个 .git 文件夹,从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。

如果进入到这个新建的“test”文件夹,发现所有的项目文件已经在里面了,并且都被git管理起来了,直接使用即可,无需执行add和commit命令。

也可以自定义本地仓库的名字,使用如下命令:

git clone https://github.com/test/test myTest

结果和上一个命令结果相同的,只是本地创建的仓库名字变为myTest。

Git 支持多种数据传输协议。上面使用的是 https:// 协议,也可以使用 git:// 协议或者使用 SSH 传输协议,比如 user@server:path/to/repo.git ,主要看git服务器的配置。

忽略

通过文件忽略

文件 .gitignore 的格式规范如下:

1 所有空行或者以 # 开头的行都会被 Git 忽略。

2 可以使用标准的 glob 模式匹配。

3 匹配模式可以以(/)开头防止递归。

4 匹配模式可以以(/)结尾指定目录。

5 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式

1 星号(*)匹配零个或多个任意字符

2 [abc]匹配任何一个列在方括号中的字符

(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c)

3 问号(?)只匹配一个任意字符;

4 如果在方括号中使用短划线分隔两个字符,表示所有在这两 个字符范围内的都可以匹配

(比如 [0-9] 表示匹配所有 0 到 9 的数字)

5 使用两个星号(*) 表示匹配任意中间目录

(比如a/**/z 可以匹配 a/z, a/b/z 或 a/b/c/z等)

 

通过命令忽略指定文件

$ git update-index --assume-unchanged /path/to/file

取消忽略

$ git update-index --no-assume-unchanged /path/to/file

查看文件状态

git status

git add 命令使用文件或目录的路径作为参数,如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。

git add xxx

补交

git commit –-amend –m “xxxxxxxx”

有时候提交完了发现漏掉了几个文件没有添加,或者提交信息写错了。此时,可以运行带有 –amend 选项的提交命令尝试重新提交。

这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息

git commit –a –m “xxxxxxxxxxxxxxx”

每次提交文件都需要git addàgit commit,有没有更简单的方式呢?

给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤

git diff –-cached(staged ) && git diff –-cached(staged ) xxx ##查看已暂存和版本库的修改

基础命令

git config --list   ##检查配置信息
查看全局配置
git config --global user.name
git config --global user.email

修改全局配置
git config --global user.name 'username'
git config --global user.email 'username@email.com'

移除文件
git rm xxx                   ##删除文件,需要commit
git rm --cached xxx    ##把文件从git仓库中删除,文件仍然保存在磁盘中
git rm -r --cached .mvn/    ##文件夹

重命名文件
git mv  xxx1 xxx2

查看提交历史
git log
git log --pretty=oneline    ##显示每次提交的简略信息
git log –p     ##显示每次提交的内容差异,可以加上 -1 来仅显示最近一次提交,除了显示基本信息之外,还附带了每次 commit 的变化
git log  --stat  显示每次提交的简略的统计信息
git log --since=2.weeks  列出所有最近两周内的提交,可以设置多种格式,比如说具体的某一天 “2008-01-15”,或者是相对地多久以前 “2 years 1 day 3 minutes ago”。


暂存区和版本回退
git reset HEAD^              ##暂存区版本回退
git reset --hard HEAD^  ##暂存区、工作区间 版本回退
git reset HEAD~100   ##回退到前100个版本
git reset 命令使用文件作为参数,或者用^  
上一个版本就是HEAD^,上上一个版本就是HEAD^^,往上100个版本HEAD~100
reset HEAD xxxx
git reset --hard HEAD^ 删除工作空间改动代码,撤销commit,撤销git add .   --hard会让工作区的文件一起回退
git reset --soft HEAD^   不删除工作空间改动代码,撤销commit,不撤销git add .
git reset --mixed HEAD^  不删除工作空间改动代码,撤销commit,并且撤销git add . 

撤销工作区修改
git checkout – xxxx    ##参数为文件

git别名
git config –-global alias.xxx1 xxx2
Xxx1为别名,xxx2为git命令

版本找回
git reflog           #操作日志
git reset --hard logId   ##logId 可以是前几位数
参数为commit id  1094a,版本号没必要写全,前几位就可以了,Git会自动去找
版本回退之后用git log是再也找不到提交历史了,也就无法找到commit id,
这个时候可以用git reflog来查看你的每一次命令

查看远程仓库
git remote -v
更换git远程仓库
git remote set-url origin http://gitlab.sanleny.com/web/sanleny-test1.git

分支更名
$ git branch –m xxx1 xxx2  xxx1为原来分支名称,xxx2为新分支名称
$ git brance –a  查看全部分支,包括远程和本地
$ git brance –r   查看远程分支
$ git brance –l   查看本地分支
$ git push origin --delete xxxxx  删除远程分支

一个本地仓库多个远程仓库
git remote set-url --add origin https://github.com/SanLeny/spark-study.git
git push

标签

发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。

Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。

默认标签是打在最新提交的commit上
git tag configserver-RELEASE-0.0.1   || git tag configserver-RELEASE-0.0.1 xxx
创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag -a config-server-RELEASE-0.0.1 -m '配置中心第一个稳定版本'
git tag -a config-server-RELEASE-0.0.1 -m '配置中心第一个稳定版本' xxxx
git tag
git show xxx
git tag -d xxxx   ##本地标签删除
git push origin xxxx  ##推送本地标签到gitHub
git push origin --tags  ##推送全部尚未推送到远程的本地标签
git push origin :refs/tags/xxxxxx   ##从远程删除

分支

创建分支
git checkout -b dev
git branch          ##查看当前分支,当前分支前面会标一个*号
git merge dev          ##合并指定分支到当前分支
git branch -d dev   ##删除dev分支
git push origin dev:dev  ##推送分支到远程仓库

非Fast forward合并
git merge --no-ff -m “xxxxxx" devTwo
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去
我们之前说的合并分支时,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
现在我们不用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
git log --graph --pretty=oneline --abbrev-commit               ##查看分支历史合并情况
不用Fast forward模式,分支历史上就可以看出分支提交信息和分支的信息

Git也会自动使用非Fast forward模式,如分支分叉的情况,git会自动使用非fast模式
这和之前合并 devTwo分支的时候看起来有一点不一样,开发历史从一个更早的地方开始分叉开来。 
所以Git 帮我们做了一些额外的工作,出现这种情况的时候,Git 会使用两个分支的末端所指的快照以及这
两个分支的工作祖先(分叉点),做一个简单的三方合并。

rebase
Git中除了合并,还有一种方式可以进行分支合并,就是rebase,你可以使用 rebase 命令将某一分支上(devRebase)的所有修改都移至另一分支上(master)
git checkout devRebase
git rebase master 
git checkout master 
git merge devRebase

1 首先找到这两个分支(当前分支 devRebase 、变基操作的目标分支master)的最近共同祖先 a6081ce
2 对比当前分支相对于该祖先的全部提交,提取出来存为临时文件,相当于删除这些提交,在历史中也查不到信息了
3 然后将当前分支devRebase指向目标xx1, 最后将之前另存为临时文件的修改依序应用,生成新的提交xx2

在rebase的过程中,也许会出现冲突。Git会停止rebase并会让你去解决冲突;
在解决完冲突后,需要执行git add命令标记为以解决, 不需要执行 git commit
git rebase --continue   ##这样git会继续应用(apply)余下的补丁
git rebase --abort      ##可以用--abort参数来终止rebase的操作,并且分支会回到rebase开始前的状态。


git stash        ##暂存分支
git stash list   ##查看我们的暂存分支
恢复暂存分支
a:一是用git stash apply xxx恢复,stash内容并不删除,还需要git stash drop来删除;
b:另一种方式是用git stash pop,恢复的同时把stash内容也删了:

 

posted @ 2021-04-20 14:23  Liaty  阅读(81)  评论(0编辑  收藏  举报