Git & Github使用总结
本文总结了Git 和 Github各种常用操作,便于速查。
Git签名设置
配置git签名,注意--global代表系统用户(配置文件存放~/.gitconfig) ,如果没有的的话,代表的是某一个项目的用户签名(这个时候配置文件的位置是.git/config文件)
git config --global user.name "your name"
git config --global user.email "your email"
设置VS code 为默认编辑器
git config --global core.editor "code --wait"
ssh关联github
在git中设置ssh key和将git和github进行关联
ssh-keygen -t rsa -C "your email"
进入github,点击设置,进入ssh,然后点击add ssh
命名一个title,然后将 ~/.ssh/id_rsa.pub里面的内容复制进去然后就完成了关联。
如果忘记密码,则输入这个口令即可
git config --system --unset credential.helper
基础操作
修改提交
git init //初始化一个仓库
git clone git@github.com:taaccoo-beta/helloGitHub //克隆仓库到本地
git status //查看状态
git add file //将更改后的file加入到中间库中也就是stagging area中
git rm --cached file_name //从stagging area取回
git commit -m "preview" //提交到最终库
git commit //设置了vscode会使用vscode编辑器编辑
git commit --amend //修改最后一次提交的注释信息
add+commit 一起进行
git commit -a -m "xx"
显示日志
git log
git log --pretty=oneline //每一个日志段落变成一行显示
git log --oneline //签名哈希索引值进一步缩写
git reflog // 额外显示当前head到每一个版本需要移动的步数
只显示某个文件的提交日志:
额外显示文件的改动:
版本进退
git reset --hard 0f53962 //最后 索引值(缩写),这个命令可进可退
git reset --hard HEAD^^ // 几个^表示后退几步,只能后退
git reset --hard HEAD~3 // 表示后退三步,只能后退
除了--hard参数以外还有 --soft 和--mixed参数
--soft 移动本地库的指针,暂存区和工作区不变,这样本质上就等价于修改了信息,但是还未commit,所以就等价于回退了commit的信息,再次commit等价于将几个版本的内容一起commit了
--mixed 移动本地库和暂存区,工作区不变,这样等价于回退了commit和add,相当于撤销了commit 和 add 操作
git revert commit_id // 撤销上次commit并且把撤销这一动作作为一个新的commit
git revert commit_id_n commit_id_n+x //撤销 n到n+x之间的commit
git revert -n commit_id // 撤销上次commit,但是不会提交commit,需要手工进行commit
撤销commit等价于版本回退,只不过回退也作为了一次commit
文件比较
git diff //直接比较工作区和暂存区内容的区别
git diff file_name //比较某一个文件在工作区和暂存区的变化
git diff HEAD file_name //比较工作区和本地库的区别
git diff HEAD^ file_name //比较工作区和本地库上一个版本的区别
git diff id1,id2 //会显示仓库中两个版本的区别
git diff topic master //比较两个分支最近的版本的差异
分支功能
git branch //查看分支
git branch -v //查看分支(详细)
git branch sidebar //创建一个sidebar分支
git checkout sidebar //使用checkout切换分支
git checkout -b sidebar2 //创建sidebar分支并切换到这个分支上
git branch -d xx //删除xx分支
合并分支
git checkout branch_name //切换到接受分支和并的目录上
git merge branch_name //合并改分支
解决冲突
当出现冲突的时候,git会给与提示,而出现冲突的文件也会出现提示内容
修改后执行下面指令就完成了合并
git add file_name
git commit -m "xx"
标签
git tag -a v1 //会为最近的commit创建一个标签
git tag -d v1.0 //删除标签
git tag -a v1.0 id //给之前的commit贴上标签
git tag -a v1.0 -m "xx" //带注释的tag
git tag 列出所有tag
git tag -l 'v1.*' //列出所有v1.开头的tag
git show v1.0 //查看tag细节
由于tag不会自动上传到github,所以如果要push到github,需要下面指令将tag也push 上去
git push origin --tags
Github操作
基础设置
git remote -v //查看当前本地库对应的远程仓库
设置远程仓库别名,设置为origin,如果是本地新建的远程仓库需要这个操作,如果是直接clone的则不需要,会默认设置为origin
git remote add origin https://github.com/xxxx.git
推送,origin代表远程仓库的别名
git push origin master
从远程仓库拉取
git pull
pull等价于 fetch 和 merge 两个操作
git pull = git fetch + git merge
git fetch origin master
git merge origin/master (注意这里是斜杠)
rebase功能
rebase的作用是在线性的commit上进行操作,对其进行增删查改,这个功能最好只在自己的独立的项目中使用,或者自己开发的分支上使用,不要用于修改他人开发的分支
使用指令之后,会弹出编辑界面,编辑命令有以下几个:
- pick:保留该commit(缩写:p)
- reword:保留该commit,但我需要修改该commit的注释(缩写:r)
- edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
- squash:将该commit和前一个commit合并(缩写:s)
- fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
- exec:执行shell命令(缩写:x)
- drop:我要丢弃该commit(缩写:d)
功能一: 合并多个commit到一个commit,例如A-B-C-D ==> A-B'
git rebase -i [startpoint] [endpoint] //不包括startpoint
功能二: 将一个分支上的commit复制到另外一个分支上
git rebase [startpoint] [endpoint] --onto [branchName]
git rebase 90bc0045b^ 5de0da9f2 --onto master
这个时候,还需要将指针头指向复制过去的分支的末端
git checkout master
git reset --hard 0c72e64
功能三:避免冲突的时候,进行两次提交,由于push冲突的时候,需要pull,然后更改在add 和commit,通过--rebase, 就可以把更改后的commit更更改前的commit进行合并,这样避免合伙人产生误会。
git pull --rebase = git fetch + git rebase
如果遇见冲突的时候,只需要
git add
git rebase --continue 这样就可以和最近的commit合并,而不需要像通常的add + commit(这样等于多了一个commit)
协同开发时的冲突处理
假设一个人已经更改一个文件,并且push
另外一个人发现冲突时,需要进行pull,然后解决冲突,在进行push,这个时候更本地冲突解决方法是一样的。
跨团队合作
- 首先fork代码
- 编辑代码(操作等同于操作本地库)
- pull request
对于在本地新建的本地分支,如果执行git push origin my_remote_branch_name是不会将my_remote_branch_name设置为新建的本地分支在远程库origin中的upstream分支的,可以执行如下操作,为本地当前分支设置upstream:
git push --set-upstream origin my_remote_branch_name
或者
git push --set-upstream origin my_remote_branch_name