REF:https://www.liaoxuefeng.com/wiki/896043488029600/896067074338496
Git是什么?
git是 Linux创建者 Linus 为了应对 Linux社区中的一些人 与老牌版本管理服务提供商BitKeeper 的矛盾,同时为了更好地服务于开源的Linux的版本管理,花费两周时间,自行用C语言编写的 区别于之前的集中式版本控制系统的 能让每个节点都拥有完整代码仓库的 分布式版本控制系统。之后,Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
安装git:
deban系列Linux:sudo apt-get install git
apt-get 会自动解决依赖,且库很新, 可以直接使用,对用户非常友好。
redhat系列Linux:yum -y install git
yum 也会自动解决依赖,但redhat系列的库维护相对保守,库版本可能较为老旧,想用最新版还是得自己下载编译。
自行下载编译git,需要先自己解决git所需依赖项的安装。
yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
找到git最新版压缩包,在官网的版本列表或对应的github上获取地址,用wget在终端下载。
//github源:
wget https://codeload.github.com/git/git/tar.gz/v2.25.1
//或者官网源:
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.9.5.tar.gz
按照Linux程序安装教程:*****里的源代码编译方式安装git。
//解压
# tar -zxvf git-2.9.5.tar.gz
//进入解压的文件夹
# cd git-2.9.5.tar.gz
//
[如果有低版本git程序已安装,先卸载: 使用 yum remove git 或 其他卸载方式]
因为已经手动安装依赖,所以不必再进行编译前检测(./configure),(但进行一次编译前检测也行)。
编译:直接将--prefix选项赋给make all指令,来指定安装位置,all表示全编译(all是否生效和makefile内容有关,一般makefile文件里面会加上一行make all,但也不全是。)
make prefix=/usr/local/git all
安装:直接将--prefix选项赋给make install指令,进行安装。
make prefix=/usr/local/git install
配置环境变量:打开环境变量配置文件,命令 vim /etc/profile ,在底部加上Git相关配置信息:
PATH=$PATH:/usr/local/git/bin
export PATH
使用source指令(或直接重启系统),重新载入环境变量。至此软件即可在任何位置使用。
source /etc/profile
Wndows:普通软件安装法-按默认选项安装即可
(Windows使用git:在目标文件夹下右键选择git bash选项打开git控制台,在控制台里同Linux一样操作即可,也可以右键选择git GUI使用图形界面操作)
REF:https://www.cnblogs.com/youqc/p/10488181.html
使用git
mkdir mygit01 //新建一个文件夹作为仓库(版本库):(为防止出意外问题,在Windows下尽量使目录不含中文)
cd mygit01 //在目标文件夹下运行git bash并输入指令:git init
git init //此番操作后mygit01下会出现一个名为.git的隐藏文件,这就是版本库,记录了版本信息,其内容由git维护,不要手动去改动
//git init --bare //创建一个没有工作区的空仓库,当做远程仓库,只有存储与提取版本库的功能,而不能编辑库的内容(如果用有工作区的仓库当远程仓库,在此工作区的某一分支上操作时,无法收到远程的提交,会导致一些问题)
touch test.txt
git add test.txt //添加文件到暂存区:git add
git commit -m "添加test文本文件" //提交文件到仓库:git commit -m "对此次提交的描述"
git status //查看当前仓库状态 会列出哪些文件需要添加到工作区,工作区有哪些文件可以提交等,有哪些分支可以合并等
git diff test.txt //检测文件内容与之前版本有何区别
//git diff HEAD -- test.txt //检测工作区文件与版本库最新文件有何区别
git log //查看全部日志信息,可看见每次提交的具体信息
//git log [--pretty=oneline] [--graph] [] // [单行显示log] [显示分支合并图] []
git reset --hard [HEAD^]/[HEAD^^]/[HEAD~10]/[7a9041] //重置(或者说返回)上一个提交(commit)/上上一个提交/前推第10个提交/编号为719041的提交
git reflog //记录了每一次操作,用此能获取到每一次提交行为(commit)的信息与ID
git checkeout -- test.txt //放弃上一次对工作区文件的修改(未add则还原为上一次commit的版本;add过修改后文件后再次修改,则还原为之前add到缓存区的版本)
git reset HEAD test.txt //将test.txt从暂存区重置回工作区
rm test.txt //删除文件(会被git记录到删除动作,如果反悔可用git checkout -- test.txt放弃修改)
git rm test.txt //相当于把删除操作添加到暂存区(之后再commit一次,即可在库中删除,push一次即可在远程库中删除)
使用远程Git仓库
远程Git库分为自己用服务器建的git仓库和类似GitHub或Gitee这种公司提供的托管仓库。
使用别人公司提供的托管仓库:******先注册
自己用服务器建git仓库:******先安装与配置
在作电脑上生成密钥对:id_rsa和id_rsa.pub(默认存于当前用户目录下的.ssh文件夹里)
将公钥:id_rsa.pub里的内容复制到远程仓库的公钥存放处(GitHub或Gitee的设置里,自建git服务器的目标用户目录下的.ssh/authorized_keys文件里)
添加远程仓库:(对于公共仓库GitHub或Gitee,先在远程仓库网站添加一个远程仓库,获取到它的地址;对于自建git服务器仓库,用git init --bare repositoryName.git创建空仓库,地址为:用户名@服务器IP地址:仓库绝对地址)
//将本地仓库与远程仓库关联起来
git remote add origin git@github.com:michaelliao/learngit.git
//或本地为空时直接克隆远程仓库
git clone git@github.com:michaelliao/gitskills.git
//然后开始推送,-u会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
git push -u origin master
第一次推送master
分支时,加上-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
git分支
创建分支
git branch dev //创建分支
git checkout dev //切换到分支
//或一部到位:
git checkout -b dev //创建并切换到分支
git branch //查看分支,当前分支由*前缀标注
//git branch -r/-a //(-r -remote ;-a -all)查看远程/所有即远程加本地 的分支
//在dev分支上正常工作并提交后,可以切换到主分支(maser),再合并
git checkout master //装换到master分支
git merge dev //快速合并 dev 分支到当前分支
git branch -d dev //删除 dev 分支
//使用switch进行分支操作:
git switch -c dev //创建并切换到dev
git switch master //靠分支名切换到目标分支
//git merge 相当于一次commit,所以当分支冲突时,会在当前分支的冲突文件中列出冲突的双方,需要我们手动解决冲突,之后不必再merge,而是add该文件并commit。
//merge加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,(即使分支已经删除)能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
git merge --no-ff -m '相当于一次有记录的commit,这是commit描述'
//stash功能,在工作到一半无法提交却又需要转换分支做其它事情时,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:stash后就得到一个干净的工作区,可以任意切换分支或开新分支进行急切的工作,完了之后再回来继续剩下的工作。不stash会报错,警告,无法切换分支,并要求你提交或stash。
git stash //保留工作现场
//do sth....然后切换回该分支
git stash list //查看工作现场列表
//然后恢复工作现场并删除工作现场记录
git stash apply [stash@{工作现场编号}]//恢复[列表里特定的工作现场]
git stash drop //删除
//或一步到位,用pop取出最近的工作现场(取出列表里就没了,所以不必再删除)
git stash pop
//在一个分支上改好了一个bug,但在当前分支上并没改过,可用cherry-pick复制更改bug的那一次commit到本分支。
git cherry-pick 4c805e2 //4c805e2是更改bug的那一次commit的编号
//要强行删除没合并但提交过更改的分支,需要用-D参数
git branch -D dev //强行删除没合并的dev分支
Git远程协作
从远程仓克隆后只会看到master分支,想要在远程仓库有的其他分支上操作 ,需先创建远程origin
的其他分支到本地
git checkout -b dev origin/dev //加上远程仓库的分支名参数,以在本地建立该分支
//
//如果多人提交发生冲突,那后提交的人需要将改动后的分支pull到本地,同本地冲突处理一样,手动处理冲突并再push,pull其他分支需要先指定本地某分支与远程origin/某分支的链接
git branch --set-upstream-to=origin/dev dev //指定本地dev分支与远程origin/dev分支的链接
git rebase //优化可变的本地合并历史线
Git打标签
tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。比如v1.0.1
git tag v1.0.1 [9527a] //在当前分支的最新commit上打上标签[在指定的编号为9527a的commit上打标签]
git tag -a v0.1 -m "version 0.1 released" 1094adb //-a指定标签名-m指定标签描述
git tag //查看所有标签
git show v1.0.1 //git 标签名 查看标签信息
//操作
git tag -d v1.0.1 //删除名为v1.0.1的标签
git push origin v1.0.1 //推送某一个标签
git push origin --tags //推送所有标签
//远程删除:先删除本地标签,再推送删除远程标签
git tag -d v1.0.1
git push origin :refs/tags/v1.0.1
Git使用优化
.gitignore 忽略项配置文件,模板,用来让Git忽略工作区文件夹里一些不需要(如编译的中间文件)或不能(如自己的密码文件)加入仓库并推送到远程的文件
配置别名:有些git指令较长,可以设置别名将其简化:
git config --global alias.st status //将status简化为st,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
git config --global alias.unstage 'reset HEAD' //将指令组合字符串'reset HEAD'简化为unstage
//每个仓库的Git配置文件都放在.git/config文件中,当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中。进入文件,别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。