我目前用的代码管理工具是SourceTree,而且还是中文版,工具的好处就是简单直观,各有各的好处. 朋友的笔记存放在这,以便以后学习!!
git常用的一些命令:
配置全局git的邮箱和用户名:
git config --global user.email “****@163.com"
git config --global user.name “***"
配置局部邮箱和用户名:
git config “user.name” [用户名]
git config “user.email” [用户邮箱]
创建一个仓库:git init
新创建文件提交到暂缓区:git add .(把当前文件夹下所有文件都提交到stage中去)
暂缓区中文件的变化提交到master中:git commit -m “版本控制信息"
查看提交记录:git log(git log模式下,按`q`可退出git log模式)
查看当前提交状态:git status, 如果文件都是绿色的则代表可以使用commit命令提交了.
查看当前git版本:git--version
查看指令使用记录:git reflog
从远程仓库克隆代码(将远程库clone到本地):git clone git@github.com:michaelliao/gitskills.git
关联远程仓库(本地git库和远程库关联):git remote add origin git@server-name:path/repo-name.git
第一次推送分支内容:git push -u origin master
此后推送分支内容:git push origin master
其它命令:
查看一个文件全部内容: cat [filename]
创建一个文件: cat > [filename]
svn属于集中式的版本控制软件, 就是说所有的项目版本信息全部保存在服务器端.
git属于分布式的版本控制软件, 版本信息既可以保存在远程服务端, 也可以保存在客户端, 如果说服务端挂了, 那么通过本地的版本信息同样可以恢复历史版本.
多数情况下git的速度会比svn快;
svn创建分支比较笨拙, git可以方便的建立无限个分支;
使用git管理版本时候, 一般项目下会有一个.git隐藏文件夹, git的工作分为版本库(.git文件夹)和工作区(其它目录).
如下图所示, 表示git工作流程, 在git版本库中, 有一个称谓stage的暂缓区, master相当于最终的管理仓库.
git commit命令作用是把stage中的变化更新到master中去, 如果是新建的stage中没有的文件, 需要添加到stage中(git add . 把当前目录所有文件都添加到stage中去)
git工作流程
1.从服务器端获取代码(clone), 我们习惯称之为克隆;
2.修改代码后提交到本地;
3.当有需要的时候提交代码到服务器;
git基本操作命令
创建一个仓库: git init
初始化项目, 在项目中添加几个文件;
新创建的文件需要添加到暂缓区中:git add .(use "git add ..." to include in what will be committed)
提交项目到版本控制:git commit -m “版本说明信息"
如果修改了文件, 那么也是不能直接提交的, 也需要通过`git add .`命令将变化更新到暂存区stage中, 然后才能通过git commit命令提交变化到master中去.
版本回退
回退到上一个版本:git reset --hard HEAD^
回退到前两个版本:git reset --hard HEAD^^
回退到前N个版本:git reset --hard HEAD~N //N是一个数字
回退到指定版本:git reset --hard [版本号] //版本号可通过git reflog查看, 一般是七位的字符
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
git status命令用于查看当前状态, git diff用于查看当前变化
撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- [file]。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD [file],就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
git checkout . //撤销当前工作区所有的修改
删除文件
git rm [文件名]
执行完上述命令, 需要将变化commit到master
配置用户名和邮箱
全局和局部的用户名和邮箱
全局: 默认一个git仓库如果没有配置用户名和密码就使用全局的;
局部: 紧针对本项目才有效;
.git/config //此文件存储git本地仓库配置信息, 包含用户名和邮箱的配置
//配置本地(局部)用户名和密码和全局的用户名密码区别就是少可一个`--global`
git config “user.name” [用户名]
git config “user.email” [用户邮箱]
日志格式
个性化的日志格式可以参考:https://segmentfault.com/a/1190000000307435
远程仓库
git支持远程仓库, 可以自己搭建git服务器进行版本管理, git是一个分布式的版本控制系统, git支持ssh加密.
比如github, 我们在使用github时候, 是需要配置公钥的, 因为是加密传输嘛, 好处是, 配置之后会使用私密传输, 只有你自己才能上传, 当然, git系统支持添加多个公钥, 这样, 如果你有多台电脑, 可以同时在不同的设备上同步.
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
- $ ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
从远程仓库clone:git clone git@github.com:michaelliao/gitskills.git
要克隆一个仓库, 必须知道远程仓库的地址, 然后使用git clone命令进行克隆操作.
git支持多种协议, 包括ssh协议和https协议(https协议缺点是速度慢, 每次推送必须输入口令; ssh支持原生git协议, 速度快, 方便)
关联远程仓库:git remote add origin git@server-name:path/repo-name.git
使用如上命令可以将本地已有的仓库和远程服务器仓库进行关联. `git remote add origin`命令
第一次推送分支所有内容:git push -u origin master
第一次提交加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
此后每次本地提交后, 只要有必要, 就可以使用`git push origin master`命令, 将最新的版本推送到远程服务器.
分支管理
分支相当于是一个平行宇宙, 比如有两个人在同时做同一个项目, A做一个分支, B创建一个分支, A/B在自己的分支上提交代码, 当两个人都写差不多时候, 可以去合并分支, 将两个人的代码合在一起.
Bug分支
有这样一个场景, 你正在敲代码, 但是软件出现一个紧急bug需要修改, 需要在以前的版本上修改, 而要求必须两个小时内改好, 当前工作还要两天才能完成,才能提交, 入如果提前提交, 可能影响到别人工作, 导致程序不可用, 这时候可以使用bug分支, 临时创建一个分支, 在分支上修改bug之后, bug分支和master分支合并, 最后返回到正在开发的分支上去, 退出临时分支, 开始接着敲代码.
1.把当前未提交的工作区保存下来, 使用如下命令
git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge
2.比如需要在master分支上修复bug, 则创建一个master的分支, 在分支上修复bug, 如下命令, 切换到`master`分支上去
git checkout master
3.创建并切换到分支`issue-101`
git checkout -b issue-101
4.修改bug之后, 将更改添加到git仓库中, 并提交到仓库中
git add .
git commit-m"fix bug 101"
5.修复完成之后, 切换到master上去, 合并分支, 并删除原来的`issue-101`分支
git checkout master //切换到master
git merge--no-ff-m"merged bug fix 101"issue-101 //合并分支
git branch-d issue-101 //删除`issue-101`分支
6.最后切换到工作的分支上, 恢复刚才保存下来的未提交的内容, 继续撸,狠狠橹
git checkout dev //切换到当前开发分支上
git stash list //可以多次使用`git stash`保存为提交的工作变化, 此命令查看所有的保存的记录
git stash apply //git stash apply stash@{0} 恢复到指定的保存版本中, 恢复后`stash`内容并不删除
git stash drop //删除stash
git stash pop //恢复的同时删除stash内容
feature分支
软件开发完了, 但是产品又来添加新的功能模块, 这时候, 最好在新的分支上来做新的工作, 创建新的分支->撸代码>合并, 和bug分支的管理是类似的, 但是突然某种原因不需要这个心功能了, 并且要求全部删除, 可能会删除失败.
git branch-d // 如果分支没有合并直接删除, 不能直接删除, 必须强制删除才行.
git branch-D //强制删除分支命令
创建和合并分支
查看分支:git branch //git branch命令会列出所有分支,当前分支前面会标一个*号。
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge --no-ff (—no-ff,表示重新生成新的合并,而不是移动head指针)
删除分支:git branch -d
删除远程分支:git push origin --delete [branch]
查看远程仓库:git branch -a
正常的git使用流程: 在服务器上创建master分支, clone到本地, 在本地创建dev分支用于平时的开发, 如果开发完了某一模块则将dev分支合并到master上去, 在master分支上提交代码到服务器中.
分支管理策略:
Fast forward: 表示在merge分支时候, 如果可以通过直接移动head指针来达到最新的版本, git系统会默认使用此模式.
--no-ff: 表示禁用Fast forward, Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
git分支非常强大, 在实际开发中应该充分利用.
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
多人协议
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
用git remote -v显示更详细的远程仓库信息.
git push origin dev 推送本地分支到仓库.
并不是所有的分支都需要被推送到服务器, 一般情况下, master必须被推送, dev分支一般也会被推送, 自己开发的分支就不必须被推送了.
因此,多人协作的工作模式通常是这样:
首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
小结:
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
解决冲突
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
一种好看的方式查看git分支合并:git log--graph--pretty=oneline--abbrev-commit
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
用git log --graph命令可以看到分支合并图。
tag标签
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。
所以,tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。
创建标签
1.创建: git tag //git tag v1.0.0
2.查看所有的标签: git tag
3.给指定的某个HEAD打标签: git tag v0.9 6224937
4.查看标签信息:git show
5.指定标签信息:git tag -a -m "blablabla..."
操作标签
创建的标签只会存储在本地, 不会自动的推送到服务器, 所以打错的标签可以在本地安全的删除.
删除标签:git tag -d v0.1
推送本地标签到远程:git push origin
推送本地所有的标签到远程:git push origin --tags
如果标签已经推送到远程, 删除步骤:
方法一:
删除远程tag:git push origin --delete tag
方法二:
1.在本地删除指定标签:git tag -d v0.1
2.删除服务器上的标签:git push origin :refs/tags/v0.9