Git命令

2018, Feb 05    

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 loggit 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。对于这两种状态的文件,我们可以通过

  1. git add命令将其提交到暂存区。再用git status命令看到的就是Changes to be committed,其中分为newfile和modified两种类型。
  2. 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 mastergit 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 remotegit remote -v

查看远程仓库的信息或详细信息,对于-v参数:显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址

分支管理

git branch -a

查看远程仓库有哪些分支

git branch

查看本地分支命令,当前的本地分支会加上*号

git checkout -b dev (这条命令在自己创建分支时使用)

创建dev分支,然后切换到dev分支(),相当于以下两条命令:git branch devgit 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分支

  • 多人协作的工作模式流程如下:
  1. 试图用git push origin dev推送自己修改的dev分支
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并
  3. 如果合并有冲突,则解决冲突,并在本地提交
  4. 解决掉冲突后,再用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

一次性推送全部尚未推送到远程的本地标签

如果标签已经推送到远程,要删除远程标签就:

  1. it tag -d v0.9先删除本地标签v0.9
  2. git 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/