git和svn对比
- 最核心的区别就是Git是分布式的, SVN是集中式的。SVN必须有一个服务器版本库就放在一个中央服务器。所有开发人员都是与服务器进行交互的。一般的开发流程就是干活时候从中央服务器得到最新的版本,然后干活,干完后需药把自己做的工作推送到中央服务器。
- Git不需要有中心服务器,我们每台电脑拥有的东西都是一样的。我们使用Git并且有个中心服务器,仅仅是为了方便交换大家的修改,但是这个服务器的地位和我们每个人的PC是一样的。我们可以把它当做一个开发者的pc就可以就是为了大家代码容易交流不关机用的。没有它大家一样可以工作,只不过“交换”修改不方便而已。所以git的开发流程是工作的时候不需要联网了,因为版本库就在你的电脑上。比如你在自己的电脑上修改了文件A,你同事也在她的电脑上修改了文件A,这时,你们之间只需要把自己的修改推送给对方。就可以看到了对方的修改了。
git的一些配置
git官网:https://git-scm.com/downloads
配置个人用户名和email:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
注意:git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址
本地仓库:
- 新建文件夹
- 在文件夹中cmd 使用 git init 初始化构建一个仓库(版本库),然后会生成.git目录。
- 提交文件到仓库(版本库):
- git add 文件名 告诉git,把文件添加到仓库,可以添加多个文件,使用空格分离,例:
- git add a.txt b.txt c.txt或者git add .(添加当前文件夹下的所有文件)
- git commit -m "xxxx"(可选) 告诉git,把文件提交到本地仓库。
- git status 查看当前仓库的状态
- git diff 文件名 查看文件被修改的具体内容
版本回退:
- git log 查看所有提交版本的信息 参数 --pretty=oneline 只显示每一个版本的第一行(commit id)
- git reset --hard HEAD^ 回退一个版本,HEAD后面有几个^,就是回退几个版本。
- 同2一样,可以使用 git reset --hard (commit id)可以回到指定版本。
- git reflog 可以查看记录的每一次命令。(如 回退一个版本后,最新的那个是看不到的,但是可以通过此命令看到最新的那个的记录 从而找到commit id)
- git checkout -- 文件名 丢弃工作区的修改
- 一种是文件自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是文件已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
- 总之,就是让这个文件回到最近一次git commit或git add时的状态。
- git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
- 6.git reset HEAD 文件名 可以把暂存区的修改撤销,重新放回工作区(一般情况和5 联合使用)
- 7.git rm 文件名 删除版本库中的文件。然后Git commit -m “信息” 就更新版本库了。
远程仓库:
一,先创建SSH Key:
- ssh-keygen -t rsa -C "youremail@example.com"
- 登陆GitHub,打开“Account settings”,“SSH Keys”页面:
- 然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点“Add Key”,你就应该看到已经添加的Key
二,本地仓库关联远程仓库:
- 创建远程仓库,在github.com上创建new repository , 名字为:例:learngit
- git remote add origin git@github.com:自己的github账户名/learngit.git
- 添加后,远程的仓库名默认变为origin,可修改。
- 第一次从本地仓库push到远程仓库 用:git push -u origin master,-u 参数是将本地仓库和远程仓库关联起来,第一次之后push内容得到远程仓库 ,都不用加-u 参数。
三、从远程仓库克隆:
- 在github上新建一个仓库,够远Initialize this repository with a README,选项
- 使用命令 git clone 地址 , 克隆一个本地库
分支管理:
一、创建与合并分支:
- 创建分支:git checkout -b dev ,创建一个dev分支,并切换到dev分支,-b参数表示创建并切换,相当于 git branch dev (创建) , git checkout dev(切换) 两个命令。git branch 查看本地当前分支,git branch -a 查看所有远程分支
- git branch -a命令会列出当前所有的分支,前面带*号的是当前所在分支。
- 合并分支:git merge 分支名 ,将分支名合并到当前所在分支,比如当前分支为A,需要合并B分支,执行git merge B
- 删除分支:git branch -d dev ,删除dev分支
二、解决冲突:
- 在使用git merge 新分支名 发生冲突时,使用git status 可以查看冲突文件
- 手动修改冲突文件,然后再git add 冲突文件名,git commit -m “备注”
- 使用git log --graph --pretty=oneline --abbrev-commit 查看分支合并图
- 最后删除无用的分支。
注:git log --graph 命令可以看到分支合并图。
三、常用分支管理策略:
- 通常合并时,git会用fast forward 模式,这种模式删除分支后,会丢掉分支信息。
- 建议在合并时使用 --no-ff 参数,将不是fast forward模式,删除分支后,不会丢掉分支信息。
- git stash ,可以把当前工作储存起来,等恢复后再继续工作。
- git stash list,查看stash后的工作现场
- git stash apply ,恢复stash后的工作现场,但是并没有删除工作现场,使用 git stash drop 删除工作现场。
- git stash pop,恢复stash工作区内容后,同时删除工作区内容。
- git remote, 查看远程库的信息 ,git remote -v ,显示更详细的信息。
-
git checkout -b branch-name origin/branch-name ,在远程和本地创建对应的分支
- git branch --set-upstream branch-name origin/branch-name,建立本地分支和远程分支的关联。
- git pull ,从远程抓取分支的最新提交,常用在解决冲突的场景。
- git branch feature-v1.8.9.25.1(本地分支) origin/feature-v1.8.9.25.1(远程分支),从本地建立分支并关联远程分支
标签管理:
- git tag 标签名,在当前分支上打一个标签,git tag,查看所有标签
- git tag 标签名 历史commit id,给历史提交打上标签。
- git show 标签名,查看标签信息。
- git tag -a 标签名 “说明文字” 历史commit id,创建标签时,为标签指定说明文字。
- git tag -d 标签名, 删除标签。
- git push origin 标签名,推送标签到远程库。
- git push origin --tags,一次性推送所有本地标签到远程。
- 从远程删除标签:首先使用git tag -d 标签名 删除本地,然后使用git push origin :refs/tags/标签名 删除远程库标签。