【转】git命令集
点击鼠标右键,选择git bash,即可打开Windows下的命令行工具,接着进行后续git操作。
一、学习链接
二、Git相关配置
1 $git config --global user.name “abc”; 2 $git config --global user.email “abc@qq.com” 3 $git config --list
三、Git支持多种数据传输协议
1 本地协议 2 HTTP协议,即http(s):// 3 SSH协议,即user@server:path.git 4 GIT协议,即git://
四、Git常见缩写
1 -a指-all 2 -b指branch 3 -d指--delete 4 -f指force 5 -h指help 6 -m指--move或者--merge 7 -p指--patch(补丁) 8 -r指--remote 9 -t指--track 10 -u指--set-upstream 11 -v指verbose(详细信息)
五、Git基本命令
1 $git help:查看系统自带的帮助文档 2 $git status:检查当前工作区文件修改状态 3 $git show:显示一个标签或一个提交的信息,具体代码 4 $git tag:为代码历史记录中的某一个点指定永久的标签,列出本地标签 5 $git tag tagName:新建标签 6 $git tag -d tagName:删除标签 7 $git log:查看提交历史,显示head所指向的commit为止的所有记录,查看本地日志 8 $git log -p fileName:查看指定文件的提交历史(文件名要写全,包括后缀) 9 $git log dev ^master:查看dev有,master没有 10 $git log master ^dev:查看dev没有,master有 11 $git log master..dev:查看dev比master多提交了哪些内容 12 $git log dev..master:查看master比dev多提交了哪些内容 13 $git log dev...master:不知道哪个分支提交多,哪个分支提交少,单纯想知道不一样。 14 $git log --left-right dev...master:显示每个提交在哪个分支上,commit后面的左箭头表示dev的,右箭头表示提交在master上。 15 $git log -p -2:查看最近两次更新内容的差异 16 $git diff:显示更新了哪些部分,即工作区文件和缓存区文件的差异 17 $git diff --cached:显示缓存区文件和上次提交文件的差异 18 $git log --reverse:逆向显示所有日志 19 $git log --pretty=format:%B:定制格式输出日志 比如feat:修复报错,键盘拨起 20 $git reflog:查看本地操作记录
1 $git reset HEAD .:把暂存区的修改撤销掉。用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^ 2 $git reset HEAD^:把所有内容回退到上一个版本 3 $git reset HEAD ^fileName:把文件回退到上一个版本 4 $git reset --mixed:回退到某个版本,回退commit和index信息,只保留源码 5 $git reset --soft:回退到某个版本,回退commit信息,如果还要提交,直接commit 6 $git reset --hard<ID>:彻底回退到某个版本,本地源码也会变为上一个版本的内容 7 $git reset --hard origin/master:将本地的状态回退到和远程一样 8 $git reset:撤销某次提交,此次操作后的commit都会被退回暂存区 9 $git revert:撤销某次操作,此次操作前的commit都会被保留 10 $git bisect:通过二分查找哪个提交导致bug 11 $git blame:标注文件的行,指出每行的最后提交信息及提交作者 12 $git blame fileName:以列表方式查看指定文件的提交历史 13 $git grep:在源码中甚至文件中查找任何字符串或正则表达式
1 $git remote add repoName url:添加远程仓库 2 $git remote rm repoName:移除远程仓库 3 $git remote rename oldRepo newRepo:重命名远程仓库 4 $git remote show origin:查看远程仓库状态 5 $git remote -v:查看远程服务器地址和仓库名称
1 $git pull=git fetch+git merge 2 $git pull origin develop:更新develop分支 3 $git pull origin remoteBranchName : localBranchName:从origin主机拉取remoteBranchName分支,与localBranchName分支合并 4 $git pull origin remoteBranchName:远程分支与当前分支合并 5 $git pull --rebase origin remoteBranchName:localBranchName:从origin主机拉取remoteBranchName分支,然后推送本地分支到远端(变基) 6 $git fetch origin:拉取远程仓库有,但本地没有的信息 7 $git merge branchName:把一个分支的修改合并到当前分支 8 $git merge origin/master:将远程主分支合并到本地当前分支 9 $git rebase branchName:把一个分支的修改合并到当前分支 10 $git rebase --skip:跳过,忽略冲突 11 $git rebase --abort:取消合并,取消本次变基 12 $git rebase --continue:处理完冲突,继续合并
13.$git merge 和$git rebase的区别?
(1)前者适合琐碎的简单合并,全部合并结束后,再进行内部整理;
(2)后者适合系统级合并,边合并边整理。使用rebase合并时,本地仓库要足够干净。
(3)变基是代码变化合并的一种方式。合并是大炮,把冲突一次性解决,变基是连发手枪,每次解决一个提交的冲突。
1 $git clone url:克隆代码库,默认拷贝跟踪远程的master分支 2 $git submodule init:初始化子模块 3 $git submodule update:更新子模块 4 $git add .:添加当前目录下的所有文件和子目录 5 $git add fileName
(1)把已跟踪的文件(文件修改)放到暂存区(缓存区);
(2)合并时,把有冲突的文件标记为已解决的状态;
(3)根据目标文件状态的不同,命令产生的效果也不同。
1 $git rm fileName:从工作目录和暂存区移除文件 2 $git rm --cached fileName:从暂存区移除但不从工作目录移除文件
3 $git mv a.txt b.txt:把a.txt改名为b.txt,重命名文件 4 $vim fileName:查看该文件源代码 5 $git commit:跳出文本编译器,写多行commit提交信息。 6 $git commit -m “提交说明”:提交文件修改 7 $git commit -a -m “提交说明”:跳过git add那步 8 $git commit -am “提交说明”:跳过git add那步 9 $git commit --amend:撤销提交、修改最后一次提交 10 $git branch branchName:创建分支 11 $git branch -t newBranchName origin / remoteBranchName:从远端拉分支 12 $git checkout -b branchName:创建并切换到该分支上 13 $git checkout -b newBranchName oldBranchName :基于旧分支创建新分支 14 $git checkout -b localBranchName origin / remoteBranchName:基于远程分支创建本地分支 15 $git checkout branchName:切换到已经存在的分支 16 $git checkout -f branchName:强制切换 17 $git checkout .:撤销所有修改 18 $git checkout filenamepath:撤消对文件的修改 19 $git branch -d branchName:删除本地分支,如果分支没有被合并,会提示删除失败 20 $git branch -D branchName:强制删除,即使分支没有被合并,也照删不误 21 $git branch -d -r branchName:删除远程分支 22 $git branch -m|-M oldBranchName newBranchName:重命名分支,如果新分支已经存在,则需要使用-M强制重命名 23 $git branch:列出当前仓库下的所有分支,显示所有本地分支 24 $git branch -r:显示所有远程分支 25 $git branch -a:显示所有分支 26 $git branch -v:查看每个分支的最后一次提交 27 $git branch --merged:查看哪些分支已经合并到当前分支
1 $git stash:把修改储藏在堆栈上,切换分支去做其他事 2 $git stash pop:释放暂存 3 $git stash -u:储藏未跟踪文件 4 $git stash list:以列表形式查看储藏的信息 5 $git stash apply:重新应用储藏的工作 6 $git stash apply storeName:如果不指定储藏, git会默认是最近的储藏。 7 $git stash drop storeName:从堆栈上移除暂存的信息 8 $git stash --keep-index:不储藏暂存 9 $git stash --all:移除每一样东西,并存放在栈中。 10 $git clean:去除冗余文件,清理工作目录。 11 $git clean -dxf:清除所有未跟踪文件,包括纳入ignored的文件。如果要保留ignored的文件修改,使用参数-df。 12 $git clean -d -n:演习告诉我们即将移除什么 13 $git clean -f -d:移除所有未跟踪的文件以及空的子目录
1 $git push origin master:将本地主分支推到远程主分支 2 $git push origin branchName:创建远程分支 3 $git push origin tagName:创建远程tag 4 $git push origin remoteBranchName : localBranchName:推送本地分支到远端服务器 5 $git push origin :remoteBranchName:删除远程分支 6 $git push origin --delete remoteBranchName:删除远程分支 7 $git push -u origin master:将本地主分支推到远程(如无远程分支,则创建,用于初始化远程仓库)
8 $git cherry-pick 提交id:挑拣提交。
六、Git中的submodule是干什么的?
Git 子模块功能允许你将一个Git仓库当作另外一个Git仓库的子目录,允许你克隆另外一个仓库到你的项目中并且保持你的提交相对独立。Submodule是git自带的一个功能,允许将一个仓库挂到另一个仓库上,一个仓库可以有多个submodule,同一仓库的不同分支,submodule的状态可以不同。添加submodule,可以用$git submodule add repoUrl。克隆有submodule的仓库,可以用$git clone -- recursive repoUrl。
七、为什么要进行版本管理?
1、记录代码的每个版本,实现代码存储和备份,可以解决文件丢失和覆盖的问题;
2、多人协作场景下,可以保持自己的代码副本最新,可以解决共同编辑一个文件的冲突情况。
八、简述GIT与SVN的区别
1、Git的配置级别:Local,Global,System;
2、Git是分布式的SCM,Svn是集中式的;
3、Git每个历史版本存储完整的文件,Svn只存储文件差异;
4、Git可离线完成大部分操作,Svn则相反;
5、Git有更优雅的分支与合并实现;
6、Git有更强的撤销修改和修改版本历史的能力;
7、Git速度更快,效率更高。
九、了解Github
1、watch:表示关注,等作者更新的时候,你可以收到通知。
2、fork:表示参与,你可以把别人的项目克隆到自己名下,然后增加或修改项目内容,通过pull request,把增加或修改的内容和原项目合并。
3、star:表示收藏,方便以后查找。
4、git使用40个16进制字符的SHA-1Hash来唯一标识对象。
十、git生成ssh key,避免每次push都要输入账号密码
1、命令行方式
A、在git命令行中输入ssh-keygen -t rsa -C "your_email@example.com" B、默认在ssh目录中生成id_rsa和id_rsa.pub两个文件。 C、输入信息环节可以略过,直接回车。 D、打开id_rsa.pub文件,里面的信息即为SSH key,将这些信息复制到GitHub的Add SSH key页面即可。
2、git gui方式
A、打开git gui -> help -> Show SSH KEY;
B、点击右上角Generate key,输入passphrase,也可以略过;
C、生成SSH Key,将这些信息复制到GitHub的Add SSH key页面即可。
3、粘贴sshkey
cat ~/.ssh/id_rsa.pub | pbcopy .
十一、一些问题
1、无法拉代码
更改hosts文件后,比如127.0.0.1 www.xxx.com,无法拉取远程代码。这时,查看~/.ssh/known_hosts文件,并删除旧的记忆,即可。ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts里。
2、无法粘贴
要在git bash下完成复制,粘贴,需要在边框上右键 -> 属性 -> 选项 ->勾选【快速编辑模式】。
3、写长段commit信息
用git commit提交版本时没有加-m,会进入vim,如何写入提交说明然后退出?
输入i,进入insert输入模式,此时光标在最上面,输入提交说明; esc,输入:, 光标跑到最下面; wq,回车。
4、区分文件名大小写
因为mac windows 在不设置大小写敏感规则的时候默认大小写是不敏感,项目部署的机器是Linux的,而Linux是大小写敏感的。所以文件大小写引起部署失败的问题平时不易发现,本地调试的时候大部分时候并不会出错误,只有在项目部署的时候问题才会显示出来。
如果本地打包正常,没有报错,jenkins打包有问题,有可能是代码中地址大小写问题。windows和mac系统电脑对大小写不敏感,Linux系统对大小写敏感。
git默认大小写不敏感,项目开发的电脑是mac或者windows,而项目部署的机器是Linux。
git config --global core.ignorecase false
# 删除不需要的大小写同名文件 git mv -f [你想要删掉的文件] [你想要留下的文件] git mv -f A.js a.js 等同于: git rm A.js git add a.js
5、合并commit
// 减少绝大部分冲突 git pull --rebase // 合并所有commit为一个commit git reset --soft commit-hash 或者 git rebase -i commit-hash
6、更新测试环境代码(需要借助push的hook)
git checkout test2 git pull --rebase git merge origin/develop git merge yourBranch git push git checkout yourBranch
在开发分支写需求和解决bug,在测试分支解决冲突。
十二、clone with ssh 和 clone with https的区别
HTTPS:不管是谁,拿到url随便clone,但是在push的时候需要验证用户名和密码;
SSH:clone的项目你必须是拥有者或者管理员,而且需要在clone前添加SSH Key。SSH 在push的时候,不需要输入用户名和密码,除非你做了设置。
十三、shell命令
source filename
这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
source(或点)命令通常用于重新执行刚修改的初始化文档,如 .bash_profile 和 .profile
是bash shell的内置命令。
十四、gitlab
gitlab显示的时间和实际提交的时间不同,差了8个小时,可能是gitlab服务器的时区没有设置,