Git命令大全及相关概念

来源:互联网 发布:鸟哥linux私房菜基础篇 编辑:程序博客网 时间:2024/06/09 20:46

Unix哲学:没有消息就是最好的消息

git相关名称解释

工作区(working directory):电脑里能看到的目录,你存放git的文件夹版本库(repository):工作区里面一个隐藏的目录(.git),这个不算工作区,而是git的版本库

这里写图片描述

git版本库里面的东西很多,最重要的就是stage(或者叫index)的暂存区,还有git为我们自动创建的第一个分支master(唯一),以及指向master的一个指针叫HEAD
简单理解为:需要提交的文件通通放到暂存区,然后一次性提交暂存区的所有修改
一旦完成提交后,如果没有对工作区做任何修改,那么工作区就是干净的(working directory clean)
每次修改如果不add到暂存区,就不会加入到commit中
撤销修改的前提是还未commit;

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用git checkout –file‘

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file 回到场景1,第二步按照场景1操作;

场景3:已经提交了不合适的修改到版本库,想要撤销本次提交,用版本回退的命令即可,切记都是不能推送远程仓库的,否则玩完了’;

Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快

Git的分支是与众不同的,无论创建,切换和删除分支,git在1秒钟之内就能完成!不论你的版本是1个文件还是1万个文件

HEAD指向的就是当前分支,master指向提交;每次提交,master分支都会向前移动一步,这样随着不断的提交,master分支的线也越来越长
这里写图片描述

因为创建、合并和删除分支非常快,所有git鼓励使用分支完成某个任务,合并后再删掉分支,这和直接在主分支上工作的效果是一样的,但过程更安全;

这里写图片描述
这种情况下git无法执行”快速合并”,但它会试图把各自的修改合并起来,并这种合并可能会有冲突;执行git merge feature1时会提示冲突的位置,必须手动解决冲突后再提交即可

分支管理的基本原则:
1.master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能再上门干活
2.干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
3.你和你的小伙伴每个人后再dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了;
这里写图片描述
合并分支时,加上 “–no-ff” 参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而”fast forward”合并就看不出来曾经做过合并

首先要确定在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支

你可以多次stash,恢复的时候,先用git stash list查看恢复指定的stash

修复bug是,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,恢复后,再git stash pop 回到工作现场;

也不是一定要把本地分支往远程推送,一般而言,master分支是主分支,因此需要时刻与远程同步dev分支是开发分支,团队所有成员都要在上面工作,所以也需要与远程同步;bug分支只用于本地修复bug,就没必要推送到远程,除非老板非要看看你每周到底修复了多少bug;feature分支是否推送到远程,取决于你是否和你的小伙伴合作在上面开发;总而言之,git中的分支完全可以再本地自己藏着万,是否推送,视你的心情而定;

多人协作的工作模式通常是这样的:
1.首先,可以试图用 git push origin branch-name 推送自己的修改;
2.如果推送失败,则因为远程分支比你的本地 更新 ,需要先用git pull试图合并;
3.如果合并有冲突,则解决冲突,并在本地提交;
4.没有冲突获取解决掉冲突后,再用 git push origin branch-name 推送就能成功;
5.如果git pull 提示”no tracking information”,则说明本地分支和远程分支没有创建链接关系,用命令 git branch –set-upstream branch-name origin/branch-name;
这就是多人协作的工作模式,一旦熟悉了就非常简单;

发布版本时,我们通常现在版本库中打一个标签(tag) ,这样,就唯一确定了打标签的版本,将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来,所以,标签也是版本库的一个快照;git标签虽然是版本库的快照,但其实它就是指向某个commit的指针(和分支很像,但分支可以移动,标签不能移动),所以,创建和删除标签都是瞬时完成的。
情景:”把上周一的那个版本打包发布,commit号是6a72341e…”
“一串乱七八糟的数字不好找”
换一种方式:
“把上周一的那个版本打包发布,版本号是v1.2”
“好的,按照tag v1.2查找commit就行!”
所以tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起;`

在GitHub上,可以任意Fork开源仓库;自己拥有Fork后的仓库的读写权限;可以推送pull request给官方仓库来贡献代码

在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件

忽略文件的原则是:、
忽略操作系统自动生成的文件,比如缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

配置Git的时候,加上–global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中
当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中
给Git配置好别名,就可以输入命令时偷个懒。我们鼓励偷懒

git相关命令

1.git init 通过这个命令将目录变成git可以管理的仓库2.git add 告诉git,把文件添加到仓库3.git commit 可以多次add不同的文件后,commit可以一次提交很多文件4.git status 查看仓库的状态,看到什么文件被修改了,什么文件还未提交等5.git diff 查看文件与上次修改的不同之处difference6.git log 查看历史记录,就是查看之前每次都修改了什么内容+ --pretty=oneline7.git reset --hard HEAD` 版本回退到上一个版本 HEAD``上上个版本 HEAD~100上100个版本8.git reset --hard 3628164 回到文件指定id版本9.git reflog 记录每一次命令,命令的操作历史

这里写图片描述

10.git checkout -- file 丢弃对工作区的修改(可以add但还未commit),总而言之就是让文件回到最近一次git commit或git add时的状态11.git reset HEAD file 把暂存区的修改撤销掉(unstage),重新放回工作区git reset 这个命令既可以回退版,也可以把暂存区的修改回退到工作区。使用HEAD时,表示最新的版本12.git rm file 从版本库删除文件,记得用git commit命令提交;如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容;13.git checkout 其实就是用版本库的版本替换工作区的版本,不论工作区是修改还是删除,都可以"一键还原"14.git remote add origin git@github.com:journey/learngit.git 在本地仓库运行命令,关联远程仓库,journey为自己的GITHUB账户名,添加后远程库的名字就是origin(默认叫法,也可以改成别的)15.git push -u origin master 将本地仓库的内容推送远程,实际上是把当前分支master推送到远程;-u 参数git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令了;推送成功后,可以再github页面中看到远程库的内容已经和本地一模一样;而后,通过git push origin master命令把本地master分支的最新修改推送到github即可16.git clone git@github.com:journey/gitskills.git 从远程库克隆一个本地仓库 (或者使用https://github.com/journey/gitskills.git)只是协议不一样17.git checkout -b dev 创建+切换分支 创建dev分支,然后切换到dev分支 -b参数表示创建并切换,相当于以下两台命令:git branch dev(创建分支) 和 git checkout dev (切换分支)18.git branch 命令查看当前的所有分支(在当前分支前面会标一个*号)19.git checkout master 切换回master分支20.git merge dev 命令用于合并指定分支到当前分支21.git branch -d dev 删除dev分支22.git log --graph --pretty=online --abbrev-commit 可以查看分支的合并情况(查看分支的合并图 )23.git merge --no-ff -m "merge with no-ff" dev 合并dev分支,--no-ff表示禁用Fast forward;24.git stash 可以把当前工作现场"储藏"起来,等以后恢复现场后继续工作(情况就是当你当前正在dev分支上进行的工作还没有完成,没法提交,预计完成还需要一天时间,但你必须在两个小时内修复该bug,通过该命令即可) 执行该命令后,用git status查看工作区,就是干净的,因此可以放心地创建分支来修复bug;创建git checkout -b issue-101 分支来修复bug;修复后添加提交然后删除即可,最后切换为之前工作的分支;25.git stash list 查看stash内容;查看"储藏"的工作现场;可以看到工作现场还在,git把stash内容存在某个地方了,但是需要恢复一下;如下两种方式;26.git stash apply 恢复stash内容,但是恢复后,stash内容并不删除,需要用git stash drop 来删除;27.git stash pop,恢复stash内容的同时把stash内容也删除;28.git stash apply stash@{0} 恢复指定的stash29.git branch -D feature-vulcan 强行删除未合并的分支(比如接到上级命令,因经费不足,新功能必须取消时,就需要不合并就删除分支)注意是大写的D;30.git remote 查看远程仓库的信息;或者 git remote -v 显示更详细的信息;显示的详细信息和对应的权限相关;没有权限就看不到相应的地址;本地新建的分支如果不推送到远程,对其他人就是不可见的;31.git push origin master 推送分支,就是把该分支上的所有本地提交推送到远程仓库,推送时,要指定本地分支,这样,git就会把该分支推送到远程库对应的远程分支上;32.git clone git@github.com:journey/learngit.git ;当你的小伙伴从远程库克隆时,默认情况下,你的小伙伴只能看到本地的master分支,可以用git branch命令查看所有分支;33.git checkout -b dev origin/dev 你的小伙伴需要在dev分支上开发,就必须创建远程origin的dev分支到本地,用本命令创建本地dev分支;34.git pull 把最新的提交从远程origin/dev抓取下来;情景你的小伙伴和你都对同样的文件作了修改,小伙伴最新的提交和你试图推送的提交有冲突,解决方案就是先用pull从远程抓取,在本地合并,解决冲突,再推送;35.git branch --set-upstream dev origin/dev 指定本地dev分支与远程origin/dev分支的连接,pull时会失败,根据提示执行本命令即可;36.git tag <name> 就可以打一个标签;首先需切换到需要打标签的分支上;37.git tag 查看所有的标签;默认标签是打在最新提交的commit上的,情景:如果忘记打标签,通过git log --pretty=online --abbrev-commit 查看操作的历史找到历史提交的commit id,然后打上就可以了;如下38.git tag v0.9 6224937 比如要对add merge 这次提交打标签,它对应的commit id是 6224937,执行本命令即可;39.git show <tagname> 查看对应标签的详细信息40.git tag -a v0.1 -m "version 0.1 released" 3628164 创建带有说明的标签,用-a指定标签名,-m指定说明文字41.git tag -s v0.2 -m "signed version 0.2 released" fec145a 通过-s 用私钥签名一个标签;签名采用PGP签名,因此必须先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错;如果报错,参考GnuPG帮助文档配置key;用命令git show <tagname> 可以看到PGP签名信息;42.git config --global color.ui true 让Git显示颜色,会让命令输出看起来更醒目43.git add -f App.class 你想添加一个文件到Git,但发现添加不了,原因是这个文件被.gitignore忽略了,如果你确实想添加该文件,可以用-f强制添加到Git44.git check-ignore -v App.class 可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查,Git会告诉我们.gitignore的第3行规则忽略了该文件,于是我们就可以知道应该修订哪个规则.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理45.git config --global alias.st status 敲git st就表示git status ;git config --global alias.co checkoutgit config --global alias.ci commitgit config --global alias.br branch;命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区。既然是一个unstage操作,就可以配置一个unstage别名git config --global alias.unstage 'reset HEAD'配置一个git last,让其显示最后一次提交信息:git config --global alias.last 'log -1'把lg配置成了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服务器的步骤比较简单,10分钟搞定,此处连接地址:搭建git服务器

总结:

Git虽然极其强大,命令繁多,但常用的就那么十来个,掌握好这十几个常用命令,你已经可以得心应手地使用Git

0 0