常用的 git 命令总结


三大区域: 工作区 → 缓存区 → 本地仓库



一 、

    使用 git config 命令进行配置:

    git config --global user.name "<用户名字>"

    git config --global user.email "<用户邮箱>"

    配置完成后,家目录下会生成 .gitconfig 文件。

    ssh-keygen -t rsa:本地生成 SSH 密钥对,用户家目录下生成 .ssh 目录,复制此目录里公钥的内容到 github 的相关处,设置 SSH 直连


二 、

    git 要求对本地仓库关联的每个远程主机都必须指定一个主机名,用于本地仓库识别自己关联的主机,git remote 命令就用于管理主机,一个本地仓库可以关联多个主机

    git clone <URL>:克隆一个远端仓库到当前目录,执行此命令后,当前这个克隆来的新仓库就关联到了远端,也就是主机,默认新建的本地仓库名和远端仓库名一致,默认主机名为 origin,默认分支为 master。同时,这个远端仓库的所有分支也一并被克隆到了本地仓库,但这些分支不会出现在 git branch 的列表中,因为它们是隐式分支,不同于上游分支,上游分支是指本地分支跟踪的远端分支,执行 git branch -r 可以看到这些隐式分支

    关于上个命令的补充:如果此时执行 git checkout dev 切换到分支 dev(这个分支 dev 需要在远端有同名分支,所以才能不用新建直接切换),那么本地的分支列表里就有了 dev 分支,同时这个本地分支 dev 已经关联到了远端同名分支,这个远端同名分支又叫前者的上游分支,而且此时本地分支和隐式分支的代码版本一样。这时回到主分支,执行 git merge dev 和 git merge origin/dev ,虽然结果相同,但是本质上不同:前者是合并本地分支 dev,后者则是合并远端传进来的隐式分支 origin/dev 。如果在 dev 分支上提交但不推送,origin/dev 的版本无变化;如果在 dev 分支上推送提交到远端,那么 origin/dev 这个隐式分支的代码版本会自动更新

    git clone -o <haha> <URL> :结果同上个命令,只是把预设的主机名改成了 haha

    git clone <URL> <hello> :克隆一个远端仓库到当前目录,并把这个克隆得到的本地仓库更名为 hello

    git init:将当前所在目录变成本地仓库

    git remote add <主机名> <URL>:把当前本地仓库关联(跟踪)到 github 远程仓库,注意主机名不可同名。此命令不会把该主机的远程分支信息都添加到本地仓库成为隐式分支,因为这个命令没有在本地生成与之关联的显式分支,这一点与 git clone 不同

    git remote rename <one> <two> :修改主机名 one 为 two

    git remote -v:查看本地仓库关联的主机信息(主机名和网址)

    git remote set-url <origin> <URL>:修改当前仓库关联(跟踪)的远端仓库网址,origin 为主机名

    git remote rm <origin>:删除本地仓库与远端的关联,即删除与主机 origin 的关联

    git remote remove <origin> :同上


三 、

    git status:查看当前分支的全部区域状态

    git add <file>:添加工作区的文件修改到暂存区

    git add <A/*>:添加工作区 A 目录下的全部修改到暂存区

    git add .:添加全部修改到暂存区

    git ls-files :查看已经被跟踪的文件列表

    git diff:查看未添加到缓存区的修改(不包含未被跟踪的文件,即新建的且未使用过 git add 添加到缓存区的新建文件)

    git diff --cached:查看已添加到缓存区的修改

    git diff <版本号1> <版本号2> :查看相对于版本 1 来说,版本 2 的不同(通常版本 1 要早于 版本 2)

    git diff <dev2> :和分支 dev2 比,当前分支有什么不同,比的是全部三大区域

    git diff <dev2> <file1> :和分支 dev2 比,当前分支有什么不同,只比较文件 file1

    git checkout -- <file>:撤销此文件未添加到缓存区的修改(对未被跟踪的文件无效)

    git checkout .:撤销全部未添加到缓存区的修改(对未被跟踪的文件无效)

    git rm --cached <file>:撤销已添加到缓存区的修改

    git reset -- <file>:撤销已添加到缓存区的修改

    git reset --:撤销缓存区的全部内容

    git commit -m '<备注>':提交缓存区的修改到本地代码库

    git commit -a -m '<备注>':将没有加到缓存区的修改一并提交,但 -a 选项不会添加未被跟踪的文件

    关于忽略文件的配置文件:在本地仓库的根目录下创建文件 .gitignore ,并将此文件提交,即生效。但是已经提交的文件中如果有符合忽略规则的,就管不了了,人家已经上船了


四 、

    git log <dev>:查看分支 dev 的提交历史记录,即使用 git commit 命令的记录(默认是时间倒序,最近的提交排在最上面),不写分支名查看当前分支的提交历史记录

    git log --reverse:时间正序显示提交历史记录

    git log --oneline:一行显示提交历史记录

    git log --graph :图示法显示提交历史

    git log --reverse --oneline --graph :时间正序 + 一行显示 + 图示法显示

    git log -n :显示最近的 n 个提交

*    git log -p :不知道啥玩意

    git log --author <作者> :查看指定作者的提交记录

    git reset --hard HEAD^ / HEAD~1:退回上一个版本(HEAD 就是指向 master 的指针)

    git reset --hard HEAD^^ / HEAD~2:退回上两个版本

    git reset --hard <版本号>:进入到此版本

  git reset --soft <版本号> :软退回,待补充

    git reflog:查看本地版本变化记录,包括提交、退回和切换分支。这个记录是本地记录,它是不会被传到远端的,删除本地仓库后,就没了

    git reset --hard HEAD@{n}:退回到最近 n 次本地版本变化前


五 、

    git branch:查看本地分支列表

    git branch -vv :查看本地分支列表详情(包括分支名、关联信息和最新提交信息),这里可以写俩 v ,可以写八个 v ,都没事儿

    git branch -r:查看远端分支列表(此命令不联网),所谓远端分支,就是本地隐式分支

    git branch -a :查看本地和远端(也就是本地隐式分支)所有分支 (此命令不联网)

    git branch -a -vv:综上所述(可简写为 git branch -avv)

    git branch -d / -D <dev> :删除本地分支 dev ,可以一次删除多个,此命令不能在 dev 分支下进行

    git branch -rd <origin>/<dev> :删除本地隐式分支 origin/dev

    git branch -m <dev1> <dev2> :将本地分支 dev1 重命名为 dev2

    git push origin :<dev> :删除主机为 origin 的远程分支 dev

    关于查看分支的命令的补充 :以上所有 branch 命令都是针对本地仓库关联的主机,实际上显示的都是本地分支,只是有显式、隐式之分而已。既然这些命令都不联网,如何获得远端分支(也就是本地隐式分支)的信息呢?真相就是执行 git clone 时,会传进来该主机全部的远端分支信息,这些远端分支被称为本地隐式分支,执行 git fetch 命令可以刷新这些信息,执行 git push 时也会刷新当前分支关联的隐式分支信息,执行 git pull 时,除了刷新当前主机的全部远端分支信息外,还拉取了当前分支的远端分支提交,如果当前分支版本不低于它所关联的远端分支,那么执行 git pull 与执行 git fetch 作用一样。所有关联到远端的本地分支的都有对应的隐式分支在本地。注意:这些命令刷新本地隐式分支信息,只对当前分支所属的主机有效

    git fetch :把当前分支所属主机的所有远端分支的最新提交版本传到本地仓库(此命令需联网),相当于刷新了全部的本地隐式分支。注意,这些传到本地仓库的隐式分支用 git branch -r 命令才能看到,因为它们就是远程分支的复制版啊。重要的一点:如果远端分支被删除,执行此命令后,本地的同名隐式分支是不会被删除的。如何把这些最新的隐式分支版本合并到本地分支呢?参见下一个命令

    git merge <origin>/<haha> :把本地隐式分支合并到当前所在分支(因为此操作不联网,所以需先执行 git fetch 刷新一下),如果要合并同名隐式分支的话,直接执行 git merge 即可

    git fetch <主机名 origin> <分支名 dev> :更新任意主机的任意一个远端分支的最新版本到本地,此命令在任何分支下执行效果都一样

    git fetch <origin> <dev>:<test> :该命令会新建一个本地分支 test ,同时将远端分支 dev (注意:这里不是本地隐式分支,此命令需联网)的版本传入此新建分支,但二者不自动关联,不自动切换分支。此命令在任何分支执行,效果相同

    补充 :所有 fetch 命令都需联网,执行后都不会自动切换分支

    git branch <dev>:创建新分支 dev,新建分支与执行此命令时所在的分支内容一致(不联网,不切换)

    git checkout <dev>:切换到分支 dev

    git checkout - :切换回上一个分支,此命令类似于 Linux 命令 cd -

    git checkout -b <dev>:创建新分支 dev 并切换到此分支,新建分支与执行此命令时所在的分支代码版本一致。

    注意:以上新建分支的命令不联网,得到的新建分支未与远端同名分支产生关联,所以不能直接 git pull 或 push 。关于如何在不关联远端分支的情况下推送以及如何关联远端分支,参见下文第六部分

    git checkout -b <haha> origin/<dev> :创建新分支 haha 并切换到此分支,同时将本地隐式分支 dev 的全部内容拉取到此新建分支,此时新建分支已经关联到远端分支 dev,其中 origin 为主机名,这步操作也不联网。由于这个新建分支和与之关联的远端分支不同名,所以无法直接使用 git push 命令推送。如果 dev 是 master,可以省略

    git merge <dev>:合并本地分支 dev 的所有提交到当前分支。合并远程分支(也就是本地隐式分支也差不多,详见上面。所有的 merge 操作都不联网。如果当前分支版本高于 dev 分支,合并无效

    git merge --squash <dev> :合并本地分支 dev 到当前分支,只合并文件修改,不合并提交,log 是没变化的。执行此操作后这些修改就已经在当前分支的暂存区,等待提交。当然合并隐式分支也是一样的

    git rebase <dev> :也是把 dev 分支合并到本地分支(dev 可以是本地显式分支,也可以是本地隐式分支)。几点补充:1、如果合并的分支起了冲突,修改冲突文件并添加到缓存区,然后执行 git rebase --continue,若是不想合并了,执行 git rebase --abort 即退回到合并前的状态;2、因为 rebase 是基于的意思,也就是基于 dev 分支进行的合并,合并成功后,两条分支的所有提交保留,并且不产生新的提交,dev 的提交记录在前,当前分支的提交记录在后;3、如果当前本地分支版本高于 dev,那么合并无效。它和 git merge 的区别参见 此链接 ,里面的图中,箭头画反了

    git pull --rebase origin <dev> :把远端分支 origin/dev 合并到当前本地分支,注意是远端分支不是本地隐式分支,因为该命令有了 pull ,所以联网。其它说明参见上个命令。很多人说它相当于执行了 git fetch 后又执行了 git rebase,其实不对,这就是与上一个命令第 3 点补充不同的地方,如果没有产生冲突,分两种情况:1、若本地分支的高版本曾推送到远端,此命令可以将远程分支的低版本覆盖当前分支的高版本;2、若本地分支的高版本未曾推送至远端,则此命令无效

    所有本地分支之间有一种特殊的关系:如果你对一个分支进行了修改(不执行 commit), 可能的话,那么所有的分支立刻都有了相同的修改,不管各分支现在处于哪个版本、关联到远端与否,切换分支后就能看到。但是尽量少利用这个特性。切换分支要谨慎。(其实本质上只是 HEAD 指针的移动而已,移来移去,一不小心就可能把这些未提交的修改给弄掉地上摔碎了,因为没有提交,所以就再找不回来了)


六 、

    git push <origin> <dev>:推送分支 dev 的所有内容到主机为 origin 的远端仓库的同名分支,若远端仓库没有 dev 分支,那么会自动创建,但不自动关联。这个命令在任何分支上执行结果一样。主机名随意,随意的原因是未关联任何远端的分支属于本地仓库的孤立分支

    git push <origin> <dev>:<haha> :推送 dev 分支的所有内容到主机为 origin 的远端仓库的 haha 分支,其它内容同上

    关于上面两个命令的补充:对未关联到远端的分支才会用这些命令,已关联的直接在那个分支上 push 了。此命令不能使原本未关联到远端的当前分支关联到远端同名分支,尽管它能推送提交,但是,如果之前关联过,后来失联了,这个命令可以复联。执行 git branch -u 命令可以使当前分支关联到远端分支。注意:只有关联到远端同名分支的本地分支才可以使用 git push 推送

    git branch -u <origin>/<dev1> <dev2> :将本地分支 dev2 关联到主机名为 origin 的远端分支 dev1 (此命令可以在任何分支下进行)

    git branch --unset-upstream <dev> :解除本地分支 dev 与远端的关联。如果当前分支为 dev,分支名参数可省略

    git push --set-upstream <origin> <dev> :推送分支 dev 到主机名为 origin 的远端同名分支,远端若无此分支,自动新建。此命令中主机名 origin 随意,随意的原因是未关联任何远端的分支属于本地仓库的孤立分支

    git push --set-upstream <origin> <dev>:<haha> :推送分支 dev 到主机名为 origin 的远端分支 haha ,其它内容同上个命令

    补充 :上面两个命令中的 --set-upstream 都可以用 -u 代替

    git push <origin> :<dev> :删除主机名为 origin 的远端仓库分支 dev (它可以在任何分支下进行且结果都一样)

    git push <origin> :<dev1> :<dev2> :<dev3> :一次性删多个

    git push <origin> --delete <dev>:同上

    git push :与远端同名分支建立关联后,用此命令推送提交到远端,如果本地版本低于远端分支,这个就不好使了,只能强推

    git push -f :强行推送(即利用强行覆盖的方式将你的本地仓库代码推送至远端仓库)

    git push --all :将所有本地分支最新提交推送到远端同名分支,没有的自动创建。某些情况下,比如本地分支 a 原来已经关联到远端分支 b,之后这个远端分支 b 又被删了,此时执行此命令会自动生成远端 a 分支,但远端 a 分支没有和本地 a 分支关联过,所以二者不能自动关联。如果执行此命令前本地分支 a 就关联了远端同名分支 a ,后来远端分支 a 被删了,这种情况下执行此命令,会新建远端分支 a ,顺便自动关联到本地分支 a

    git push -u --all :将所有本地分支最新提交推送到远端同名分支并关联,没有的自动创建

    git pull :此操作刷新了该分支所属主机的所有本地隐式分支,类似 git fetch 。同时如果当前本地分支版本低于它所关联的远端同名分支,则该分支也自动更新版本,如果不低于,不更新,如果不关联,那肯定也不更新

    注意:这个 git pull 和 git fetch 只是把远端仓库的分支信息覆盖到了本地隐式分支,如果远端分支被删除,执行这俩命令后,本地同名隐式分支是不受影响的,它不会被删除。那么这种情况下,如何删除这个本地隐式分支呢?参见下个命令

    git remote prune <origin> :删除无效的本地隐式分支,无效的意思就是远程同名分支已经没有了,它还在这儿呆着呢。此命令联网。关于 remote 的其它命令,参见第二部分

    git fetch -p :刷新本地隐式分支同时删除无效的隐式分支,相当于执行了 git fetch 和 git remote prune 两个命令

    git pull <origin> <dev> :从主机为 origin 的远端分支 dev 获取最新版本到本地仓库当前分支,与命令 git merge origin/dev 效果不同,后者合并的是本地隐式分支


七 、

    git config --global alias.<st> '<status>':设置简洁命令

    git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative:一个比较清晰的 log 一行显示

    git config --global color.ui true:开启 git 输入着色

    git config --global core.quotepath false:设置显示中文文件名

    git config -l:查看 git 配置



--- END ---

推荐阅读更多精彩内容