http://git-scm.com/
集中式版本控制系统与分布式版本控制系统的区别html
集中式git
版本库是集中存放在中央服务器,用户客户端只有文件的某个版本.分布式正则表达式
远程服务器保存全部版本,用户客户端也能够保存全部版本
分布式版本控制系统中每一个人的电脑上都有一个完整的版本库.须要的时候,能够不须要联网,由于版本库就在你本身的电脑上。
多人协同工做的时候,一个用户在本身电脑上改了文件A,另外一我的在他的电脑上改了文件B,工做结束只需把各自的修改推送给对方,就能够互相看到对方的修改了。shell
git config --global user.name 'your_name' git config --global user.email 'your_email'
git config的三个做用域vim
缺省等同于local缓存
git config --local # 只对某个git仓库有效 git config --global # global对当前用户全部仓库有效 git config --system # system对系统全部登陆的用户有效
显示config的配置,加--list服务器
git config --list --local git config --list --global git config --list --system
1.把已有的项目代码归入git管理网络
cd 项目代码全部文件夹 git init
2.新建的项目直接用git管理app
cd 某个文件夹 git init your_project # 会有当前路径下建立和项目名称同名的文件夹 cd your_project
git add files # 添加文件 git add . # 把工做区全部文件移动在暂存区 git commit # 提交信息,加上 -a 选项能够把暂存区里的全部文件都进行提交
git mv old_file_name new_file_name git rm file_name
查看版本演变历史的命令编辑器
git log 可添加的选项: --oneline # 以每一行的方式查看当前分支的全部提交日志 --pretty=online # 用commit id(版本号)显示修改记录,减小log文件的输出,使每条记录只输出一行 -n4 # 以每一行的方式查看当前分支最近的4条提交日志 --all # 查看全部分支的提交日志 --graph # 以图形化方式查看提交日志
能够经过
gitk
图形界面工具来查看版本历史
git status 查看当前git仓库的状态 git diff * 检查上一次对文件所作的修改内容 git log 查看版本库的修改历史记录 git reflog 用来记录每一次命令(查询某次修改的版本号)
****工做区:****
工做区(word directory)就是在电脑上能看到的目录 当前开发程序所在的目录为工做区,该区域的文件会有状态变化且状态由git自动检测 目录中的文件的任何变化(增,删,改),git都会检测到,可使用git status命令查看
****版本库:****
版本库(repository)工做区有一个隐藏目录.git,保存的就是git的版本库 工做区检测到有文件发生变化,那么意味着文件状态被改变,这时就能够当作一个版本进行提交
工做区的代码经过git add
来加入到暂存区,使用git commit
命令把暂存区的文件加入到当前分支的(通常为git自动建立master的分区)
git的版本库中一个区域,称之为stage(或者叫index)的暂存区. 在工做区的文件被修改,使用`git status`查看状态时,显示文件的颜色为红色 使用`git add`把文件从工做区移到暂存区,再使用`git status`查看状态时,显示文件的颜色为绿色
git checkout --filename 撤销工做区的修改,把工做区的文件恢复到暂存区的状态 若是文件修改后还未放到暂存区,撤消修改就回到未修改以前的状态 若是文件修改后已添加到暂存区,撤消修改就回到添加进暂存区时的状态 git reset HEAD filename 把暂存区的修改撤消掉,从新放回到工做区,这条命令是在把修改后的文件提交到暂存区以后又后悔了,使文件恢复到版本库的状态 git reset HEAD 取消暂存区全部文件 git reset HEAD -- index.html 把暂存区中的index.html恢复成跟工做区同样,能够添加多个文件 git checkout -- index.html 把工做区恢复成和暂存区同样 git stash 储存当前工做现场 git stash list 查看stash区域的全部信息 git stash apply 取出stash区域中的文件放到当前工做区,可是文件还保存在stash区域中,能够反复使用 git stash drop 删除最近一次储存的stash git stash pop 取出stash区域中的文件放到当前工做区中,文件不会继续保存到stash区域中 git stash stash@{num} 恢复指定stash
注意
若文件已经被推送到远程,则没法撤消
须要注意的是,git是对文件更改的管理,不是基于文件的管理
git branch # 查看当前分支而且看到在哪一个分支下工做 git branch -v # 查看本地git分支 git branch -av # 查看全部分支及其详细信息,若是添加远程仓库,会显示远程仓库上的分支 git branch dev # 建立一个dev分支 git checkout -b dev # 建立dev分支并切换到dev分支上工做 git checkout -b temp 5ccb4b3 # 基于5ccb4b3这个版本建立一个temp的分支 git checkout -b branch2 branch1 # 基于branch1分支建立并切换到branch2分支 git checkout dev # 切换到dev分支 git checkout master # 切换回master分支 git branch -d dev # 删除dev分支,删除分支时,分支相关的信息也会被删除 git branch -D branch_name # 删除指定分支,删除分支时,分支相关的信息也会被删除 git checkout --* # 把文件返回到修改以前的状态 git merge dev # 把dev分支合并到当前分支 git merge --no-ff -m "commit_message" dev # 不使用fast forward模式合并dev分支到当前分支
须要注意的是:
git log
或者git log --graph
指令来查看分支与分支合并状况git reset --hard HEAD^ 回退到上一个版本 git reset --hard HEAD^^ 回退到上两个版本 git reset --hard 123456 回退到版本号为123456的版本 git reset --hard commit_id^ 回退到指定commit_id的版本
注意
有的时候,提交推送的时候不想提交某些文件,此时能够在这个项目根目录下新建一个名为.gitignore
的文件,
在这个文件里能够进行配置提交的时候忽略哪些文件,配置使用正则表达式的形式.
好比:
*.py 忽略全部的以py结尾的文件 test/a.* 忽略test目录下全部的以a开头的文件 test/[abc].py 忽略test目录下a.py或b.py或c.py这三个文件 [abc] 忽略根目录下a或b或c这三个文件 test/* 忽略test目录下的全部文件 !test/a.py 忽略test目录下不是a.py之外的全部文件,即只提交a.py这个文件
配置完成后,须要清除本地缓存,而后再次提交.
清除本地缓存的命令:
git rm -f --cached .
git diff # 比较工做区和暂存区全部文件的差别 git diff 3c6fab966158f9 72ec71f3c2aa # 比较两次提交的差别 git diff HEAD HEAD~1 # git上一次提交与上上一次提交的差别 git diff HEAD HEAD^1^1 # git上一次提交与前两次提交的差别 git diff HEAD HEAD~2 # git上一次提交与前两次提交的差别 git diff HEAD HEAD^1 # git上一次提交与上上一次提交的差别 git diff HEAD HEAD^1 -- index.html # git上一次提交与上上一次提交中index.html文件的不一样 git diff -- index.html # 比较工做区和暂存区中的index.html文件的差别 git diff --cached # 修改文件后,把修改的文件添加到暂存区中,查看暂存区和HEAD文件的差别 git diff master dev # 比较master分支和dev分支的差别 git diff master dev -- index.html # 比较index.html文件在master分支和dev分支的差别
两个分支的位置不一样,显示文件的加减是不一样的
git commit --amend # 修改最新提交的commit信息
1.列出全部的提交日志
git log --oneline # 每行显示一条提交记录 git log --pretty=oneline gitk # 图形化显示全部提交记录
2.进入修改交互模式
git rebase -i 版本号
这里的版本号为:要修改提交信息的版本号的上一个版本号。例如:按提交顺序从1到6,若是想修改版本4的提交信息,则此处的版本号应该为第3个版本号
3.进入交互模式后,会有以下提示:
# p, pick <commit> = use commit # r, reword <commit> = use commit, but edit the commit message # e, edit <commit> = use commit, but stop for amending # s, squash <commit> = use commit, but meld into previous commit # f, fixup <commit> = like "squash", but discard this commit's log message # x, exec <command> = run command (the rest of the line) using shell # d, drop <commit> = remove commit # l, label <label> = label current HEAD with a name # t, reset <label> = reset HEAD to a label # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
并列出在进入交互式模式时输入的版本号后的全部提交信息,把想修改的信息以前的pick修改成 r 或者 reword,而后:wq保存并退出
此时会打开想修改的commit的message信息,按vim编辑器的用法修改保存就能够
4.查看修改以后的commit message
git log --oneline
前提是
必需要配置全局用户名和用户邮箱
1.查看全部提交记录
git log --oneline
2.进入git交互式模式
git rebase -i 版本号
这里的版本号为:要修改提交信息的版本号的上一个版本号。例如:按提交顺序从1到6,若是想合并版本4和版本5的提交信息,则此处的版本号应该为第3个版本号
3.进入交互模式后,会有以下提示:
# p, pick <commit> = use commit # r, reword <commit> = use commit, but edit the commit message # e, edit <commit> = use commit, but stop for amending # s, squash <commit> = use commit, but meld into previous commit # f, fixup <commit> = like "squash", but discard this commit's log message # x, exec <command> = run command (the rest of the line) using shell # d, drop <commit> = remove commit # l, label <label> = label current HEAD with a name # t, reset <label> = reset HEAD to a label # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
并列出在进入交互式模式时输入的版本号后的全部提交信息,把被合并的版本号的commit信息前的pick换成 s 或 squash,而后保存并退出
此时会打开合并后的commit提交信息窗口,按vim编辑器的用法修改保存就能够
4.查看修改以后的commit message
git log
能够看到把多个commit合并成一个commit后,全部提交的版本号都改变了
例子:如今有屡次提交的版本号v1,版本号v2,版本号v3,版本号v4,版本号v5,版本号v6,想把v2和v3,v4这三次提交合并成一个新的提交,操做步骤:
git rebase -i v1 在打开的文件中,把v2和v3前面的pick修改为s,而后保存并退出 在新打开的窗口中,把未注释的行的内容修改成合并后想要的新内容,而后保存并退出 使用git log命令查看,就能够看到合并后的提交信息了