git相关

svn与git的区别

git是分布式的,有本地和远程两个版本库,SVN是集中式,只有一个远程版本库;
git的内容是按元数据方式存贮,所有控制文件在.git中,svn是按文件处理,所有资源控制文件在.svn中;
svn的分支是一个目录,git不是;
git没有一个全局的版本号,svn有

svn与git的适用场景

以单个文件为单位的适合用SVN管理,而我们代码是以行数为单位,适合Git。

第一步去官网下载windows版本git 官网地址git-scm.com

第二步安装到windows

第三步打开git bash

可以在git bash中输入命令

本机所有的git仓库都使用下面的配置,配置了自己的名字和email 如果去掉 --global 参数只对当前仓库有效
git config --global user.name "Your Name"
git config --global user.email "email@example.com"

客户端生成ssh key 途中会让你输入密码啥的,不需要管,一路回车即可,会生成你的ssh key。(如果重新生成的话会覆盖之前的ssh key。)
ssh-keygen -t rsa -C "youremail@example.com"

生成的文件存储目录在git bash上可以找到,如下:
Your public key has been saved in /c/Users/Administrator/.ssh/id_rsa.pub

把生成的id_rsa.pub中的内容,添加到github的ssh and gpg keys中

创建repository
进入到某个目录执行git init命令即可在此目录创建git的repository
example:
进入E:\work\gitspace
输入git init
此时版本库就已经创建好了,并且还会再该目录下创建一个隐藏文件,文件名为.git

git add filename 添加到暂存区
git add [file1] 添加一个文件
git add [file1] [file2] ... 添加多个文件
git add [dir] 添加当前目录及目录内所有内容
git add . 添加当前目录下所有文件

git commit -m "this is remark" 提交到本地仓库 -m是指message,指的是备注
-a 代表可以省略add,即在工作目录修改完成后,直接执行命令提交文件到本地仓库,git commit -am '修改某文件'

git status 此命令可随时查看当前库的状态

git diff 查看文件的不同之处

git log 查看提交日志
git log --pretty=oneline
git log --graph 可以查看到分支的合并情况

找到二虎最近提交的5次记录
git log --author=二虎 --oneline -5

根据时间正序排
git log --reverse --oneline

以列表的形式查看2.txt的版本记录
git blame 2.txt

git reflog 查看命令历史记录

git reset --hard 回退到某个版本
git reset --hard HEAD^回退到上个版本
git reset --hard commit_id回到某个版本
--hard:重置位置的同时,直接将 working Tree工作目录、 index 暂存区及 repository 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区
--soft:重置位置的同时,1、工作区不变,2暂存区的内容=原有内容+变更内容(变更内容=本地仓库和回退版本之间的差异),3本地仓库回退到上某个版本,
--mixed 原节点和Reset节点之间的所有差异都会放到工作目录中,暂存区无内容

git reset 用于将暂存区内容回滚,工作区内容不变
git reset -hard --soft 用于将工作区和暂存区都回滚

git diff HEAD -- 123.txt 查看工作区和版本库里面最新版本的区别

git checkout -- 123.txt 工作区的内容如果已被修改,但是还没有使用add命令添加,那么使用此命令可以将已做的修改回复到修改之前

git rm --cached 123.txt 文件从暂存区域移除,但工作区保留
git rm -f hello.php 强制删除暂存区和工作区的hello.php文件

git mv 123.txt 12345.txt 移动或重命名一个文件、目录或软连接

————————————————————————————————————————————将远程主机 origin 的 master 分支拉取过来,与本地的当前分支合并————————————————————————————————————————————
1、先查看远程信息
git remote -v # 查看信息

2、检查远程仓库是否有更新
git fetch origin

3、若有更新,可以使用下面的命令合并到本地
git merge origin/master

git pull origin master
git pull 其实就是 git fetch 和 git merge FETCH_HEAD 的简写

git fetch origin master //从远程主机的master分支拉取最新内容 -> 本地仓库,但并不合并
git merge FETCH_HEAD //将拉取下来的最新内容合并到当前所在的分支中

git pull origin master = git fetch origin master + git merge FETCH_HEAD

————————————————————————————————————————————将远程主机 origin 的 master 分支拉取过来,与本地的当前分支合并————————————————————————————————————————————

git remote add origin git@github.com:michaelliao/learngit.git 在本地运行命令与远程库相连

git push -u origin master 把本地库所有内容推送到远程库(当前分支内容???)
git push origin master 只推送更新的内容

git clone git@github.com:michaelliao/gitskills.git 本地克隆远程库
git clone git@github.com:alibaba/canal.git

git merge 命令用于合并指定分支到当前分支
git merge --no-ff 用于普通合并,看日志时可以看出是由分支合并而来

git merge --no-ff -m "" 需要合并的分支

git stash 保存当前工作区
git stash list 查看当前所有保存的stash
git stash apply 应用某一个stash
git stash drop 删除某个stash

git remote 查看远程仓库
git remote -v 查看远程仓库详细信息

git pull 从服务端拉取
git branch --set-upstream-to=origin/ dev1 与服务端的分支建立关系

要查看当前配置有哪些远程仓库
git remote
执行时加上 -v 参数,你还可以看到每个别名的实际链接地址

git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id;

git tag -a -m "blablabla..."可以指定标签信息;

git tag可以查看所有标签。
git show 查看tag信息

git push origin 可以推送一个本地标签;

git push origin --tags可以推送全部未推送过的本地标签;

git tag -d 可以删除一个本地标签;

git push origin :refs/tags/可以删除一个远程标签。]

丧心病狂
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

git@github.com:jis121/gitspace.git
https://github.com/jis121/gitspace.git

git服务器
工具名称gitblit 官网http://www.gitblit.com/

常见问题
The file will have its original line endings in your working directory
解决办法
git config --global core.autocrlf false Git默认配置替换回车换行成统一的CRLF,我们只需要修改配置禁用该功能即可。

下载好了就解压:tar -xzvf gitblit-1.8.0.tar.gz

假设你解压到了/opt/gitblit1.8.0/ 目录下了

然后需要修改两个配置文件:

1、修改gitblit1.8.0目录下,data/defaults.properties:

git.repositoriesFolder=/opt/gitblit-file ? ? (要保存的资料库路径

server.httpPort=60 ? ?(要开放的HTTP端口号

server.httpBindInterface=... ? ? ?(服务器IP或者域名[阿里云服务器的话,这里不填写,因为有内网IP和外网IP两个,填写外网IP会报错,填写内网的话外网又不能访问,亲测不填可以访问。当然输入的IP地址是外网的http://...:60])

server.httpsBindInterface=localhost

修改完以后保存,退出。

2、修改gitblit1.8.0目录下,service-centos.sh:

根据自己的服务器的设置:

GITBLIT_PATH=/opt/gitblit1.8.0 ? ?(你解压缩存放的gitblit主目录

GITBLIT_BASE_FOLDER=/opt/gitblit-file ?(存放数据的基地址

GITBLIT_HTTP_PORT=60 ? ?(开启服务的HTTP端口

修改完以后保存,退出。

至此,已经安装好了,接下来是启动
启动服务(两种方式):

1、命令方式:nohup java -jar /GT/software/gitblit-1.8.0/gitblit.jar --baseFolder data? >/GT/software/gitblit-1.8.0/run.log & (不间断运行了命令,并把输出结果写入run.log文件)

简化一点:java -jar /$GITBLIT/gitblit.jar --baseFolder data

2、运行主目录下的install-service-centos.sh,将gitblit添加为service,然后运行:service? gitblit start/stop/restart

也可自行添加为service,解释一下,实际上脚本install-service-centos.sh的内容为:

sudo cp service-centos.sh /etc/init.d/gitblit(把service-centos.sh复制到目录/etc/init.d/并重命名为gitblit)

sudo chkconfig --add gitblit(将gitblit添加为系统服务,使chkconfig能够管理他,并同时在系统启动的叙述文件内增加相关数据)

gitblit.sh文件内容改为如下,并启动本文件即可开启后台服务
java -jar gitblit.jar --baseFolder data > /dev/null &

解决ssl问题
第一步、
如果是windows,windows命令行执行set GIT_SSL_NO_VERIFY=true git clone
如果是linux,env GIT_SSL_NO_VERIFY=true git push

第二步、
用git自带的命令
git config --global http.sslVerify false

问题解决 problem solving

.gitignore忽略规则简单说明

表示此为注释,将被Git忽略

.a 表示忽略所有 .a 结尾的文件
!lib.a 表示但lib.a除外
/TODO 表示仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ 表示忽略 build/目录下的所有文件,过滤整个build文件夹;
doc/
.txt 表示会忽略doc/notes.txt但不包括 doc/server/arch.txt

bin/: 表示忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
/bin: 表示忽略根目录下的bin文件
/.c: 表示忽略cat.c,不忽略 build/cat.c
debug/
.obj: 表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj
/foo: 表示忽略/foo,a/foo,a/b/foo等
a/
/b: 表示忽略a/b, a/x/b,a/x/y/b等
!/bin/run.sh 表示不忽略bin目录下的run.sh文件
*.log: 表示忽略所有 .log 文件
config.php: 表示忽略当前路径的 config.php 文件

/mtk/ 表示过滤整个文件夹
*.zip 表示过滤所有.zip文件
/mtk/do.c 表示过滤某个具体文件

被过滤掉的文件就不会出现在git仓库中(gitlab或github)了,当然本地库中还有,只是push的时候不会上传。

需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中,如下:
!*.zip
!/mtk/one.txt

唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。为什么要有两种规则呢?
想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理,那么.gitignore规则应写为::
/mtk/*
!/mtk/one.txt

假设我们只有过滤规则,而没有添加规则,那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!
注意上面的/mtk/*不能写为/mtk/,否则父目录被前面的规则排除掉了,one.txt文件虽然加了!过滤规则,也不会生效!


还有一些规则如下:
fd1/*
说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略;

/fd1/*
说明:忽略根目录下的 /fd1/ 目录的全部内容;

/*
!.gitignore
!/fw/
/fw/*
!/fw/bin/
!/fw/sf/
说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;注意要先对bin/的父目录使用!规则,使其不被排除。

posted @ 2021-08-09 10:57  马崮蚂蚁哥  阅读(42)  评论(0编辑  收藏  举报