我的使用git
的一些总结,一下经常使用命令的互相搭配使用,能很是完美的处理好平常遇到的99%
的状况(不敢说100%,得留点余地)。
还有一些使用频率很是低的指令没有记录,至少普通开发者很是不经常使用,之后可能会补充。
话很少说
首先须要先下载git
这个仍是要说一下的在这里推荐一个学习
git
的网页小游戏,输入命令后显式的展现仓库变化,用来学习git
仍是不错的
连接:https://learngitbranching.js.org/node
git status
查看当前分支状态 git reflog
查看每一次的命令,都作过什么 git log
查看此分支完整的提交记录,回车继续看,q
中止 git log --oneline
查看此分支简略的提交记录,只展现提交号和提交信息 git show
查看最近一次提交的具体代码变化 git show <提交ID>
查看某次提交的具体代码变化 git diff
查看当前代码add
后,会add
哪些内容 git diff --staged
查看如今commit
提交后,会提交哪些内容 git diff HEAD
查看当前代码add
并提交后,会提交哪些内容 git log --oneline --graph
图形化展现合并历史git
git init
初始化仓库,默认为master
分支 git add -A
提交所有文件修改到缓存区 git add <具体某个文件路径+全名>
提交某些文件到缓存区 git commit -m "<注释>"
提交代码到本地仓库,并写提交注释 git commit –a -m "<新注释>"
更改上次提交的注释github
git branch
查看本地全部分支 git branch -r
查看远程全部分支 git branch -a
查看本地和远程全部分支 git merge <分支名>
合并分支 git merge --abort
合并分支出现冲突时,取消合并,一切回到合并前的状态 git branch <新分支名>
基于当前分支,新建一个分支 git checkout --orphan <新分支名>
新建一个空分支(会保留以前分支的全部文件) git branch -D <分支名>
删除本地某个分支 git push <远程库名> :<分支名>
删除远程某个分支 git branch <新分支名称> <提交ID>
从提交历史恢复某个删掉的某个分支 git branch -m <原分支名> <新分支名>
分支改名 git checkout <分支名>
切换到本地某个分支 git checkout <远程库名>/<分支名>
切换到线上某个分支 git checkout -b <新分支名>
把基于当前分支新建分支,并切换为这个分支npm
git pull <远程仓库名> <远程分支名>
拉取远程仓库的分支与本地当前分支合并 git pull <远程仓库名> <远程分支名>:<本地分支名>
拉取远程仓库的分支与本地某个分支合并 git push <远程仓库名> <本地分支名>
推送本地某个分支到远程与其对应的分支上,远程没有则会给远程库新建分支 git push <远程仓库名> <本地分支名>:<远程分支名>
推送本地分支到远程某个分支 git push <远程仓库名> :<远程分支名>
删除远程某个分支 git push -f <同上的命令>
强制提交,覆盖线上 git fetch
获取线上最新版信息记录,不合并,用法和pull相似(一个特殊的操做,好比多人开发分支,其余人提交后,本身看分支的时候,可能还知不道线上的分支已经比本身的新了,须要这个指令,来获取一下线上的最新版本,会拉取,但不会合并,存在本地仓库中)缓存
git diff <文件名>
对比最近提交,和近近次提交的区别,不加文件名,则为总体对比 git diff HEAD^ -- <文件名>
同上 git diff HEAD~<一个数字> -- <文件名>
上次提交和前第几回提交做对比 git diff <提交ID> <文件名>
上次提交和某次提交做对比 git diff <文件名>
工做区与暂存区比较 git diff HEAD <文件名>
工做区与最近提交比较 git diff <本地分支名> <文件名>
当前分支的文件与其余分支的文件进行比较安全
注意,当回滚代码时,reset
和revert
均可以使用,下面是两个指令的区别
reset
:真实硬性回滚,目标版本后面的提交记录所有丢失了
revert
:一样回滚,但实际这个回滚操做,算是一个提交,目标版本后面的提交记录也所有都有,并且会多一次提交,就是此次revert
--hard
的功能:不加他,文件修改会保留,都会处于add以前的状态;加上他,文件修改会被删除,丢失掉app
git <reset/revert> <--hard?> HEAD^
回退到上次提交 git <reset/revert> <--hard?> <提交记录>
回退到以前的某次提交 git <reset/revert> <--hard?> <某个分支>
回退到此分支的提交状态,至关于复制分支过来 git reset <文件完整路径+完整名>
把add
过的某个文件撤销到未add
的状态 git reset
把add
过的全部文件撤销到未add
的状态 git checkout <文件完整路径+完整名>
一个尚未add
的文件,撤销修改 git checkout .
尚未add
的全部文件,撤销修改ssh
git remote -v
查看对应的远程仓库地址 git clone <远程仓库地址连接>
克隆某个远程库,默认库名为origin
git clone <远程仓库地址连接> <库名>
克隆某个远程库,并自定库名 git remote remove <远程仓库名>
和远程的某个仓库解除绑定关系 git remote add <远程仓库名> <远程仓库地址连接>
和某个远程仓库创建绑定关系 git remote set-url <远程仓库名> <要改成的远程仓库地址连接>
修改绑定的远程库连接 git push --set-upstream <远程仓库名> <远程分支名>
当前分支和远程某个分支创建绑定关系学习
常常有这样的事情发生,当你正在进行项目中某一部分的工做,里面的东西处于一个比较杂乱的状态。
而你想转到其余分支上进行一些工做。
问题是,你不想提交进行了一半的工做,不然之后你没法回到这个工做点。
解决这个问题的办法就是git stash命令。
git stash save <注释信息>
当前分支提交到储藏,插到储藏序列的最前面(不包括新建文件) git stash save -u <注释信息>
同上,会包括新建文件,功能更强大 git stash list
查看全部储藏中的工做 git stash drop <储藏的名称>
删除对应的某个储藏 git stash pop
取出储藏中最后存入的工做状态进行恢复,会删除储藏 git stash pop <储藏对应的数字>
取出储藏中对应的工做状态进行恢复,会删除储藏 git stash apply
取出储藏中最后存入的工做状态进行恢复,注意,不会删除储藏 git stash apply <储藏的名称>
取出储藏中对应的工做状态进行恢复,注意,不会删除储藏 git stash branch <新分支名> <储藏的名称>
从储藏中新建分支,会删除储藏 git stash clear
清空全部储藏中的工做fetch
tag
是什么,虽然整个开发过程,每一个提交都对应一个提交ID,回滚也比较方便,但总有一些重大意义的提交,好比从v0.91升级到了v1.0,这个v1.0是必需要单独摘出来保存的,不然万一出现回滚事故,致使提交记录丢失呢?虽然能够单独新建分支保存,但分支的功能并非用来作这个的。冗余的分支在开发时也容易产生误操做。
因此
tag
的用处就来了,他能够把某次提交后的项目,整个单独复制拎出来,命名为一个tag(能够以项目版本或打tag的时间来命名),能够写注释,存在tag列表中,与分支隔离开,除非专门命令操做,不然只要项目存在,他们就不会受到影响。同时,可使用tag快速回滚项目、基于tag新建分支等,在项目总体的管理上很是方便。
git tag
列出本仓库中全部tag列表 git tag <tag名>'
基于最近的一次提交打tag(轻量tag,不推荐) git tag -a <tag名> -m '<此tag的注释>'
基于最近的一次提交打tag git tag -a <tag名> <提交ID> -m '<此tag的注释>'
基于某次提交打tag git show <tag名>
查看此tag的tag信息 git tag -d <tag名>
删除本地某个tag git push origin :refs/tags/<tag名>
删除远程仓库中的tag git push <远程仓库名> <tag名>'
推送某个tag至某个远程库 git push <远程仓库名> --tags'
推送全部tag至某个远程库 git checkout -b <新分支名> <tag名>'
基于某个tag新建分支
.gitignore
文件在使用Git的过程当中,有的文件好比日志、临时文件、编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交。
没错就是.gitignore
文件了。
此文件须要放在.git
(默认是隐藏文件,是git的本地仓库)同一目录下
写法以下:
node_modules/ dist/ *.map npm-debug.log* yarn-debug.log* yarn-error.log*
这样,当git add
的时候,上面定义忽略的那些文件,就会被git忽略,发生了变化git也不会管。
然而有时候,是会出现意外的。
好比,git已经提交过了,这是后忽然说,这里面有个文件须要被忽略,而后我把这个文件写到了.gitignore
文件中。。。无效!这个文件仍然没有被忽略!
这是就须要以下命令,来删除此文件并忽略
git rm -r --cached <文件路径+文件全名>
在git库中删除文件并中止追踪,但实际文件还保留,只是忽略掉。
由此,方可。
SSH
公钥绑定一个远程仓库,有两种方式:
若是远程仓库为公开仓库,则二者在使用上,区别不大;
但若是是私密仓库,则http方式,须要输入用户名和密码登陆后,才可创建联系,但这样一来,须要把私密仓库的帐号和密码暴露,即便添加了项目团队成员,若是成员的帐号密码暴露,任何人在任何设备上,登陆帐号密码,至少都能对项目进行拉取操做,因此就有了下面更合适的方式---ssh
。
ssh
的话,则只须要本地设备,输入一条git
指令,生成一对公钥和私钥,而后把公钥的内容,复制添加到远程库的设置中,让远程库认识此设备,就想当于用户填写了帐号和密码,好处是,这种方法在远程库的添加上,只认设备不认帐户,这样只用保证设备是安全的,仓库就是安全的。
下面为本地设备生成ssh
输入ssh-keygen
来生成ssh
window默认存放在C盘/用户/<用户名称>/.ssh
文件夹中
Mac默认存放在硬盘/用户/<用户名称>/.ssh
文件夹中
其中两个文件,id_rsa.pub
为公钥,须要打开复制其中的内容,粘贴到须要的git远程仓库网站的帐户设置中(另外一个为私钥,切记保管好)
注:一个ssh钥匙对,在一个git远程仓库网站中,只能被一个用户添加。
若是有另外一个用户,也想把仓库共享给这台设备,再次写入公钥,则会失败。
好比如今需求,就须要一台设备,能拉取到github中多个帐户的仓库,该如何设置?
再次输入ssh-keygen
生成秘钥对,可是不能一直回车,须要在给秘钥对命名时,输入一个新名字,不然会替换原有的。
或者也能够直接输入ssh-keygen -f id_new
生成完毕后,进入对应存放ssh钥匙对的.ssh文件夹中,会发现又多了一对秘钥,名字分别为id_new
和id_new.pub
。
此时,能够把新的id_new.pub
的内容复制到github中另外一个帐户的setting中,可是,本地设备须要设置一下。
进入到本地的设备的存放ssh钥匙对的.ssh文件夹中,新建名为config
的文件,输入如下内容进行保存:
Host github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa Host new.github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_new
咱们知道,在github中使用ssh连接时,连接的格式为:git@github.com:<用户名称>/<项目名称>.git
此时,有github中的用户A和用户B,都有ssh连接给到这台设备,分别是: git@github.com:user-A/item-A.git
git@github.com:user-B/item-B.git
则此设备在绑定远程仓库的时候,须要在连接上作手脚。
第一条不用动,第二个须要参照配置文件的Host
进行修改,两条连接分别改成: git@github.com:user-A/item-A.git
(没有变化) git@new.github.com:user-B/item-B.git
此时,设备能够成功绑定这两个帐户的仓库。
依次类推,设备绑定多个帐户,再也不是问题,关键就是配置config
文件,可以对应起来便可。
git config user.name
查看设置的用户名 git config user.email
查看设置的用户邮箱 git config --global user.name <用户名>
设置用户名 git config --global user.email <邮箱>
设置用户邮箱
修改用户登陆信息
控制面板 -> 用户帐户 -> 管理 Windows 凭据
,便可看到普通凭据中有git的帐户信息,可编辑更改
钥匙串访问.app -> 右上角搜索git
,便可看到,可编辑更改