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/
要查看当前配置有哪些远程仓库
git remote
执行时加上 -v 参数,你还可以看到每个别名的实际链接地址
git tag
git tag -a
git tag可以查看所有标签。
git show
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/的父目录使用!规则,使其不被排除。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)