Git常用命令大全

来源:互联网 发布:linux 中telnet命令 编辑:程序博客网 时间:2024/06/04 00:50

一:基本概念

git最大的特点是仓库分为本地仓库local和远程仓库remote,而本地仓库中又包含暂缓区(暂存区)stage

这里写图片描述

  • 工作区Working Directory(workspace): 项目源代码所在的根目录就被称为工作区,但不包含.git目录
  • 本地仓库:项目源代码下的.git隐藏目录就是本地版本库
  • 暂缓区(暂存区)stage(Index): 用于临时保存用户需要提交的操作(如新添加的文件、删除的文件、修改文件的内容、对文件进行重命名等操作),必须先将修改操作添加到暂缓区,然后再将暂缓区中的所有操作一次性提交到本地当前分支上,不能直接提交工作区到分支,需要通过暂缓区中转一下
  • 主分支master:本地仓库默认创建的分支,分支名字叫master
  • 提交点commit id: 每次提交都会生成一个id值对应着这次提交的信息,这个提交的id被称为提交点
  • HEAD: 头指针,用于指向当前分支最近的提交点commit id值, 如果当前的提交点发生变化,那么HEAD的值也随之发生变化,HEAD^: 上一个版本,HEAD^^: 上上一个版本,HEAD~n:上n个版本

这里写图片描述


二:基本命令

注意:在使用命令时,如果终端支持tab键补全的话,而没有进行补全,很可能写的命令有问题!!!

  • git help

    说明:帮助命令,可以查看某个命令的功能、示例、支持的参数等
    示例:git help init

    这里写图片描述

    这里写图片描述

  • git init

    说明: 初始化git仓库
    注意:在合适的目录下使用git init命令初始化git仓库,如果没有合适的目录就新建一个,创建成功后会在该目录下有一个隐藏的.git 文件夹

    这里写图片描述

  • git config [- -global]

    说明:针对单独某个仓库或者所有仓库进行配置用户名、邮箱、其他等
    注意:如果是单独对某个仓库进行配置,需要先要切换到要配置的仓库所在的目录,并且不加- - gloabal参数,如果针对全局配置,需要使用–global参数(全局配置的作用:如果某个仓库没有单独进行特殊配置则默认使用全局配置)

    这里写图片描述

    git config --global user.name "your username"git config --global user.email "your email address"// 启用颜色配置git config --global color.ui true
  • git config - -list

    作用:列举所有配置
    这里写图片描述

  • git config - -global alias.<别名> <原名>

    说明:用于对git命令配置别名,配置别名的作用是为了减少输入,当一个命令过长的时候可以将这一长串命令用一个别名来代替,其实就相当于将一长串命令赋值给一个变量,使用这个变量就相当于使用这一长串命令

    例如:对于git log 有很多丰富的参数,如果同时使用多个参数,而且以后可能还会经常用,就可以对着一整串命令来做个简化,起个别名

    这里写图片描述

    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的所有的配置最终都会以文件的形式保存下来:配置的用户名和密码保存在当前git仓库中的.git文件夹下的config文件中

这里写图片描述

全局配置文件在用户主目录下.gitconfig文件

这里写图片描述

也可以通过git config [xxx].xx 查看任意配置的值

这里写图片描述


三:常用命令


1. git diff < filename >

作用:查看当前工作区中的某个文件和上一个版本的不同

使用场景:在做git add 操作之前,可以先看一下工作区中某个文件和之前版本中的某个文件对比一下,看都修改了哪些内容,看这些修改是不是自己想要的修改,进一步来确认一下,防止修改了一些不该修改的内容

示例: git diff README.md

这里写图片描述

比较两个版本的不同: git diff <commit id> <commit id>


2. git add

说明: 可以将工作区中的新文件(new file)、修改的文件(modified)、删除的文件(deleted) 添加(追踪track)到暂缓区stage中,可以通过参数来提交某些类型的操作(如只添加新文件和修改的文件这两种类型),或者提交所有类型的操作, 可以一次添加一个,也可以批量操作一次添加多个, 只有添加到暂缓区才能进行提交

示例用法:

  • git add test.txt
  • git add test.txt test2.txt
  • git add .
  • git add -A
  • git add -u
  • git add –ignore-removal
// 添加一个或者多个文件,多个文件使用空格分割// git add 后面跟具体的文件名,允许提交所有的的操作(new file, modified, delete)git add <file> [file2...]  git add test1.txtgit add test2.txt test3.txt// .代表整个工作区,也就是说会添加整个工作区的所有文件的改变(new file, modified, delete),而不是某个或者某些文件的改变git add .// -A 是--all的缩写, 也会将工作区的所有操作都添加到暂缓区,git add -A 和 git add . 两个命令效果完全一样git add -A// -u 是-update的缩写,是将所有更新操作(modified、deleted)添加到暂缓区,不包含新的文件git add -u // --ignore-removal, 是将所有非删除操作(new file、modified)添加到暂缓区,不包含删除的文件git add --ignore-removal

· git add -A 提交所有变化

· git add -u 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)

· git add . 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件

这里写图片描述


3. git commit -m “comment”

作用:用于将暂缓区的所有操作一次性(批量)提交到本地仓库的当前分支上(可以通过git branch 查看本地所有的分支和当前所在的分支), 只有提交commit之后,才可以将分支推送到远程分支上,一旦commit之后,就会清空暂缓区,这样下次对工作区进行了修改,就可以将新的操作add到暂缓区了,然后可以对新的暂缓区进行commit了

// -m 是message的简写git commit -m "xxx"

4. git status

作用:用于查看当前工作区所做的更改和暂缓区操作的状态

说明:git status 可以观测到三种状态 new file(新添加的文件)、modified(修改的文件)、deleted(删除的文件),绿色:代表执行过git add, 红色:表示还没有执行git add命令,如果没有任何内容,表明工作区是干净的 working directory clean,所有的操作都已经被commit了,

注意:工作区是干净的只能反应出已经提交到本地仓库的当前分支,并不能反应出当前分支是否推送push到远程分支上

这里写图片描述

git status -s

说明: -s 是short的简写, -s 输出的格式更加简洁
注意: 红色表示未添加到暂存区,绿色表示已经添加到暂存区
??: 新添加的文件,还未跟踪track, 即 还没有添加到暂存区
A: 已经添加到暂缓区
左M:已经修改过的文件, 已放入暂缓区
右M:已经修改过的文件, 未被放入暂缓区
MM: 已经修改,提交了暂存区,又进行修改了
AM: 已添加,有修改
D: 删除了文件,但没有添加到暂缓区
R: 重命名

这里写图片描述


5. git rm

作用

  • 从暂缓区中删除文件:
  • 从工作区和暂缓区中删除文件

方式一: 直接使用操作系统的rm命令删除文件,然后再提交

// 先删除文件,再将删除操作添加到暂缓区,然后再提交暂缓区rm test.txtgit add test.txtgit commit -m "delete test.txt"git push origin master

方式二:使用git rm命令

git rm 比rm功能更强,更加方便

// 删除不在暂缓区中的文件// 相当于 rm <file> 和 git add <file>两步操作// 删除工作区中的文件,同时将删除操作添加到暂缓区git rm <file>

这里写图片描述

  • git rm -f < file >
    f是force的简写,如果已经修改了暂缓区中的文件,就必须使用-f参数,即删除本地文件也将删除操作添加到暂缓区
    这里写图片描述

  • git rm -r < dir >
    这里写图片描述

    删除当前目录及子目录的文件, * 号是代表任意, 使用星号需要使用反斜杠转义一下,如果不转义*号就代表普通的字符串,不具有其他意思
    这里写图片描述

    这里写图片描述

    git rm -r < dir > 当删除报错fatal: pathspec ‘xxx’ did not match any files 可以使用 git clean -fd < dir > 或者直接删除文件rm

    注意:当创建一个空的目录时是不会被git管理的,只有当目录下有内容时才会被git所管理

  • git rm - -cache < file >

    cache参数比较特殊,使用后在暂缓区同时出现两种状态D状态和??(未被跟踪),而且工作区中该文件还存在,你可以直接commit 删除的状态,推送到远程仓库,删除后悔了,也可以使用git add 将之前删除的文件再提交上去,进行恢复。

    总之:cache参数会是暂缓区出现D和??两种状态,而且不会删除本地文件

    这里写图片描述


6. git mv

作用

  • 用于移动文件:git mv < source file name > < new name >
  • 重命名renamed文件: git mv < source > < destination directory>

这里写图片描述

注意:新创建的目录,git是不跟踪,如果想被追踪,可以在目录中添加一个.xxx 隐藏文件或者readme文件,提交之后也可以删掉这个临时文件


7. git log

作用:查看所有commit类型的历史日志

示例用法:

git loggit log -n                                        // 查看最近n条日志git log -- <filename>                             // 查看指定文件相关的日志git log --author=xxx                              // 查询某个作者的提交日志git log --pretty=oneline                          // 格式化日志, 单行显示git log --pretty=oneline  --graph --abbrev-commit // 查看分支合并(以图表的方式)git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

这里写图片描述

git log 相关文章: http://www.cnblogs.com/Sir-Lin/p/6064844.html

8. git reflog

git reflog: 查看所有类型的历史日志,包括commit类型、reset类型
git log : 不显示reset类型的log,而reflog可以显示resetlog, reflog 比 log 显示的日志类型更多, 显示的更加细,能够追踪到每一步操作


9. git show < commit id > [file]

作用: 用于显示某个提交点的先关信息,可以查看某次提交的所有文件,也可以查看指定的某个文件

注意:HEAD、分支名称、标签名称 都是指向一个commit id, 所以git show 后面也可以跟HEAD、分支名称、标签名称

这里写图片描述


10. git reset < commit id> [file]

作用:

  • 将暂缓区中的内容回退到工作区
    • git add 是一种添加操作,是一种staged操作
    • git reset 是对暂缓区的一种撤销操作,是一种unstage操作,add和reset是完全相反的操作
  • 版本回退:撤销到指定指定提交点的对应的版本

一:直接放弃工作区的修改:git checkout - - < filename >

如果修改了工作区,但还没有git add 操作,此时不想要对当前工作区的修改了,想回到工作区修改前的状态,可以直接放弃掉队工作区的修改,可以使用如下命令 git checkout – file (放弃工作区的修改)

这里写图片描述

二:已经添加到暂缓区了但没有提交commit,从暂缓区中撤销出来 git reset HEAD [file]

如果已经 git add操作了,即已经将修改添加到暂缓区stage中了,此时想取消添加到暂缓区,也就是从暂缓区中删除某个或所有操作可以通过如下命令 git reset HEAD [file] (unstage操作)

如果git reset 如果不指定提交点,默认是HEAD,即git reset HEAD 一样, 如果指定文件了只回退指定文件(git reset HEAD test1.txt),如果没有指定则撤销整个暂缓区(git reset HEAD)

这里写图片描述

三:如果已经提交commit了,想切换到某个版本,git reset –hard < commit id>

git reset --hard HEAD

四:关于reset 参数 - - hard、- -mixed、 - - soft

主要反映在三个方面:

  • HEAD头指针的值是否有变化
  • 暂缓区是否会被重置
  • 工作区是否发生变化

  • mixed: 默认使用该参数,混合回退,git reset < commit id>的作用:将commit id值赋值给HEAD指针(HEAD = commit id),工作区不发生变化,重置暂缓区, 例如
    git reset 085e2d93448947fba8d4ec52188eb49588d98cb2

  • hard: 硬回退, HEAD = commit id, 重置暂缓区,工作区发生变化将工作区中的代码还原到指定版本对应的内容
    git reset --hard 96e527dcaff3ef08dd0ed743be62f23f3dfa700c

  • soft: 软回退,HEAD = commit id, 工作区的内容保持不变,最新版本的内容和commit id之间的不同已经放到暂缓区了,相当于已经做了git add 操作了
    git reset --soft 96e527dcaff3ef08dd0ed743be62f23f3dfa700c

soft参数与默认参数都不会修改工作区代码,只有hard参数才会修改工作区代码。
这里写图片描述

  • git checkout - -: 用于直接丢弃工作区的修改,工作区直接回到HEAD版本, 操作的目标是工作区
  • git reset HEAD: 将暂缓区代码重新放回到工作区,操作的目标是暂缓区,stage(git add) –> working directory(git reset HEAD), 取消git的管理,是 git add 操作的相反操作unstage,修改的代码仍让还在, 取消之后相当于还没有添加到暂缓区

git reset 相关文章:http://www.cnblogs.com/qianqiannian/p/6010238.html


11. git revert < commit id >

作用:用于撤销指定版本commit id,既可以普通的commit,也可以是合并的commit
注意:revert撤销会重新生成一个新的commit id, 并且会改变工作区中的内容

示例:撤销当前版本,就是回到上一个版本

// “fivth commit on master branch”此处提交是在readme.md文件中增加了一行内容“fivth commit on master branch”
这里写图片描述

这里写图片描述

// revert之后工作区的内容发生了变化
这里写图片描述

// revert 之后生成一个新的commit id, revert时会可以修改注释,如果不需要修改注释,直接使用系统默认的注释可以使用参数 - -no-edit参数;另一个重要的参数是-n或者–no-commit,应用这个参数会让revert 改动只限于程序员的本地仓库,而不自动进行commit,如果程序员想在revert之前进行更多的改动,或者想要revert多个commit,这个参数尤其好用
这里写图片描述

revert merge:

git log HEAD~2 -1commit f4e4068b402c1305689eee491eb4a7ade7a065d8Merge: 656401a 251bbbeAuthor: mengday.zhang <mengday.zhang@xx.com>Date:   Tue Nov 7 09:34:59 2017 +0800    fixed conflict

对于revert merge的情况,程序员需要指出revert 这个merge commit中的哪一个。通过-m或者–mainline参数,以及配合一个整数参数,git就知道到底要revert哪一个merge

如果使用git revert HEAD~1 -m 1命令,也就是656401a,使用-m 2会revert第二个commit,也就是251bbbe。

// 656401a: HEAD~2中 master分支最近一次提交
这里写图片描述

// 251bbbe: HEAD~2中 dev分支的最近一次提交
这里写图片描述

这里写图片描述

这里写图片描述

checkout reset revert 比较

  • git checkout - - < file >: 是当修改工作区的内容还没有添加到暂缓区前,直接放弃掉对暂缓区的修改,checkout作用的目标是工作区。

  • git reset : 当修改已经添加到暂缓区,想从暂缓区中撤销掉,使用reset,此时工作区的内容不变,只是在暂缓区了;通过- - hard也可以影响工作区。

  • git revert:用于撤销到指定版本,与reset不同的是,revert会重新生成一个commit id 在日志中记录下revert操作,而reset不会重新生成。


12. git clone

说明:用于下载远程仓库中的代码和远程仓库的镜像(下载到本地称为本地仓库)
描述:克隆远程git仓库即支持https协议也支持SSH协议(需要先配置ssh key)

// ssh方式git clone git@github.com:mengday/test.git// https方式git clone https://github.com/mengday/test.git

git revert 相关文章: http://www.cnblogs.com/ShaYeBlog/p/5368064.html


13. git remote

作用:

  • 用于查看远程仓库的信息
  • 绑定远程仓库地址与远程分支名称(一般为origin)
// 查看远程仓库的信息git remote -v           // 将远程仓库地址和一个变量名(一般使用origin名称,也可以是其它任意名称)进行绑定,引用变量就相当于引用git仓库的地址// 如果是本地仓库需要关联到远程仓库,需要手动添加关联git remote add origin xxx/test.git// 将本地仓库添加到远程仓库,首次push时需要用-u参数:将本地仓库推送到远程仓库的master分支,并关联起来,以后push就不需要-u参数了git push -u origin master// 取消origin和远程仓库的地址的关联,可以理解为origin = nullgit remote rm origin

这里写图片描述

这里写图片描述


14. git push < remote > < branch >

作用:将本地分支推送到远程分支上, 在哪个分支上做的修改就推送到哪个分支上

git push origin mastergit push origin devgit push origin feature-101git push origin bug-101

如果想省事,使用git push 后面不追加什么,需要先设置upstream,设置之后,以后就可以直接使用git push就可以了

git push --set-upstream origin devgit push

当本地仓库需要关联到远程仓库时,首次push时需要使用-u参数, -u 是–set-upstream的简写,上游
git push -u origin master


15. git fetch

作用:从远程仓库获取最新代码
注意:只获取代码,并不与本地分支进行合并,如果需要合并,自己手动合并
说明:在实际使用中,git fetch更安全一些,因为在merge前,我们可以查看更新情况,比较之后,然后再决定是否要进行合并

  • 方式一
// 从远程的origin的master主分支下载最新的版本到origin/master分支上git fetch origin master// 比较本地的master分支和origin/master分支的差别git log -p master..origin/master// 将本地分支和远程master分支进行手动合并git merge origin/master

这里写图片描述

  • 方式二
// 基于远程master分支创建一个本地分支,分支名字为tmpgit fetch origin master:tmp// 比较当前分支和tmp分支的不同git diff tmp// 将当前分支和tmp分支进行合并git merge tmp// 如果需要可以删除这个临时分支git branch -D tmp

这里写图片描述

方式二和方式一作用是完全一样的


16. git pull

作用:从远程服务器上拉取最新的代码并将最新的代码合并到当前分支(拉去最新代码和合并代码一步完成), pull相当于是fetch和merge的两步操作。git pull = git fetch + git merge

说明:git fetch 更安全,git pull更方便

git pull
git pull < remote > < name >

这里写图片描述


17. git branch

作用: 用于管理分支(增删改查分支)、切换分支等

使用场景:

  • 用于开发新的功能
  • 用于修复bug

实际工作环境:

  • 在实际工作中,master分支一般只用于发布到生产环境,而不会在master分支上做开发,通常master分支,比较稳定,不经常动;
  • 在实际工作中,一般会创建一个名为dev(或者develop)的分支用于作为开发的主分支,dev分支的作用一般用于合并其他功能feature分支
  • 在实际工作中,一般会基于主开发分支dev(develop)分支创建一种feature分支,分支名命名规则:feature+分隔符(/或者-)+ID,作为开发新的功能,当开发完成后,需要和dev分支进行合并merge,当需要发布新功能时,再将dev分支和并到master分支,然后再将master分支发布到生产环境上;
  • 在实际开发中,一般会基于master分支(此时master分支应当和生产环境中的代码保持一致)或者基于tag创建bug分支,在bug分支上修复bug,然后再讲bug分支merge到master分支上发布,然后再切换到dev分支上拉取master分支上最新修复bug的代码

分支命令:

  • 创建分支: git branch < name > 创建分支时要把当前分支先提交干净,如果不提交干净,工作区的更改会被视为新分支的改变;创建分支时需要先切换到你想基于那个分支创建的分支上创建分支

  • 切换分支: git checkout < name > 用于分支之间的切换

  • 创建并切换分支:git checkout -b name 相当于git branch和git checkout 两条命令

  • 查看本地分支 : git branch, 带*号的是当前分支

  • 查看远程分支: git branch -av 红色的是本地分支不存在的, -a 是-all的简写, -v: 显示创建分支时的message

  • 删除已经merge过的本地分支:git branch -d < name >, -d 只能删除已经被merge过的分支

  • 强制删除本地分支:git branch -D < name > , -D 也可以删除尚未合并的分支

  • 删除远程分支:git push origin –delete name 在删除分支时,不能删除当前分支,如果需要删除当前分支,需要先切换到其他别的分支,然后再删除那个分支

  • 创建并切换并关联远程分支:git checkcout -b name origin/name 其它同事刚clone下来的只能看到master分支是看不到其他分支的,如果需要看到某个分支,需要在本地创建一个分支并关联上 (本地分支应与远程分支名字应该保持一致)

  • 移动或者重命名分支: git branch -m < oldname > < newname > , 其实是基于老分支以新的名字创建了一个新的分支,老分支还在,如果老分支不再需要,可以手动删除,这样就达到了移动分支或者重命名分支

  • 合并分支: git merge [origin/] name 将指定的分支合并到当前分支,首先要先切换到需要合并的分支上, 然后再merge分支, merge之后需要推送到远程仓库 git push origin < name > 禁用快进模式合并:git merge - -no-ff -m ‘message’ name

// 设置当前本地分支与远程分支的关联,设置之后以后就可以直接使用git pull就行了
git branch –set-upstream-to=origin/ local-branch

【bug分支】:每个bug都可以通过创建一个分支来修复,修复后合并分支,然后再将bug分支删除, 分支名格式一般使用 bug|issue + 分割线(- 或者/)+代号,如 issue-101、 bug/101

【feature分支】:每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支, 分支名一般以feature为前缀,后跟分隔符,再跟代号,如feature/101

当合并冲突时Git用<<<<<<< HEAD ======= 来分割本地代码和远程代码, 远程代码 >>>>>>>分支名称 来标识冲突位置

相关博客 :https://blog.zengrong.net/post/1746.html


18. git tag

【使用场景】: 当需要发布新版本的时候打标签,每发布一个新颁布都要打tag

【说明】: 标签也是版本库的一个快照,即也就是指向某个commit的指针, commit id 没法记忆,tag是一个容易记住的名字,它跟某个commit id 绑定在一起,tag V1.1—-> commit id 6a5819e…

【注意】:打标签前要切换到需要打标签的分支,一般是针对于发布的分支master分支进行打标签或者针对于bug分支再次打tag

【命令】

  • git tag < name > [commit id] 可以针对某个commit id打tag,如果省略提交点则在HEAD上打tag

  • git tag -a tag-name -m “comments” [commit id] // -a 指定标签名, -m: 描述

  • git tag 查看所有tag

  • git show 查看tag的信息

  • git tag -d name 删除一个本地标签

  • git push origin :refs/tags/< tag-name > 删除远程分支,删除前先删除本地分支

  • git push origin 创建tag只是在本地,如果想提交到远程仍然要push, 推送指定的tag

  • git push origin –tags 推送所有未推送的tag

【基于tag创建分支】:此种情况使用场景是用来修复生产上的bug

如果使用 git checkout < tag-name > 就可以取得该 tag 对应的代码了, 但是,这时候 git 可能会提示你当前处于一个“detached HEAD” 状态,因为 tag 相当于是一个快照,是不能更改它的代码的,如果要在 tag 代码的基础上做修改,你需要创建一个分支并关联到tag上: git checkout -b < branch_name > < tag-name >,这样会基于tag 创建一个分支,然后就和普通的分支一样来操作了。

【branch与tag的区别】:

  • 一个tag名字指向一个提交点commit id, 一个branch名字也是指向一个提交点commit id, 所以tag和branch本质上是一样的,只是使用用途,使用场合不同。

  • tag是一个快照版本,是不允许修改代码的,只能查看备份代码;而分支可以任意修改代码


19. git stash

作用: 保存点

使用场景:当手头工作没有完成时,先把工作现场保存一下,然后去修复bug,修复后,再恢复现场到保存点

  • git stash 创建保存点,以后可用于恢复
  • git stash list:查看保存点
  • git stash apply: 恢复保存点
  • git stash drop: 删除保存点
  • git stash pop: 恢复并删除保存点

其他

Fork别人的仓库到自己的账号下就拥有的读和写的权限,如果想让原作者采纳自己的修改,需要提交一个Pull Requests 请求,让作者审核,审核通过就可以合并进去
git add -f // -f 强制添加,即使.gitignore 中存在也可以添加
git check-ignore -v 查找忽略文件中哪些配置导致某个文件被忽略了

.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!
.git/config // 每个git仓库
.gitconfig // 用户主目录

git 账号权限 https://github.com/sitaramc/gitolite

原创粉丝点击