git 简介
git是一个分散式版本控制软件,最初由林纳斯·托瓦兹(Linus Torvalds)創作,於2005年以GPL釋出。最初目的是为更好地管理Linux内核开发而设计。
初始版本由Linus大神在两个星期内写出来,之后基本一统文件版本控制的天下。
名词解释
工作区:就是你在电脑里能看到的目录。
暂存区:英文叫stage, 或index。一般存放在”git目录”下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
branch:分支,相当于不同的平行世界
remote:远程仓库
origin:默认的远程仓库名词
HEAD:一个指向当前版本号的指针
环境配置
git config --global user.name yourname
设置用户名,如果不加--global
则只对当前项目生效git config --global user.email youremail
设置邮箱git config --global core.editor vim
设置默认编辑器为vim,可替换为你自己喜欢的git config --global core.quotepath false
显示中文路径名
开始项目
git init
初始化git仓库git clone <repository> [<directory>]
复制项目
管理修改
git status
查看当前仓库状态,绿色为未commit的stage内容,红色为未stage、为添加到版本库内容git show <commit-hash-id|tag_name>
查看某次commit的修改内容git add filename
保存文件修改到暂存区git rm filename
删除工作区的文件和git记录git rm --cached filename
删除暂存区的新文件git diff
查看工作区和暂存区(stage)的不同git diff --cached
比较的是暂存区和版本库的差别git diff HEAD
可以查看工作区和版本库的差别git diff commit1 commit2
比较不同commitgit diff commit1 commit2 -- filepath
比较不同commit指定文件更改git commit
提交暂存区内容到当前分支,会新加一个commitgit commit --amend
追加暂存区内容到当前分支的最近一个commitgit rebase -i HEAD~4
合并最近4个commitgit rebase 目标分支名称
把本分支改动放到目标分支之后
分支与Tag
git branch -a
查看所有分支信息git branch new_branch_name
新建分支git branch -d branch_name
删除分支git branch --set-upstream dev origin/dev
指定本地dev分支与远程origin/dev分支的链接git checkout branch_name
切换到分支头部git checkout tags/tag_name
切换到某个tag对应的版本git checkout -b new_branch_name
新建分支,并切换到新分支git checkout -b dev origin/dev
创建远程origin的dev分支到本地,并切换到新分支git merge dev
合并dev到当前分支,保留commit信息git merge --squash dev
合并dev分枝代码到暂存区,不保留commit信息git tag
查看tag列表git tag tag_name
打taggit tag -d tag_name
删除taggit push --delete origin tagname
删除远程tag
仓库操作
git remote -v
查看远程仓库详细信息git remote add <name> <url>
添加远程仓库git remote rename <old> <new>
重命名远程仓库git remote remove <name>
删除远程仓库git remote set-url [--push] <name> <newurl>
设置远程仓库链接git remote prune origin
清除本地无用remotegit pull
<远程主机名> <远程分支名>:<本地分支名> 从远程仓库更新git fetch git@github.com:ruanimal/Mysite.git
从其他仓库获取代码,但不更新到本地分支git push <远程主机名> <本地分支名>:<远程分支名>
提交到远程仓库git push origin <本地分支名>
将本地分支推送与之存在“追踪关系”的远程分支(通常两者同名)git push
如果当前分支只有一个追踪分支,那么主机名都可以省略。git push -f
强制提交
子模块
git submodule add -b branch {url} [module_name]
. 已有仓库,添加子模块git submodule set-branch --branch master module_name
子模块切换追踪分支到mastergit submodule update --remote
更新子模块代码, 分支和代码与.gitmodules中的配置同步git clone --recursive {url}
. clone代码时,拉取子模块代码git submodule update --init
克隆项目后, 首次拉取子模块代码git rm {submodule_folder}
删除子模块
怎么吃后悔药
git log
查看commit的历史git log -p
git log -p -2
查看最近2次的更新内容git log --graph
命令可以看到分支合并图。git whatchanged filename
显示文件更改的相关commitgit checkout [commit id] -- file
丢弃工作区文件修改git restore filename
丢弃工作区文件修改git reset HEAD filename
可以把暂存区的修改撤销掉(unstage),重新放回工作区git restore --staged filename
可以把暂存区的修改撤销掉(unstage),重新放回工作区git reset –mixed
此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息git reset –soft
回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可git reset –hard
彻底回退到某个版本,本地的源码也会变为上一个版本的内容,若无版本号则回退到最新的版本。git reset [commit-id] -- filename
以commit的版本替换stage的文件git revert [commit-id]
是用一次新的commit来逆向操作之前的commit
其他
git gc
压缩历史信息来节约磁盘和内存空间git <command> --abort
一般用于中断某次操作git cherry-pick <commit_id>
捡取某一个commit到当前分支(包含commit变更的内容和注释)git filter-branch --tree-filter 'rm -f testme.txt' HEAD
从git仓库中永久删除某个文件的历史git rebase -r <commit_id> --exec 'git commit --amend --no-edit --reset-author'
将HEAD到commit_id为止的commit的提交用户信息重置