Git命令
Git命令
2018年2月5日
[TOC]
配置开发者信息
用户名和邮箱是本地git客户端的变量,它不随git库的改变而改变。每一次提交都会记录用户名和邮箱。github的贡献统计就是按照邮箱来统计的。码云的邮箱名和登录名要一致才会被统计到。
git config user.name
查看用户名
git config user.email
查看邮箱名
git config --global user.name "username"
修改用户名
git config --global user.email "useremail"
修改邮箱名
创建版本库
git init
把当前目录变成可以管理的工作区。git可以看作由工作区、版本库两部分组成,版本库又分为暂存区和master分支(又称为当前分支或本地仓库)
git add <file>
或git add -A
把文件修改添加到暂存区,Git跟踪并管理的是修改,而非文件。所以,每一次修改后,都要使用git add 命令
git commit -m "提交的说明"
一次性把暂存区的所有内容提交到当前分支(暂存区的所有内容清空),git commit相当于保存了一个快照,以后我们可以从指定的一个commit中进行恢复
版本管理
git log
或git log --pretty=oneline
查看提交历史,显示时间上由近到远的提交情况,其中看到的一大串随机字符串是每次提交自动生成的commit id
git reset --hard HEAD^
或git reset --hard 747534
表示返回上一个版本,HEAD表示当前版本,HEAD^^表示上一个版本的上一个版本,以此类推HEAD~100表示往上100个版本
747534表示版本号,这个版本号不一定要写全,git会自动去寻找对应的版本。如果你不记得版本号,可以使用命令
git reset HEAD file
把暂存区的修改撤销掉,放回到工作区
git reflog
查看命令历史
git diff HEAD -- aabb
查看aabb文件在工作区与版本库里最新版本的区别
git status
查看工作区每个文件的状态,Changes not staged for commit:表示修改的文件还没有从工作区提交到暂存区;Untracked files:表示文件还没有被添加过,所以状态是Untracked。对于这两种状态的文件,我们可以通过
- git add命令将其提交到暂存区。再用git status命令看到的就是Changes to be committed,其中分为newfile和modified两种类型。
- git commit命令提交所有修改到分之后,再用git status命令看到的就是nothing to commit,表示工作区是干净的
On branch master,Your branch is ahead of ‘origin/master’ by 2 commits,nothing to commit, working directory clean表示本地的所有改动都已经通过2次commit操作更新到本地仓库了,但是远程仓库还没有进行这2次commit,我们可以通过 git push origin master让远程仓库与本地仓库同步
git checkout -- aabb
把aabb文件在工作区中的修改全部撤销,让它回到暂存区的aabb文件状态,暂存区的aabb文件状态为空则回到分支的aabb文件状态。总得来说git checkout – aabb,对于误删和误改都有一键还原的作用。
git rm
从分支中删除掉一个文件,紧接着要使用git commit命令提交这种删除操作到分支。
远程仓库
在本地创建了一个Git仓库后,又想在GitHub创建一个可以与本地仓库同步的Git仓库,这样,Git仓库既可以发挥备份和与他人协作的作用。
首先,远程创建一个仓库,而且创建这个仓库的时候不要进行任何初始化操作
然后在本地git环境添加远程仓库:
git remote add origin git@github.com:XXXXX/xxxx.git
把一个已有的本地仓库与Git仓库关联,Git仓库的名字置为origin git@github.com:XXXXX/xxxx.git 走的是SSH协议,https://gitee.com/XXXXX/xxxx.git走的是https协议 可以通过 git remote add 带不同格式的参数,选择不同的协议
git remote remove origin
取消与本地关联的远程库
接下来是重点,敲黑板!!!
实现远程仓库和本地仓库同步的总体流程如下:
①git add <文件名>
命令把我们修改过的文件提交到暂存区
②git commit -m "注释"
命令把暂存区的内容提交到本地仓库
③一般在push之前要先git pull origin master,git pull origin master
命令把远程仓库中别人的修改拉取到本地仓库,如果有冲突,需要解决冲突,git冲突解决参考https://www.cnblogs.com/VergiLyn/p/6701642.html。此时本地仓库代码已经是最新的了。
注意:git pull
相当于是从远程获取最新版本并merge
到本地。一般地,pull之前,在本地创建一个新分支并commit到这个新分支,以保证本地有commit记录,万一出问题,可以找回代码,以免代码丢失。另外,执行这个命令后可能会进入一个信息填写页面,填写备注信息后,存盘退出即可
④git push origin master
命令把本地仓库的代码推送到远程仓库,存在冲突的可能很小,有冲突就再次解决,git冲突解决参考https://www.cnblogs.com/VergiLyn/p/6701642.html
注意:第一次使用push要加上-u参数,git push -u origin master
-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。之后git push
就可以了
除了上面描述,还有一种和远程库关联的方式
把Git仓库和本地仓库关联的第二方式是:先创建远程库,然后,从远程库克隆
git clone git@github.com:XXXXX/xxxx.git
指定用户名和密码,拉取远程master分支:git clone https://name:password@gitee.com/qq989320/SMSPlatform.git
指定用户名和密码,拉取远程指定分支:git clone -b dev https://name:password@gitee.com/qq989320/SMSPlatform.git
克隆一个仓库到本地,Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin
git remote
或git remote -v
查看远程仓库的信息或详细信息,对于-v参数:显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址
分支管理
git branch -a
查看远程仓库有哪些分支
git branch
查看本地分支命令,当前的本地分支会加上*号
git checkout -b dev
(这条命令在自己创建分支时使用)
创建dev分支,然后切换到dev分支(),相当于以下两条命令:
git branch dev
和git checkout dev
新创建的分支是指向当前的master分支的,自己创建的分支,对于别人是不可见的,自己的分支可以和主分支合并
git checkout -b dev origin/dev
(这条命令在把远程库已有该分支的情况下使用,但是在执行本命令之前,要先去master分支pull下代码)
对于复杂的系统,我们可能要开好几个分支来开发,那么怎样使用git合并分支呢?
合并步骤:
1、进入要合并的分支(如开发分支合并到master,则进入master目录)
git checkout master
git pull
2、查看所有分支是否都pull下来了
git branch -a
3、使用merge合并开发分支
git merge 分支名
4、查看合并之后的状态
git status
5、有冲突的话,通过IDE解决冲突;
6、解决冲突之后,将冲突文件提交暂存区
git add 冲突文件
7、提交merge之后的结果
git commit
如果不是使用git commit -m "备注" ,那么git会自动将合并的结果作为备注,提交本地仓库;
8、本地仓库代码提交远程仓库
git push
git将分支合并到分支,将master合并到分支的操作步骤是一样的。
创建远程origin的dev分支到本地
git checkout dev
把当前的本地分支切换到本地dev分支
git push origin xxx
第一次使用push要加上-u参数,
git push -u origin xxx
,让远程的分支和本地的分支产生关联,可以简化命令
这条命令的功能是把xxx分支上的所有本地提交推送到远程库对应的分支上,但是,在业务流程上并不是一定要把本地分支往远程推送:
master
分支是主分支,要时刻与远程同步- dev分支是开发分支,所有成员都要在上面工作,也需要与远程同步
- bug分支只用于在本地修复bug,就没必要推到远程了
- feature分支根据实际情况决定
git pull origin dev
把远程的dev分支内容拉取到本地的dev分支
git pull命令的完整格式是:
git pull <远程主机名> <远程分支名>:<本地分支名>
注意:
git branch --set-upstream-to master origin/master
可以手动建立本地master分支和远程master分支的追踪关系。如果当前分支与远程分支存在追踪关系,git pull
就可以省略远程分支名。例如,git pull origin
表示,本地的当前分支自动与对应的远程主机”追踪分支”进行合并。更特别地,如果当前分支只有一个追踪分支,连远程主机名都可以省略,git pull
表示当前分支自动与唯一一个追踪分支进行合并。把最新的提交从抓下来,如果在pull的时候提醒no tracking information,说明本地分支和远程分支的链接关系没有创建,就用命令
git branch --set-upstream dev origin/dev
指定本地dev分支与远程origin/dev分支的链接
git pull origin master 提示 refusing to merge unrelated histories
原因:本地项目和托管项目是完全两个不同的项目
解决方法执行:
git pull origin master --allow-unrelated-histories
git push origin dev
把dev分支push到远程对应的dev分支
- 多人协作的工作模式流程如下:
- 试图用git push origin dev推送自己修改的dev分支
- 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并
- 如果合并有冲突,则解决冲突,并在本地提交
- 解决掉冲突后,再用git push origin dev推送
git merge dev
合并dev分支到当前分支,merge是一种合并操作,其算法原理是三路合并:
有兴趣参考https://blog.csdn.net/u012937029/article/details/77161584
` git branch -d dev`
删除分支dev,合并分支到master后就可以删除dev分支了
git log --graph
查看分支合并图
git merge --no-ff -m "merge with no-ff" dev
- 在合并分支时,如果不产生冲突,默认采取Fast forward模式,这种模式下,删除分支后,会丢掉分支信息,看不出来曾经做过合并过
- 加上
--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并
git stash
可以把当前工作现场储藏起来,等以后恢复现场后继续工作
git stash list
查看被存储的工作场
git stash pop
恢复工作场,并把储藏的工作场删掉
git branch -D <name>
开发一个新功能,最好新建一个分支,如果要丢弃一个没有合并过的分支,就可以通过-D参数强行删除
标签管理
用tag打标签唯一确定一个版本,比使用commit id更方便,Git的标签其实就是指向某个commit的指针
git checkout master
首先,切换到需要打标签的分支上
git tag v1.0
给master分支上的当前commit打上v1.0的标签
git tag v0.9 6224937
给指定的commit版本打上标签
git tag
查看所有标签,标签出现的顺序按照字母排列顺序
git show v0.9
查看打了标签的commit的所有信息
git tag -a <tagname> -m "......."
指定标签信息为…….
` git tag -d v0.1`
删除指定标签v0.1
git push origin v0.1
推送标签v0.1到远程
git push origin --tags
一次性推送全部尚未推送到远程的本地标签
如果标签已经推送到远程,要删除远程标签就:
it tag -d v0.9
先删除本地标签v0.9git push origin :refs/tags/v0.9
再远程删除标签v0.9
自定义Git
某些文件在Git工作目录中,但又不需要提交它们。在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
-
在项目的根目录下启动git bash窗口,执行touch .gitignore
-
然后在.gitignore中编辑规则
#过滤掉文件夹下的所有内容
/bin/
#过滤掉所有class文件
*.class
#过滤掉指定文件
/bin/a.class
-
执行git add .和git commit -m “update gitignore”命令提交规则
参考资料
[1] : https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
[2]:http://www.runoob.com/git/git-tutorial.html
[3]:https://git-scm.com/