内容来源:超算习堂 (easyhpc.net)
git是一个分布式版本控制软件,最初由林纳斯·托瓦兹(Linus Torvalds,Linux内核的发明人及该计划的合作者)创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。
git最初的开发动力来自于BitKeeper和Monotone。git最初只是作为一个可以被其他前端包装的后端而开发的,但后来git内核已经成熟到可以独立地用作版本控制。很多著名的软件都使用git进行版本控制,其中包括Linux内核、X.Org服务器和OLPC内核等项目的开发流程。
而Github就是一个用git做版本控制的项目托管平台。
git是用于Linux内核开发的版本控制工具。与CVS、Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。git的速度很快,这对于诸如Linux内核这样的大项目来说自然很重要。git最为出色的是它的合并追踪(merge tracing)能力。
git更像一个文件系统,直接在本机上获取数据,不必连接到主机端获取数据。每个开发者都可有全部开发历史的本地副本,changes从这种本地repository复制给其他开发者。这些changes作为新增的开发分支被导入,可以与本地开发分支合并。
分支是非常轻量级的,一个分支仅是对一个commit的引用。
git是用C语言开发的,以追求最高的性能。git自动完成垃圾回收,也可以用命令git gc --prune
直接调用。
git存储每个新创建的object作为一个单独文件。为了压缩存储空间占用, packs操作把很多文件使用差分压缩入一个文件中(packfile),并创建一个对应的索引文件,指明object在packfile中的偏移值。新创建的对象仍然作为单独文件存在。repacks操作非常费时间,git会在空闲时间自动做此操作。也可用命令git gc
来直接启动repack。packfile与索引文件都用SHA-1作为校验和并作为文件名。git fsck
命令做校验和的完整性验证。
在Ubuntu系统中可以直接使用sudo apt install git
直接安装,本次虚拟环境已安装git
首先配置用户信息:用户名和邮箱地址
git config --global user.name "ehpc"
git config --global user.email [email protected]
其中--global
选项表示所有项目默认使用的用户信息,去掉后则会在特定项目中使用特定用户信息
可以使用git config --list
查看已有配置信息
git有工作区、暂存区和版本库:
ls -a
查看git可以使用git init
命令来初始化创建一个git仓库。此时,会生成一个.git目录
当然,也可以指定目录,使用命令:git init
我们可以使用命令git clone
从git仓库中克隆项目。
也可以指定目录,使用命令 git clone
一般git的工作流程如下:
使用如下命令创建一个测试用仓库
git init ehpc
cd ehpc
使用git add
将添加的文件或修改的文件加入本地的缓存区。
我们首先创建两个文件,然后将其添加到缓存区:
touch README ehpc.txt
echo "test" >> README
git add README ehpc.txt
git status
操作可以查看git当前状态,我们输入后可得到:
如果我们修改文件,如下命令:
echo "test2" >> README
git status
将会看到:
我们还可以再创建一个新的文件:
touch ehpc2.txt
将会看到:
也可以使用-s
参数查看简易信息:
git status -s
"AM"表示添加到缓存后又有改动。
git diff
可以查看git status
的结果的详细信息,可以添加参数--cached
表示已缓存的改动,--stat
显示摘要:
git diff
git diff --stat
git add README
git diff --cached
git commit
会将缓存区内容添加到仓库中:
git commit -m 'first commit'
git satus
其中-m
参数表示后面为提交注释
也可通过添加-a
参数跳过add
过程:
要从git仓库中删除文件,则必须使用git rm
命令:
git rm ehpc.txt
ls
可以通过添加-f
参数执行强制删除,--cached
参数不删除工作区文件:
git rm --cached README
递归删除当前目录时,使用:
git rm -r *
作用与git rm
类似:
每个git仓库都可以拥有很多个分支,这样可以在分支之后,不影响主线的同时继续自己的工作,同时,在开发完成后,还可以合并分支。
通过git branch
创建分支,git branch
查看分支列表,执行:
git branch ehpcbranch
git branch
Git 新建分支出现报错:“fatal: Not a valid object name: ‘master‘.“_is not a valid branch name_Lakers2015的博客-CSDN博客
通过git checkout
切换分支,我们切换分支并修改文件:
git checkout ehpcbranch
echo "branch" >> README.md
git status
git add README.md
git commit -m "branch commit"
最后再切回master分支:
git checkout master
使用git merge -m ""
合并分支:
当分支与master都有更改时合并,则会出现冲突,我们现在制造冲突并尝试合并:
git checkout ehpcbranch
echo "branch2" >> README.md
git commit -am "conflict"
git checkout master
echo "branch3" >> README.md
git commit -am "conflict2"
git merge ehpcbranch
将会看到如下结果:
此时需要手动修正冲突:
git diff
vim README.md
cat README.md
git diff
git add README.md
git commit -m "merge cobflict"
删除分支操作很简单,只需使用git branch -d
即可:
git branch
git branch -d ehpcbranch
git branch
使用git后,会进行很多操作,当我们想回顾操作历史时,就可以查看git的日志来了解历史操作。
git中可以使用git log
命令查看所有的commit
:
git log
按q
退出,也可以添加--oneline
参数简单查看:
git log --oneline
添加--graph
参数查看分支信息:
git log --oneline --graph
还有--author
参数查看指定用户的记录,使用--since
和--before
,--until
和--after
指定日期查看,--reverse
逆向查看。
添加--stat
参数以详细显示每次commit
中修改的文件的内容:
git log --stat
除了--reverse
可以重新排序,--topo-order
同样可以:
git log --topo-order --graph
可以指定--pretty
参数改变显示格式:
git log --pretty=short
git log --pretty=oneline --graph