Git学习笔记

作者: 小楠总 | 来源:发表于2017-07-11 10:42 被阅读434次

    用户配置

    配置用户名和邮箱(一般来说需要配置的就这两个)

    git config --global user.name "名字"
    git config --global user.email "邮箱"
    

    查看配置信息

    git配置有system级别 global(用户级别)和local(当前仓库)3个,设置先从system(系统级别)->global(用户级别,也就是所有仓库)->local(当前仓库),底层配置会覆盖顶层配置。不加上--属性默认就是给当前的仓库配置的。

    查看系统config
    git config --system --list
    
    查看当前用户(global)配置
    git config --global  --list
    
    查看当前仓库配置信息(需要在仓库中使用)
    git config --local  --list
    

    初始化仓库,添加文件与提交

    初始化仓库
    git init
    
    添加文件
    git add .
    git add 文件
    
    提交
    git commit -m "提交信息"
    

    忽略文件

    忽略文件的原则是:

    1. 忽略操作系统自动生成的文件,比如缩略图等;
    2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
    3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

    官方的.gitignore配置文件:

    GitHub官方的所有.gitignore文件
    https://github.com/github/gitignore
    

    编写好.gitignore配置文件之后,只需要添加到仓库即可。但是可能会添加不了,有时候可以使用强制添加:

    git add -f .gitignore
    

    查看.gitignore文件与当前仓库中的文件(不能添加新文件的时候,就需要考虑是否被git忽略了)是否有问题:

    git check-ignore
    

    版本控制

    版本的表示有两种:

    1. 直接用commit id来表示,注意手写输入的时候可以不用完全输入,7位左右就可以了,一般都是直接复制比较好。
    2. 最新的一个用HEAD,然后依次是HEAD、HEAD^、HEAD~100等

    git的几个重要的分区与指令的关系(Remote先不考虑),如下图所示:

    git分区的概念.jpg

    下面是一些常用的命令:

    查看git状态
    git status
    
    查看git提交日志
    git log
    git log --pretty=oneline
    
    查看命令日志
    git reflog
    
    查看对应提交id的内容
    git show 某一次的提交id
    
    查看修改了哪些内容(当前的副本与)(<文件>可以省略),实质上是工作区与暂存区的对比
    git diff <文件>
    
    版本回退(回滚)
    git reset --hard 某一次的提交id
    
    撤销修改
    1、没有add,实质是使用checkout把版本库的文件更新工作区的文件
    git checkout -- 文件
    2、已经add到暂存区了
    git reset HEAD 文件
    git checkout -- 文件
    3、已经提交了,需要版本回退(前提是没有push到远程)
    git reset --hard 某一次的提交id
    
    删除文件(先是文件管理器直接删除,然后通过下面的git命令从仓库中删除)
    git rm 文件
    删除错了,通过checkout还原
    git checkout -- 文件
    

    远程仓库

    下面是git分区的完整版,了解这个图有助于加深我们对git的理解:

    gity完整分区.png
    创建SSH Key
    ssh-keygen -t rsa -C "邮箱"
    
    在远程仓库(例如Github)配置SSH KEY的公钥
    直接把隐藏文件夹.ssh中的id_rsa.pub的文件内容拷贝粘贴到指定位置保存
    
    创建远程仓库
    直接通过GitHub等图形化网页界面操作
    
    关联远程库例子(origin是远程仓库的默认名字)(ssh协议比https协议快)
    git remote add origin git地址
    如果远程origin已经存在,那么需要remove一下
    git remote rm origin
    
    
    第一次推送的时候,把master分支的所有内容都push到远程仓库
    一般master与dev分支都需要时刻推送更新
    git push -u origin master
    之后的push,不用指定-u参数了
    git push origin master
    
    远程仓库-->本地(git已经自动把仓库和远程仓库关联好了,并且,远程仓库的默认名称是origin)
    git clone git地址
    
    查看远程仓库的信息
    git remote
    git remote -v(更详细)
    
    创建与远程分支
    git checkout -b dev origin/dev
    
    同时推送同一个分支有冲突的时候,需要先把最新的代码拉下来,解决冲突
    git branch --set-upstream dev origin/dev
    git pull
    
    git多人协作流程

    多人协作的工作模式通常是这样:

    1. 首先,可以试图用git push origin branch-name推送自己的修改;
    2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;如果合并有冲突,则解决冲突,并在本地提交;
    3. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
    4. 如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
    关于pull代码

    当然,在pull代码的时候,最好加上--rebase:

    git pull --rebase
    

    因为git pull --rebase因为se这个命令做了以下内容:

    1. 把你 commit 到本地仓库的内容,取出来放到暂存区(stash)(这时你的工作区是干净的,这样就不会产生冲突啦)
    2. 然后从远端拉取代码到本地,由于工作区是干净的,所以不会有冲突
    3. 从暂存区把你之前提交的内容取出来,跟拉下来的代码合并
    关于push代码

    如果你的公司使用了code review,如果直接git push的话,这样会跳过review流程,提示代码push失败。这时候就应该使用下面这样的提交方式:

    git push origin HEAD:refs/for/远程分支名字
    
    关于Change-ID与BUG号

    有时候,你push代码的时候git服务器会提示你没有Change-ID或者BUG号,那么这时候就需要根据git的提示执行一个命令,以确保新commit的时候会产生Change-ID。然后进行rebase操作:

    //对某个commitID之后的commit进行修改
    git rebase -i commitID
    
    //这时候会弹出编辑框,需要修改的提交就把前面的pick改为edit然后保存退出
    
    //开始commit的修改
    git commit --amend
    
    //同样地也会弹出修改commit message的编辑框,这时候直接修改即可。注意如果commit message前面有#,那么需要在前面添加一个空格,否则提示commit message为空
    
    //继续进行或者结束rebase操作
    git rebase --continue
    

    这时候你需要修改的提交就会添加Change-ID(如果按照git的提示执行了一个命令之后),或者修改commit messageBUG号。

    下面是相关的参考文章:

    相关的参考文章

    参与GitHub开源项目:
    1. Fork一个开源仓库。
    2. Fork之后就在自己的GitHub下面有自己的对应的仓库了,然后clone下来,修改提交。
    3. 如果确实需要提交给原作者,那就在GitHub上面申请一个pull request。

    分支管理

    查看分支
    查看本地分支
    git branch
    查看远程分支
    git branch -r
    查看本地和远程分支
    git branch -a
    
    创建分支
    git branch 分支名
    切换
    git checkout 分支名
    创建+切换分支
    git checkout -b 分支名
    
    删除分支
    git branch -d 分支名
    
    合并某分支到当前分支(一般是dev合并到master,因此需要先切换到master)
    git merge 分支名
    不使用fast forward方式的普通合并(合并后的历史有分支,能通过git log看出来曾经做过合并)
    git merge --no-ff -m "合并提交信息" 分支名
    
    查看分支合并信息
    git log 
    git log --graph
    
    解决冲突
    直接在文件中修改,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改保存,然后add和commit即可
    
    BUG分支
    1、开发一部分了,突然来了BUG了,先用git stash把现场保存起来
    2、创建一个新的BUG分支(这时候之前开发的代码是没有的,因此可以正常编译),解决BUG以后提交然后合并到master分支
    3、通过git stash apply <stash ID>或者git stash pop <stash ID>还原
    
    新功能分支
    开发新功能的时候最好新建一个分支,如果新功能不需要了,可以把那个分支删除掉,因为这个分支没有合并过,所以需要强制删除
    git branch -D 分支名
    

    标签管理

    打一个标签(commit可省略,默认是HEAD)
    git tag <commit id>
    
    删除一个标签
    git tag -d <tag name>
    
    显示所有标签
    git tag
    
    显示标签的信息(相当于显示commit的信息)
    git show 标签名
    
    给标签指定信息
    git tag -a <tag name> -m "标签信息"
    
    用PGP签名标签(需要安装pgp)
    git tag -s <tag name> -m "签名信息" 私钥
    
    推送标签到远程
    git push origin <tag name>
    git push origin --tags
    
    删除远程标签(注意先删除本地的标签)
    git tag -d <tag name>
    git push origin :refs/tags/<tag name>
    

    自定义Git

    彩色的输出
    git config --global color.ui true
    
    配置别名
    git config --global alias.co checkout
    git config --global alias.ci commit
    git config --global alias.br branch
    git config --global alias.unstage 'reset HEAD'
    git config --global alias.last 'log -1'
    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"
    

    删除某个配置的时候,直接到用户的主目录下面的隐藏文件.gitconfig,在alias下面删除对应配置。

    搭建Git服务器

    参考文章

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360579bc4b458f044ce7afed3df579123eca000
    

    如果觉得我的文字对你有所帮助的话,欢迎关注我的公众号:

    公众号:Android开发进阶

    我的群欢迎大家进来探讨各种技术与非技术的话题,有兴趣的朋友们加我私人微信huannan88,我拉你进群交(♂)流(♀)

    相关文章

      网友评论

        本文标题:Git学习笔记

        本文链接:https://www.haomeiwen.com/subject/jozuhxtx.html