Git 使用
git里有四种对象:commit、tree、blob、tag
文件的三种状态:modified(已修改的)→staged(已暂存的)→committed(已经提交的)
git中的分支,本质上仅仅是个指向commit对象的可变指针。HEAD是一个指向你正在工作中的本地分支的指针(注:将HEAD想象为当前分支的别名)。reset 会改变HEAD的引用值!checkout 会移动HEAD!
git commit --amend -m "message" ##追加到上一个提交,commit对象不变
git commit -am "message" ##git add和git commit -m的组合,前提是被改动文件已经是tracked
git stash;do some work;git stash pop
======================================================================
git diff ##查看工作区修改和git库的差别
git diff --stat ##查看工作区和git库简单的diff结果
git diff --cached ##查看暂存区和git库的差别
git diff HEAD ##查看工作区、暂存区和git库的差别
git diff local-branch origin/remote-branch ##比较本地分支和远程分支的不同(均已入库)======================================================================
git push origin HEAD:refs/for/remote-branch ##需要审核
git push origin HEAD:refs/heads/remote-branch ##直接入库
git push origin HEAD:remote-branch ##推送当前分支到远程,名为remote-branch
git push origin :remote-branch ##删除远程分支remote-branch
======================================================================
在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写成HEAD~100。
git reset --hard HEAD^ ##回退到上一个版本:
git reset --hard HEAD~n ##回退到前n个版本:
git checkout file-name ##回退工作区(没有add的)的修改
git reset HEAD fileName ##撤销暂存区(已经git add的)的修改
git reset --hard commit-id 或者 git reset --soft commit-id都会将git log中的commit-id清除!
git reset --hard ##当前HEAD 重置,撤销所有已经修改的,不会留下之前的痕迹。针对已经追踪的文件,没有追踪的文件不影响
git reset --hard origin/remote-branch ##撤销本地修改,与远程分支保持同步
======================================================================
git checkout -b newBranch ##创建并切换分支
git checkout -f branchName ##-f 强行切换
git checkout -b newBranch origin/remoteBranch ##基于远程分支切出本地分支
git branch --set-upstream local-branch origin/remote-branch ##手动指定local-branch追踪origin/remote-branch
git branch -d branch-name ##删除本地分支
git branch -D branch-name ##强制删除本地分支
git branch ##列出本地分支
git branch -r ##列出远程分支
git branch -a ##列出远程和本地分支
git branch -v ##查看本地所有分支的最后一次提交对象的信息
git branch -vv ##查看本地所有分支的最后一次提交和本地分支追踪的远程分支
git branch --merged ##查看所有合并入当前分支的分支
git branch --no-merged ##查看所有未合并入当前分支的分支
git branch newBranch ##创建分支
git branch newBranch tag ##基于tag创建分支
git checkout tag_name ##切换到tag
git tag -f tag_name ##-强制创建替换已经存在的tag
git tag -d tag_name ; git push origin :tag_name ##删除本地/远程tag
git push -f origin tag_name ##强制推送tag
======================================================================
git revert 撤销某次提交,此次提交之前和之后的commit和history都会保留,并且把这次撤销作为一次最新的提交。git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不会影响之前提交的内容。
======================================================================
git rev-parse:
git rev-parse --git-dir ##显示Git版本库的位置(相对路径),例如:
git rev-parse --show-toplevel ##显示当前工作区根目录(即.git目录,绝对路径),例如:
git rev-parse --show-cdup ##显示从当前目录(cd)后退(up)到工作区的根目录的深度,例如:../
git rev-parse --parseopt ##解析命令行参数
git rev-parse --symbolic --branches ##显示所有分支(本地切出的)
git rev-parse --symbolic --tags ##显示里程碑
git rev-parse --symbolic --glob=refs/* ##显示定义的所有引用。其中refs/remotes/目录下的引用称为远程分支(或远程引用)。refs/heads/目录下的引用称为本地分支。refs/tags/目录下的为tag。
git rev-parse HEAD ##显示HEAD对应的SHA1哈希值
======================================================================
git config --global core.editor [编辑器名称] ##设置编辑器,例如:git config -global core.editor vim
git config push.default simple
Git用户名和邮箱是本地git客户端的一个变量,不随git库而改变。每次commit都会用用户名和邮箱纪录。github的contributions统计就是按邮箱来统计的。
1. 查看当前用户名、邮箱及其他配置
git config --list
git config --global --list
2. 配置用户名和邮箱
git config user.name
git config user.email
git config --global user.name
git config --global user.email
修改提交author和email
git commit --amend --author
======================================================================
git pull 和 git fetch:
git fetch:从远程获取最新版本到本地不会自动合并。git pull:从远程获取最新版本并merge到本地。
git fetch origin remote-branch(远程分支名) ##单独拉某个远程分支,并不会在本地创建分支
git pull使用语法:git pull [options] [<repository> [<refspec>…]]
将远程存储库中的更改合并到当前分支中。在默认模式下,git pull是git fetch后跟git merge FETCH_HEAD的缩写。更准确地说,git pull使用给定的参数运行git fetch,并调用git merge将检索到的分支头合并到当前分支中。 使用--rebase,它运行git rebase而不是git merge。
以下是一些示例:
$ git pull <远程主机名> <远程分支名>:<本地分支名>
比如,要取回origin主机的next分支,与本地的master分支合并,需要写成这样:$ git pull origin next:master
如果远程分支(next)要与当前分支合并,则冒号后面的部分可以省略。上面命令可以简写为:$ git pull origin next
该命令表示,取回origin/next分支,再与当前分支合并。实质上,等同于先做git fetch,再执行git merge。即: git fetch origin;git merge origin/next
======================================================================
git remote ##不带选项,列出所有远程主机
git remote -v ##查看远程仓库别名的具体地址
git remote show origin ##加上主机名(origin),可以查看该主机的详细信息
git remote add origin <url> ##添加远程主机
git remote rm origin ##删除远程主机
修改远程仓库地址的方法有3种:
1.修改命令:git remote origin set-url [url]
2.先删后加
3.直接修改config文件
=====================================================================
建空分支方法:
git symbolic-ref HEAD refs/heads/master;rm .git/index;git clean -fdx
git add .;git commit -m "Initial commit"
git push origin HEAD:master
=====================================================================
从Git 版本库的初始化,通常有2种方式:
1)git clone:当你已经有一个远程的Git版本库,只需要在本地克隆一份
例如:git clone url some_project 克隆到本地some_project目录下.
2)git init 和 git remote:本地创建一个工作目录,使用'git init'命令进行初始化,Git以后就会对该目录下的文件进行版本控制。利用'git remote add'命令来增加一个远程服务器端,例如:git remote add origin url
======================================================================
git clean:用来清除工作目录中所有没有tracked过的文件。
用法:
git clean -n:是一次clean的演习, 告诉你哪些文件会被删除. 记住他不会真正的删除文件, 只是一个提醒
git clean -f:删除当前目录下所有没有被track过的文件。他不会删除.gitignore文件里面指定的文件夹和文件, 不管这些文件有没有被track过 (git clean -f <path> 可以指定路径)
git clean -xf:删除当前目录下没有被track过的文件。不管他是否是.gitignore文件里面指定的文件夹和文件
git clean -df:删除当前目录下没有被track过的文件和文件夹
git reset --hard 和 git clean -df是一对好基友,结合使用他们能让你的工作目录完全回退到最近一次commit的时候。记住reset只影响被track过的文件。
git clean对于刚编译过的项目也非常有用.。如, 他能轻易删除掉编译后生成的.o和.exe等文件. 这个在打包要发布一个release的时候非常有用。