[学习笔记] [git命令] Git具体命令学习

如果想知道Git到底有多大,那就应该知道Git平台到底有多少可用指令。执行git:

[学习笔记] [git命令] Git具体命令学习_第1张图片

上述git指令给出的结果,对Git平台上涉及到的指令进行了分类,并给出了指令格式:—command –args。想要知道Git平台的所有指令,还需要执行以下指令:git help –a。若想要知道某个具体command的含义,只需要执行:git help

 

 

[学习笔记] [git命令] Git具体命令学习_第2张图片

git config

git config –l  获取当前仓库的所有系统设置(git config --list)

git config -e [--global] // 编辑Git配置文件

git config [--global] user.name "[name]" // 设置提交代码时的用户信息

git config [--global] user.email "[email address]" // 设置提交代码时的用户信息

 

git clone

git clone xxx.git    //将项目代码clone到当前目录

git clone xxx.git "指定目录"     //clone到指定目录

git clone -b [new_branch_name]  xxx.git  //clone时创建新的分支替代默认Origin HEAD(master)

git add

Git分为的三个状态分别是:工作区,暂存区和版本区(最终修改提交的位置)。使用git add 或者 git add .将文件加入暂存区中。

git add //在提交你修改的文件之前,你需要把它们添加到暂存区。如果该文件是新创建的,你可以执行将该文件添加到暂存区

git add .  //Git会递归地将你执行命令时所在的目录中的所有文件添加上去,所以如果你将当前的工作目录作为参数,它就会追踪那儿的所有文件

git add -u  //-u参数调用了git add命令,会将本地有改动(包括删除和修改)的已经追踪的文件标记到暂存区中。

git add -A // -A参数会将添加所有改动的已跟踪文件和未跟踪文件。

git add -i  //交互式的方式进行添加。

git commit

git commit --amend  //修补式提交,比如针对bug1进行了一个提交A,但是发现有的地方漏改了需要再次提交,如果使用git commit的话就会针对一个bug产生两个commit,这时可以使用git commit --amend 这样这两次提交就会是一个commit。 

git commit -m “....”  //commit 的时候添加备注信息

 

git push

在使用git commit命令将修改从暂存区提交到本地版本库后,只剩下最后一步将本地版本库的分支推送到远程服务器上对应的分支了。

git push的一般形式为 git push <远程主机名> <本地分支名> <远程分支名> ,例如git push origin master:refs/for/master,即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名,第一个master是本地分支名,第二个master是远程分支名。

git push origin master 如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。

git push origin :refs/for/master 如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master。

git push origin 如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支。

git push 如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名

git push -u origin master 如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push。不带任何参数的git push,默认只推送当前分支,这叫做simple方式,还有一种matching方式,会推送所有有对应的远程分支的本地分支, Git 2.0之前默认使用matching,现在改为simple方式。如果想更改设置,可以使用git config命令。git config --global push.default matching OR git config --global push.default simple;可以使用git config -l 查看配置。

git push --all origin 当遇到这种情况就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要 -all 选项。

git push --force origin 在git push的时候需要本地先git pull更新到跟服务器版本一致,如果本地版本库比远程服务器上的低,那么一般会提示你git pull更新,如果一定要提交,那么可以使用这个命令。

git push origin --tags //git push 的时候不会推送分支,如果一定要推送标签的话那么可以使用这个命令

关于 refs/for :refs/for的意义在于我们提交代码到服务器之后是需要经过code review之后才能进行merge的,而refs/heads 不需要。

git push ssh://yourname@git adress:29418/xxx  HEAD:refs/for/master  //需要审核

git push ssh://yourname@git adress:29418/xxx  HEAD:refs/heads/master    //不需要审核

 

git pull

git pull //从远端的服务器上下载数据,从而实现同步更新

git pull --rebase  //有这么一种情况,用一个分支专门同步代码提供商的代码的时候,如果一般的pull会不断的产生一个merge看起来会很烦,用下边的使用添加一个--rebase就不会产生无用的merge了

// fetch 只能更新远程仓库的代码为最新的,本地仓库的代码还未被更新,我们需要通过 git merge origin/master 来合并这两个版本,你可以把它理解为合并分支一样的。pull 操作是将本地仓库和远程仓库(本地的)更新到远程的最新版本。如果想要更加可控一点的话推荐使用fetch + merge。

git rebase

用下面两幅图解释会比较清楚一些,rebase命令执行后,实际上是将分支点从C移到了G,这样分支也就具有了从C到G的功能

[学习笔记] [git命令] Git具体命令学习_第3张图片

git branch

git branch        //显示当前所在的分支和本地分支

git branch   //创建新的分支branchname

git branch -d  //删除名称为branchname的分支

git branch -a     //显示所有分支,包括远程分支

git branch -r     //查看远程branch

git status

git status .   //查看你的代码在缓存与当前工作目录的状态

git status -s  //将结果以简短的形式输出

git diff

git diff  //显示工作区和暂存区的差异

git diff HEAD  //显示工作区和HEAD之间的差异

git diff --cached  //显示暂存区和HEAD之间的差异

git diff id1 id2   //显示两次提交之间的差异

git log

git log主要用来显示分支中提交更改的记录。当执行git commit以存储一个快照的时候,文件详单、提交消息和提交者的信息、此次提交所基于的快照都会被保存。

git log --oneline   //可以显示更加短小的提交ID.,在查看大概的提交信息的时候比较方便

git log --graph    //显示何时出现了分支和合并等信息.

git log --pretty=raw //显示提交对象的parent属性.

git log -p      //显示版本历史以及版本间的内容差异

git log -1 –p   查看最新一次提交的内容(修改了哪些文件哪些内容)

git log --since="6 hours"  //显示最近6小时的提交

git log --before="2 days"  //显示两天之前的提交

git log --stat     //显示改动行数统计,显示每次提交的文件修改的行数

git revert

撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销作为一次最新的提交

git revert HEAD   //撤销前一次 commit

git revert HEAD^    //撤销前前一次 commit

git revert commitId   //撤销指定的版本,撤销也会作为一次提交进行保存。

git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容

git checkout

git checkout,检出命令

git checkout branchname   // 会改变HEAD头指针,主要用于切换分支

git checkout -b branchname //用于创建一个新的分支,并且切换到创建的新的分支上

git checkout --filename    //用暂存区中的filename文件来覆盖工作区中的filename文件

git checkout --filename //用指定提交中的文件覆盖暂存区和工作区中对应的文件

git checkout -- .或者git checkout . //用暂存区的所有文件直接覆盖本地文件,取消所有的本地的修改,是一条危险的操作

git reset

git reset -mixed     //默认方式,不带任何参数的git reset, 回退到某个版本,只保留源码,回退commit和index信息

git reset -soft //只回退commit信息,不恢复index,保留源码

git reset -hard //彻底回退到某个版本,代码的修改会被放弃变为上一个版本的内容

git reset commitid  filename  //将某个文件回退到指定版本

git reset HEAD file命令可以把暂存区的修改撤销掉(unstage),重新放回工作区。git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。(HEAD^表示上一个版本,就是git log的第二次)

git stash

git stash 可用来暂存当前正在进行的工作, 比如想pull 最新代码, 又不想加新commit, 或者另外一种情况,为了fix 一个紧急的bug,  先stash, 使返回到自己上一个commit, 改完bug之后再stash pop, 继续原来的工作。

如果多次git stash,可以使用git stash list’ 命令将当前的Git栈信息打印出来,找到对应的版本号,使用’git stash apply stash@{1}’就可以将指定版本号为stash@{1}的工作取出来,当所有的栈都应用回来的时候,可以使用’git stash clear’来将栈清空。

git stash    //将未提交的修改保存

git stash list  //列出多个stash

git show stash@{0}   //查看最新的stash

git stash pop   //应用最新的stash 并将其中stash list中删除

git stash apply stash@{1}  //取出版本号为stash@{1}的 stash

git show

显示具体的代码改动情况

git show    //显示最后一次 commit 修改的内容

git show commitid  //显示指定 commit 修改的内容

git merge branch_name

合并指定分支到当前分支

git format-patch

git format-patch -s   commitId  //针对commitId以后的提交生成patch,不包括commitId这次提交

git format-patch -n    //从最近一次提交开始生成前n次提交的patch,包括最近一次提交

git format-patch -n   commitId  //从commitId那次提交开始生成前n次提交的patch,包括commitId那次提交

git am

补丁的应用

打补丁的方法详见Git打patch的方法

git cherry-pick commitId

用于把另一个本地分支的commit修改应用到当前分支

1)git log 查看并记录要cherry-pick的commit id

2)切换分支

3)执行 git cherry-pick commitId

4)如果有冲突,解决冲突后

git add

git commit -c <原commit id>

完成提交

git tag

列显已有的标签:直接运行 git tag 即可。显示的标签按字母顺序排列,所以标签的先后并不表示重要程度的轻重。我们可以用特定的搜索模式列出符合条件的标签,比如只对 1.4.2 系列的版本感兴趣,可以运行下面的命令: git tag -l 'v1.4.2.*'

新建标签

Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。

lightweight :轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。

annotated:含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。

一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。

含附注的标签

创建一个含附注类型的标签非常简单,用 -a (译注:取 annotated 的首字母)指定标签名字即可:

$ git tag -a v1.4 -m 'my version 1.4'

而 -m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明。(git 提交注释都是-m ‘XXxx’)

可以使用 git show 命令查看相应标签的版本信息,并连同显示打标签时的提交对象。

$ git show v1.4

我们可以看到在提交对象信息上面,列出了此标签的提交者和提交时间,以及相应的标签说明。

后期加注标签

你甚至可以在后期对早先的某次提交加注标签。比如在下面展示的提交历史中:

$ git log --pretty=oneline

我们忘了在提交 “updated rakefile” 后为此项目打上版本号 v1.2,没关系,现在也能做。只要在打标签的时候跟上对应提交对象的校验和(或前几位字符)即可:

$ git tag -a v1.2 9fceb02

拉取tag分支

先 git clone 整个仓库,然后 git checkout tag_name 就可以取得 tag 对应的代码了。

但是这时候 git 可能会提示你当前处于一个“detached HEAD” 状态,因为 tag 相当于是一个快照,是不能更改它的代码的,如果要在 tag 代码的基础上做修改,你需要一个分支:

git checkout -b branch_name tag_name

这样会从 tag 创建一个分支,然后就和普通的 git 操作一样了。

其实要取得不同的branch的tag,只需要在相应的分支上打tag就行了。这样的tag就唯一对应了不同的分支。例如,你在master上打了tag为v1,在某个branch上打了tag为v2,则你取出v2代码的时候,自然就是对应的branch分支了。

删除tag分支

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

$ git tag -d v0.9

Deleted tag 'v0.9' (was 6224937)

然后,从远程删除。删除命令也是push,但是格式如下:

$ git push origin :refs/tags/v0.9

git branch 和 tag的区别?

(1) git branch 上的修改可以保留,例如在某个branch上commit一个新的节点。checkout到其它branch后commit的节点不会丢。

(2) git tag上的修改 ,checkout到其它branch或者tag后,修改丢失。

Tag就像是一个里程碑一个标志一个点,branch是一个新的征程一条线;tag是静态的,branch要向前走;稳定版本备份用tag,新功能多人开发用branch(开发完成后merge到master)。

[学习笔记] [git命令] Git具体命令学习_第4张图片

 

网络很有名的一张git图:

[学习笔记] [git命令] Git具体命令学习_第5张图片

从上图可以看出,GIT命令很多,但从功能上看主要分为配置、增删、提交、标签、查看等几大类。

你可能感兴趣的:(工作常用,git)